diff --git a/Assets/CircularGravityForce/CGF.cs b/Assets/CircularGravityForce/CGF.cs new file mode 100644 index 0000000..eda5998 --- /dev/null +++ b/Assets/CircularGravityForce/CGF.cs @@ -0,0 +1,1789 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Core logic for Circular Gravity Force. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; +using System.Linq; +using System.Collections.Generic; +using System.IO; + +#if (UNITY_EDITOR) +using UnityEditor; +#endif + +namespace CircularGravityForce +{ + [AddComponentMenu("Physics/Circular Gravity Force", -1)] + public class CGF : MonoBehaviour + { + #region Events + + public delegate void ApplyCGFEvent(CGF cgf, Rigidbody rigid, Collider coll); + public static event ApplyCGFEvent OnApplyCGFEvent; + + #endregion + + #region Enums + + //Force Types + public enum ForceType + { + ForceAtPosition, + Force, + Torque, + ExplosionForce, + GravitationalAttraction, + } + + //Force Types + public enum Shape + { + Sphere, + Capsule, + Raycast, + Box, + } + + public enum ForcePosition + { + ThisTransform, + ClosestCollider, + } + + #endregion + + #region Classes + + //Manages all transform properties + [System.Serializable] + public class TransformProperties + { + [SerializeField, Tooltip("Used for toggling transform properties.")] + private bool toggleTransformProperties; + public bool ToggleTransformProperties + { + get { return toggleTransformProperties; } + set { toggleTransformProperties = value; } + } + + [SerializeField, Header("Position"), Tooltip("Toggles to override the transforms position.")] + private bool overridePosition = false; + public bool OverridePosition + { + get { return overridePosition; } + set { overridePosition = value; } + } + [SerializeField, Tooltip("Toggles to use local position.")] + private bool localPosition = false; + public bool LocalPosition + { + get { return localPosition; } + set { localPosition = value; } + } + [SerializeField, Tooltip("Override value for the transforms position.")] + private Vector3 positionValue = Vector3.zero; + public Vector3 PositionValue + { + get { return positionValue; } + set { positionValue = value; } + } + + [SerializeField, Header("Rotation"), Tooltip("Toggles to override the transforms rotation.")] + private bool overrideRotation = false; + public bool OverrideRotation + { + get { return overrideRotation; } + set { overrideRotation = value; } + } + [SerializeField, Tooltip("Toggles to use local rotation.")] + private bool localRotation = false; + public bool LocalRotation + { + get { return localRotation; } + set { localRotation = value; } + } + [SerializeField, Tooltip("Override value for the transforms rotation.")] + private Vector3 rotationValue = Vector3.zero; + public Vector3 RotationValue + { + get { return rotationValue; } + set { rotationValue = value; } + } + + //Validate the given transform. + public void ValidateTransform(Transform transform) + { + if (OverridePosition) + { + if (LocalPosition) + { + transform.localPosition = PositionValue; + } + else + { + transform.position = PositionValue; + } + } + + if (OverrideRotation) + { + if (LocalRotation) + { + transform.localRotation = Quaternion.Euler(RotationValue); + } + else + { + transform.rotation = Quaternion.Euler(RotationValue); + } + } + } + } + + //Manages all force position properties + [System.Serializable] + public class ForcePositionProperties + { + [SerializeField, Tooltip("Used for toggling force position properties.")] + private bool toggleForcePositionProperties; + public bool ToggleForcePositionProperties + { + get { return toggleForcePositionProperties; } + set { toggleForcePositionProperties = value; } + } + + [SerializeField, Tooltip("Force position options.")] + private ForcePosition forcePosition = ForcePosition.ThisTransform; + public ForcePosition ForcePosition + { + get { return forcePosition; } + set { forcePosition = value; } + } + + [SerializeField, Tooltip("Colliders for when using 'Closest Collider' for 'Force Position'")] + private List closestColliders; + public List ClosestColliders + { + get { return closestColliders; } + set { closestColliders = value; } + } + + [SerializeField, Tooltip("Finds the closest point on effected object and uses that as the force pivot.")] + private bool useEffectedClosestPoint = false; + public bool UseEffectedClosestPoint + { + get { return useEffectedClosestPoint; } + set { useEffectedClosestPoint = value; } + } + + [SerializeField, Tooltip("Height offset for closest colliders.")] + private float heightOffset = 0f; + public float HeightOffset + { + get { return heightOffset; } + set { heightOffset = value; } + } + + public ForcePositionProperties() + { + ClosestColliders = new List(); + } + } + + //Manages all force type properties + [System.Serializable] + public class ForceTypeProperties + { + [SerializeField, Tooltip("Adjustment to the apparent position of the explosion to make it seem to lift objects.")] + private float explosionForceUpwardsModifier = 0f; + public float ExplosionForceUpwardsModifier + { + get { return explosionForceUpwardsModifier; } + set { explosionForceUpwardsModifier = value; } + } + + [SerializeField, Tooltip("The maximimum angular velocity of the rigidbody.")] + private float torqueMaxAngularVelocity = 7f; + public float TorqueMaxAngularVelocity + { + get { return torqueMaxAngularVelocity; } + set { torqueMaxAngularVelocity = value; } + } + } + + //Manages all filter type properties + [System.Serializable] + public class FilterProperties + { + //Filter effect types + public enum EffectType + { + Effect, + DontEffect, + } + + //Tag filter properties + [System.Serializable] + public class TagFilter + { + [SerializeField, Tooltip("Effect type for tag filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Tag name used for filter options.")] + private string tag = string.Empty; + public string Tag + { + get { return tag; } + set { tag = value; } + } + } + + //GameObject filter properties + [System.Serializable] + public class GameObjectFilter + { + [SerializeField, Tooltip("Effect type for Gameobject filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Gameobject used for filter options.")] + private GameObject gameObject; + public GameObject _gameObject + { + get { return gameObject; } + set { gameObject = value; } + } + } + + //Collider filter properties + [System.Serializable] + public class BoundsFilter + { + [SerializeField, Tooltip("Effect type for bounds collider filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Bound collider used for filter options.")] + private Collider collider; + public Collider _collider + { + get { return collider; } + set { collider = value; } + } + } + + //Physic material filter properties + [System.Serializable] + public class PhysicMaterialFilter + { + [SerializeField, Tooltip("Effect type for physic material filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Physic material used for filter options.")] + private PhysicMaterial physicMaterial; + public PhysicMaterial _physicMaterial + { + get { return physicMaterial; } + set { physicMaterial = value; } + } + } + + // Filter Properties Constructor + public FilterProperties() + { + gameObjectFilter = new List(); + tagFilter = new List(); + boundsFilter = new List(); + physicMaterialFilter = new List(); + } + + [SerializeField, Tooltip("Used to filter out gameobjects, has authority over tags, colliders, physicMaterial, and layermasks.")] + private List gameObjectFilter; + public List _gameObjectFilter + { + get { return gameObjectFilter; } + set { gameObjectFilter = value; } + } + + [SerializeField, Tooltip("Used to filter out tags, has authority over colliders, physicMaterial, and layermasks.")] + private List tagFilter; + public List _tagFilter + { + get { return tagFilter; } + set { tagFilter = value; } + } + + [SerializeField, Tooltip("Used to filter out colliders, has authority over physicMaterial, and layermasks.")] + public List boundsFilter; + public List _boundsFilter + { + get { return boundsFilter; } + set { boundsFilter = value; } + } + + [SerializeField, Tooltip("Used to filter out physic material, has authority over layermasks.")] + public List physicMaterialFilter; + public List _physicMaterialFilter + { + get { return physicMaterialFilter; } + set { physicMaterialFilter = value; } + } + + [SerializeField, Tooltip("Used for fildering LayerMasks.")] + private LayerMask layerMaskFilter = -1; + public LayerMask _layerMaskFilter + { + get { return layerMaskFilter; } + set { layerMaskFilter = value; } + } + + //ValidateFilters all filter options + public bool ValidateFilters(Rigidbody rigid, Collider coll) + { + bool value = true; + + if (_gameObjectFilter.Count > 0) + { + for (int i = 0; i < _gameObjectFilter.Count; i++) + { + switch (_gameObjectFilter[i]._effectType) + { + case EffectType.Effect: + if (_gameObjectFilter[i]._gameObject == rigid.gameObject) + { + return true; + } + break; + case EffectType.DontEffect: + if (_gameObjectFilter[i]._gameObject == rigid.gameObject) + { + return false; + } + break; + } + } + } + + if (_tagFilter.Count > 0) + { + for (int i = 0; i < _tagFilter.Count; i++) + { + switch (_tagFilter[i]._effectType) + { + case EffectType.Effect: + if (rigid.transform.gameObject.CompareTag(_tagFilter[i].Tag)) + { + return true; + } + break; + case EffectType.DontEffect: + if (rigid.transform.gameObject.CompareTag(_tagFilter[i].Tag)) + { + return false; + } + break; + } + } + } + + if (_boundsFilter.Count > 0) + { + for (int i = 0; i < _boundsFilter.Count; i++) + { + switch (_boundsFilter[i]._effectType) + { + case EffectType.Effect: + if (_boundsFilter[i]._collider.bounds.Contains(rigid.position)) + { + return true; + } + break; + case EffectType.DontEffect: + if (_boundsFilter[i]._collider.bounds.Contains(rigid.position)) + { + return false; + } + break; + } + } + } + + if (_physicMaterialFilter.Count > 0) + { + for (int i = 0; i < _physicMaterialFilter.Count; i++) + { + switch (_physicMaterialFilter[i]._effectType) + { + case EffectType.Effect: + if (_physicMaterialFilter[i]._physicMaterial == coll.sharedMaterial) + { + return true; + } + break; + case EffectType.DontEffect: + if (_physicMaterialFilter[i]._physicMaterial == coll.sharedMaterial) + { + return false; + } + break; + } + } + } + + if (((1 << rigid.transform.gameObject.layer) & _layerMaskFilter) != 0) + { + value = true; + } + else if (((1 << rigid.transform.gameObject.layer) & _layerMaskFilter) == 0) + { + value = false; + } + + return value; + } + } + + //Manages all event properties + [System.Serializable] + public class EventProperties + { + [SerializeField, Tooltip("Used for toggling event properties.")] + private bool toggleEventProperties; + public bool ToggleEventProperties + { + get { return toggleEventProperties; } + set { toggleEventProperties = value; } + } + + [SerializeField, Tooltip("Enables delegate / events.")] + private bool enableEvents = true; + public bool EnableEvents + { + get { return enableEvents; } + set { enableEvents = value; } + } + + [SerializeField, Tooltip("Enables SendMessage. Syntax:'void OnApplyCGF(CircularGravityForce.CGF cgf)'")] + private bool enableSendMessage = false; + public bool EnableSendMessage + { + get { return enableSendMessage; } + set { enableSendMessage = value; } + } + } + + //Draw gravity properties + [System.Serializable] + public class DrawGravityProperties + { + [SerializeField, Header("Runtime"), Tooltip("Enable/Disables drawing gravity force lines.")] + private bool drawGravityForce = false; + public bool DrawGravityForce + { + get { return drawGravityForce; } + set { drawGravityForce = value; } + } + + [SerializeField, Tooltip("Thinkness of the line drawn.")] + private float thickness = 0.05f; + public float Thickness + { + get { return thickness; } + set { thickness = value; } + } + + [SerializeField, Tooltip("Material on line.")] + private Material gravityLineMaterial; + public Material GravityLineMaterial + { + get { return gravityLineMaterial; } + set { gravityLineMaterial = value; } + } + + + + [SerializeField, Header("Editor"), Tooltip("Enable/Disables unity editor gizmo for CGF.")] + private bool drawGizmo = true; + public bool DrawGizmo + { + get { return drawGizmo; } + set { drawGizmo = value; } + } + + //Used to see gravity area from gizmos + private bool drawGravityForceGizmos = true; + public bool DrawGravityForceGizmos + { + get { return drawGravityForceGizmos; } + set { drawGravityForceGizmos = value; } + } + } + + //Draw gravity properties + [System.Serializable] + public class MemoryProperties + { + [SerializeField, Tooltip("Layer mask for all effected colliders.")] + private LayerMask colliderLayerMask = -1; + public LayerMask ColliderLayerMask + { + get { return colliderLayerMask; } + set { colliderLayerMask = value; } + } + + [SerializeField, Tooltip("Used for toggling memory properties.")] + private bool toggleMemoryProperties; + public bool ToggleMemoryProperties + { + get { return toggleMemoryProperties; } + set { toggleMemoryProperties = value; } + } + + [SerializeField, Tooltip("See affected colliders in gizmo.")] + private bool seeColliders = false; + public bool SeeColliders + { + get { return seeColliders; } + set { seeColliders = value; } + } + + [SerializeField, Tooltip("See affected raycasthits in gizmo.")] + private bool seeRaycastHits = false; + public bool SeeRaycastHits + { + get { return seeRaycastHits; } + set { seeRaycastHits = value; } + } + + [SerializeField, Tooltip("Use Non-Alloc physics.")] + private bool nonAllocPhysics = false; + public bool NonAllocPhysics + { + get { return nonAllocPhysics; } + set { nonAllocPhysics = value; } + } + + [SerializeField, Tooltip("Collider buffer size for the Non-Alloc 'Sphere' and 'Box' types.")] + private int colliderBuffer = 100; + public int ColliderBuffer + { + get { return colliderBuffer; } + set { colliderBuffer = value; } + } + + [SerializeField, Tooltip("RaycastHit buffer size for the Non-Alloc 'Capsule' and 'Raycast' shapes.")] + private int raycastHitBuffer = 100; + public int RaycastHitBuffer + { + get { return raycastHitBuffer; } + set { raycastHitBuffer = value; } + } + } + + #endregion + + #region Properties/Constructor + + public CGF() + { + _transformProperties = new TransformProperties(); + _forcePositionProperties = new ForcePositionProperties(); + _forceTypeProperties = new ForceTypeProperties(); + _filterProperties = new FilterProperties(); + _eventProperties = new EventProperties(); + _drawGravityProperties = new DrawGravityProperties(); + _memoryProperties = new MemoryProperties(); + } + + //Used for when wanting to see the cgf line + static private string CirularGravityLineName = "CirularGravityForce_LineDisplay"; + +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + //Warning message for Requiring Unity 5.6 + static public string WarningMessageClosestPoint_5_6 = "Force Position Properties Closest Collider Requires Upgrading Project to Unity 5.6 or Higher."; +#endif + +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + //Warning message for Requiring Unity 5.3 + static public string WarningMessageNonAllocUnity_5_3 = "3D Non-Alloc Physics Requires Upgrading Project to Unity 5.3 or Higher."; + static public string WarningMessageBoxUnity_5_3 = "3D Box Shape Physics Requires Upgrading Project to Unity 5.3 or Higher."; +#endif + + [SerializeField, Tooltip("Enable/Disable the Circular Gravity Force.")] + private bool enable = true; + public bool Enable + { + get { return enable; } + set { enable = value; } + } + + [SerializeField, Tooltip("Shape of the Cirular Gravity Force.")] + private Shape shape = CGF.Shape.Sphere; + public Shape _shape + { + get { return shape; } + set { shape = value; } + } + + [SerializeField, Tooltip("The force type of the Cirular Gravity Force.")] + private ForceType forceType = ForceType.ForceAtPosition; + public ForceType _forceType + { + get { return forceType; } + set { forceType = value; } + } + + [SerializeField, Tooltip("Option for how to apply a force.")] + private ForceMode forceMode = ForceMode.Force; + public ForceMode _forceMode + { + get { return forceMode; } + set { forceMode = value; } + } + + [SerializeField, Tooltip("Projects the force to the forward.")] + private bool projectForward = false; + public bool _projectForward + { + get { return projectForward; } + set { projectForward = value; } + } + + [SerializeField, Tooltip("Radius of the force.")] + private float size = 5f; + public float Size + { + get { return size; } + set { size = value; } + } + + [SerializeField, Tooltip("Capsule Radius size of the fore.")] + private float capsuleRadius = 2f; + public float CapsuleRadius + { + get { return capsuleRadius; } + set { capsuleRadius = value; } + } + + [SerializeField, Tooltip("Box vector size of the fore.")] + private Vector3 boxSize = new Vector3(5f, 5f, 5f); + public Vector3 BoxSize + { + get { return boxSize; } + set { boxSize = value; } + } + + [SerializeField, Tooltip("Power for the force, can be negative or positive.")] + private float forcePower = 10f; + public float ForcePower + { + get { return forcePower; } + set { forcePower = value; } + } + + [SerializeField, Tooltip("Velocity damping on effected rigidbodys.")] + private float velocityDamping = 0f; + public float VelocityDamping + { + get { return velocityDamping; } + set { velocityDamping = value; } + } + + [SerializeField, Tooltip("Angular velocity damping on effected rigidbodys.")] + private float angularVelocityDamping = 0f; + public float AngularVelocityDamping + { + get { return angularVelocityDamping; } + set { angularVelocityDamping = value; } + } + + [SerializeField, Tooltip("Manages all transform properties.")] + private TransformProperties transformProperties; + public TransformProperties _transformProperties + { + get { return transformProperties; } + set { transformProperties = value; } + } + + [SerializeField, Tooltip("Options for where you want the force to start. Only available 'Force At Position', 'Explosion Force', and 'Gravitational Attraction' force types.")] + private ForcePositionProperties forcePositionProperties; + public ForcePositionProperties _forcePositionProperties + { + get { return forcePositionProperties; } + set { forcePositionProperties = value; } + } + + [SerializeField, Tooltip("Force type properties.")] + private ForceTypeProperties forceTypeProperties; + public ForceTypeProperties _forceTypeProperties + { + get { return forceTypeProperties; } + set { forceTypeProperties = value; } + } + + [SerializeField, Tooltip("Filter properties options.")] + private FilterProperties filterProperties; + public FilterProperties _filterProperties + { + get { return filterProperties; } + set { filterProperties = value; } + } + + [SerializeField, Tooltip("Event properties options.")] + private EventProperties eventProperties; + public EventProperties _eventProperties + { + get { return eventProperties; } + set { eventProperties = value; } + } + + [SerializeField, Tooltip("Draw gravity properties.")] + private DrawGravityProperties drawGravityProperties; + public DrawGravityProperties _drawGravityProperties + { + get { return drawGravityProperties; } + set { drawGravityProperties = value; } + } + + [SerializeField, Tooltip("Memory Properties.")] + private MemoryProperties memoryProperties; + public MemoryProperties _memoryProperties + { + get { return memoryProperties; } + set { memoryProperties = value; } + } + + [SerializeField] + private int colliderListCount; + public int ColliderListCount + { + get { return colliderListCount; } + } + [SerializeField] + private int raycastHitListCount; + public int RaycastHitListCount + { + get { return raycastHitListCount; } + } + + //Selected Flag + bool isSelected = false; + + //Line Object + private GameObject cirularGravityLine; + + //Pre-Allocated Objects + private Collider[] colliderList; + private RaycastHit[] raycastHitList; + + Color DebugGravityLineColorA; + Color DebugGravityLineColorB; + + #endregion + + #region Gizmos + + //Used for draying icons + void OnDrawGizmos() + { + if (_drawGravityProperties.DrawGizmo) + { +#if (UNITY_EDITOR) + string icon = "CircularGravityForce Icons/"; + icon = SetupIcons(icon); + SetupDebugColors(); + + isSelected = CheckGameObjects(); + + if (isSelected) + { + if (!EditorApplication.isPlaying && (_shape != Shape.Box) && (_shape != Shape.Sphere)) + { + _drawGravityProperties.DrawGravityForceGizmos = false; + } + else + { + _drawGravityProperties.DrawGravityForceGizmos = true; + } + } + else + { + Gizmos.DrawIcon(this.transform.position, icon, true); + + _drawGravityProperties.DrawGravityForceGizmos = true; + } +#endif + if (_drawGravityProperties.DrawGravityForceGizmos) + { + DrawGravityForceGizmos(); + } + + DrawClosetColliderGizmos(); + } + } + +#if (UNITY_EDITOR) + bool CheckGameObjects() + { + if (Selection.activeGameObject == this.gameObject) + return true; + + foreach (var item in Selection.gameObjects) + { + if (item == this.gameObject) + return true; + } + + return false; + } + + string SetupIcons(string icon) + { + string cgfDir = string.Format("{0}/ResurgamStudios/CircularGravityForce Package/Gizmos/CircularGravityForce Icons/", Application.dataPath); + string dir = string.Format("{0}/Gizmos/CircularGravityForce Icons/", Application.dataPath); + + if (!Directory.Exists(dir)) + { + if (Directory.Exists(cgfDir)) + { + CopyIcons(cgfDir, dir); + + AssetDatabase.Refresh(); + } + } + + icon = icon + "cgf_icon"; + + if (forcePower == 0 || enable == false) + { + icon = icon + "0.png"; + } + else if (forcePower >= 0) + { + icon = icon + "1.png"; + } + else if (forcePower < 0) + { + icon = icon + "2.png"; + } + + return icon; + } + + //Copys all cgf icons + void CopyIcons(string sourceDir, string targetDir) + { + Directory.CreateDirectory(targetDir); + + foreach (var file in Directory.GetFiles(sourceDir).Where(s => s.EndsWith(".png"))) + { + File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file))); + } + } +#endif + + #endregion + + #region Unity Events + + void Awake() + { + if (_memoryProperties.NonAllocPhysics) + { + colliderList = new Collider[_memoryProperties.ColliderBuffer]; + raycastHitList = new RaycastHit[_memoryProperties.RaycastHitBuffer]; + } + } + + //Update is called once per frame + void Update() + { + if (Enable) + { + //Sets up the line that gets rendered showing the area of forces + if (_drawGravityProperties.DrawGravityForce) + { + if (cirularGravityLine == null) + { + //Creates line for showing the force + cirularGravityLine = new GameObject(CirularGravityLineName); + cirularGravityLine.transform.SetParent(this.gameObject.transform, false); + cirularGravityLine.AddComponent(); + } + } + else + { + if (cirularGravityLine != null) + { + //Destroys line when not using + Destroy(cirularGravityLine); + } + } + } + else + { + if (cirularGravityLine != null) + { + //Destroys line when not using + Destroy(cirularGravityLine); + } + } + } + + //Used for when drawing the cgf line with no lag + void LateUpdate() + { + if (Enable) + { + //Validates the this.transform rotation and position + _transformProperties.ValidateTransform(this.transform); + + //Sets up the line that gets rendered showing the area of forces + if (_drawGravityProperties.DrawGravityForce) + { + if (cirularGravityLine != null) + { + DrawGravityForceLineRenderer(); + } + } + } + } + + //This function is called every fixed frame + void FixedUpdate() + { + if (Enable && forcePower != 0) + { + CalculateAndEstimateForce(); + } + } + + #endregion + + #region Functions + + //Applys the force function + private void ApplyForce(Rigidbody rigid, Transform trans, Collider coll) + { + var transPos = trans.position; + + switch (_forcePositionProperties.ForcePosition) + { + case ForcePosition.ThisTransform: + break; + case ForcePosition.ClosestCollider: + if (_forcePositionProperties.ClosestColliders != null) + { + if (_forcePositionProperties.ClosestColliders.Count > 0) + { + float heightOffset = _forcePositionProperties.HeightOffset; + + if (!_forcePositionProperties.UseEffectedClosestPoint) + { + var point = FindClosestPoints(rigid.position, _forcePositionProperties.ClosestColliders); + + transPos = GetVectorHeightOffset(point, rigid.position, heightOffset); + } + else + { + Vector3 pointA = FindClosestPoints(coll.transform.position, _forcePositionProperties.ClosestColliders); + Vector3 pointB = FindClosestPoints(pointA, coll); + + float distanceThisA = Vector3.Distance(coll.transform.position, pointA); + float distanceAB = Vector3.Distance(pointA, pointB); + + transPos = GetVectorHeightOffset(pointA, coll.transform.position, Mathf.Abs(distanceThisA - distanceAB) + heightOffset); + } + + } + } + break; + } + + switch (_forceType) + { + case ForceType.ForceAtPosition: + ApplyCGFForceAtPosition(rigid, transPos, trans); + break; + case ForceType.Force: + ApplyCGFForce(rigid, transPos, trans); + break; + case ForceType.Torque: + ApplyCGFTorque(rigid, transPos, trans); + break; + case ForceType.ExplosionForce: + ApplyCGFExplosionForce(rigid, transPos, trans); + break; + case ForceType.GravitationalAttraction: + ApplyCGFGravitationalAttraction(rigid, transPos, trans); + break; + } + } + + private void ApplyCGFForceAtPosition(Rigidbody rigid, Vector3 transPos, Transform trans) + { + Vector3 forceAtPoint = transPos; + + if (_projectForward || _shape == Shape.Raycast) + { + forceAtPoint = (trans.forward * ForcePower) - (VelocityDamping * rigid.velocity); + } + else + { + forceAtPoint = ((rigid.transform.position - transPos) * ForcePower) - (VelocityDamping * rigid.velocity); + } + + rigid.AddForceAtPosition(forceAtPoint, transPos, _forceMode); + } + + private void ApplyCGFForce(Rigidbody rigid, Vector3 transPos, Transform trans) + { + Vector3 force = transPos; + + if (_projectForward || _shape == Shape.Raycast) + { + force = (trans.forward * ForcePower) - (VelocityDamping * rigid.velocity); + } + else + { + force = ((rigid.transform.position - transPos) * ForcePower) - (VelocityDamping * rigid.velocity); + } + + rigid.AddForce(force, _forceMode); + } + + private void ApplyCGFTorque(Rigidbody rigid, Vector3 transPos, Transform trans) + { + Vector3 torque = transPos; + + torque = (trans.right * ForcePower) - (AngularVelocityDamping * rigid.angularVelocity); + + rigid.maxAngularVelocity = _forceTypeProperties.TorqueMaxAngularVelocity; + rigid.AddTorque(torque, _forceMode); + } + + private void ApplyCGFExplosionForce(Rigidbody rigid, Vector3 transPos, Transform trans) + { + rigid.AddExplosionForce(ForcePower, transPos, Size, _forceTypeProperties.ExplosionForceUpwardsModifier, _forceMode); + } + + private void ApplyCGFGravitationalAttraction(Rigidbody rigid, Vector3 transPos, Transform trans) + { + Vector3 gravitationalAttraction = transPos; + + if (_projectForward || _shape == Shape.Raycast) + { + gravitationalAttraction = trans.forward * rigid.mass * ForcePower / (trans.forward).sqrMagnitude - (VelocityDamping * rigid.velocity); + } + else + { + gravitationalAttraction = ((rigid.position - transPos).normalized * rigid.mass * ForcePower / (rigid.position - transPos).sqrMagnitude) - (VelocityDamping * rigid.velocity); + } + + if (float.IsNaN(gravitationalAttraction.x) && float.IsNaN(gravitationalAttraction.y) && float.IsNaN(gravitationalAttraction.z)) + { + gravitationalAttraction = Vector3.zero; + } + + rigid.AddForce(gravitationalAttraction, _forceMode); + } + + //Calculate and Estimate the force + private void CalculateAndEstimateForce() + { + if (_shape == Shape.Sphere || _shape == Shape.Box) + { + #region Sphere + + colliderListCount = 0; + + if (_shape == Shape.Sphere) + { + if (_memoryProperties.NonAllocPhysics) + { +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + colliderListCount = Physics.OverlapSphereNonAlloc(this.transform.position, Size, colliderList, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); +#else + Debug.LogWarning(WarningMessageNonAllocUnity_5_3); +#endif + } + else + { + colliderList = Physics.OverlapSphere(this.transform.position, Size, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); + colliderListCount = colliderList.Length; + } + } + if (_shape == Shape.Box) + { +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + if (_memoryProperties.NonAllocPhysics) + { + colliderListCount = Physics.OverlapBoxNonAlloc(this.transform.position, BoxSize, colliderList, this.transform.rotation, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); + } + else + { + colliderList = Physics.OverlapBox(this.transform.position, BoxSize, this.transform.rotation, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); + colliderListCount = colliderList.Length; + } +#else + Debug.LogWarning(WarningMessageBoxUnity_5_3); +#endif + } + + for (int i = 0; i < colliderListCount; i++) + { + if (colliderList[i] != null) + { + if (!colliderList[i].isTrigger) + { + var rigid = colliderList[i].attachedRigidbody; + + if (rigid != null) + { + if (_filterProperties.ValidateFilters(rigid, colliderList[i])) + { + ApplyForce(rigid, this.transform, colliderList[i]); + + //Enables send message & events + if (eventProperties.EnableEvents) + { + if (OnApplyCGFEvent != null) + { + OnApplyCGFEvent.Invoke(this, rigid, colliderList[i]); + } + } + if (eventProperties.EnableSendMessage) + { + rigid.SendMessage("OnApplyCGF", this, SendMessageOptions.DontRequireReceiver); + } + } + } + } + } + } + + #endregion + } + else + { + #region RayCast / Capsule + + //Circular Gravity Force Transform + Transform cgfTran = this.transform; + + raycastHitListCount = 0; + + if (_shape == Shape.Raycast) + { + if (_memoryProperties.NonAllocPhysics) + { +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + raycastHitListCount = Physics.RaycastNonAlloc(cgfTran.position, cgfTran.rotation * Vector3.forward, raycastHitList, Size, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); +#else + Debug.LogWarning(WarningMessageNonAllocUnity_5_3); +#endif + } + else + { + raycastHitList = Physics.RaycastAll(cgfTran.position, cgfTran.rotation * Vector3.forward, Size, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); + raycastHitListCount = raycastHitList.Length; + } + } + else if (_shape == Shape.Capsule) + { + if (_memoryProperties.NonAllocPhysics) + { +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + raycastHitListCount = Physics.CapsuleCastNonAlloc(cgfTran.position, cgfTran.position + ((cgfTran.rotation * Vector3.back)), capsuleRadius, cgfTran.position - ((cgfTran.position + (cgfTran.rotation * (Vector3.back)))), raycastHitList, Size, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); +#else + Debug.LogWarning(WarningMessageNonAllocUnity_5_3); +#endif + } + else + { + raycastHitList = Physics.CapsuleCastAll(cgfTran.position, cgfTran.position + ((cgfTran.rotation * Vector3.back)), capsuleRadius, cgfTran.position - ((cgfTran.position + (cgfTran.rotation * (Vector3.back)))), Size, _memoryProperties.ColliderLayerMask, QueryTriggerInteraction.Ignore); + raycastHitListCount = raycastHitList.Length; + } + } + + for (int i = 0; i < raycastHitListCount; i++) + { + if (raycastHitList[i].collider != null) + { + if (!raycastHitList[i].collider.isTrigger) + { + var rigid = raycastHitList[i].collider.attachedRigidbody; + + if (rigid != null) + { + if (_filterProperties.ValidateFilters(rigid, raycastHitList[i].collider)) + { + ApplyForce(rigid, this.transform, raycastHitList[i].collider); + + //Enables send message & events + if (eventProperties.EnableEvents) + { + if (OnApplyCGFEvent != null) + { + OnApplyCGFEvent.Invoke(this, rigid, raycastHitList[i].collider); + } + } + if (eventProperties.EnableSendMessage) + { + rigid.SendMessage("OnApplyCGF", this, SendMessageOptions.DontRequireReceiver); + } + } + } + } + } + } + + #endregion + } + } + + public Vector3 FindClosestPoints(Vector3 point, List closestColliders) + { + Vector3 closestPoint = new Vector3(Mathf.Infinity, Mathf.Infinity, Mathf.Infinity); + + if (closestColliders.Count > 0) + { + for (int i = 0; i < closestColliders.Count; i++) + { + if (closestColliders[i] != null) + { + if (closestColliders[i].gameObject.activeSelf && closestColliders[i].enabled) + { + var distance = Vector3.Distance(point, closestPoint); + + var newPoint = FindClosestPoints(point, closestColliders[i]); + + if (distance > Vector3.Distance(point, newPoint)) + { + closestPoint = newPoint; + } + } + } + } + } + + return closestPoint; + } + + public Vector3 FindClosestPoints(Vector3 point, Collider closestCollider) + { + Vector3 closestPoint = new Vector3(Mathf.Infinity, Mathf.Infinity, Mathf.Infinity); + + if (closestCollider != null) + { + var distance = Vector3.Distance(point, closestPoint); + + var newPoint = point; + +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + // newPoint = Physics.ClosestPoint(point, closestCollider, closestCollider.transform.position, closestCollider.transform.rotation); + newPoint = closestCollider.ClosestPointOnBounds(point); +#else + Debug.LogWarning(WarningMessageClosestPoint_5_6); +#endif + + if (distance > Vector3.Distance(point, newPoint)) + { + closestPoint = newPoint; + } + } + else + { + closestPoint = point; + } + + return closestPoint; + } + + public Vector3 GetVectorHeightOffset(Vector3 A, Vector3 B, float x) + { + Vector3 P = x * Vector3.Normalize(B - A) + A; + return P; + } + + #endregion + + #region Static Functions + + //Static function used to create CGFs + public static GameObject CreateCGF() + { + //Creates empty gameobject. + GameObject cgf = new GameObject(); + + //Sets gameojbect Name + cgf.name = "CGF"; + + //Creates Circular Gravity Force component + cgf.AddComponent()._drawGravityProperties.GravityLineMaterial = new Material(Shader.Find("GUI/Text Shader")); + + return cgf; + } + + #endregion + + #region Draw + + //Draws effected area by forces line renderer + private void DrawGravityForceLineRenderer() + { + //Circular Gravity Force Transform + Transform cgfTran = this.transform; + + Color DebugGravityLineColor; + + if (Enable) + { + if (forcePower == 0) + DebugGravityLineColor = Color.white; + else if (forcePower > 0) + DebugGravityLineColor = Color.green; + else + DebugGravityLineColor = Color.red; + } + else + { + DebugGravityLineColor = Color.white; + } + + //Line setup + LineRenderer lineRenderer = cirularGravityLine.GetComponent(); +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) + lineRenderer.startWidth = _drawGravityProperties.Thickness; + lineRenderer.endWidth = _drawGravityProperties.Thickness; + lineRenderer.numCornerVertices = 4; +#else + lineRenderer.SetWidth(_drawGravityProperties.Thickness, _drawGravityProperties.Thickness); +#endif + lineRenderer.material = _drawGravityProperties.GravityLineMaterial; + lineRenderer.material.color = DebugGravityLineColor; + + //Renders type outline + switch (_shape) + { + case Shape.Sphere: + + //Models line +// #if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) +// lineRenderer.positionCount = 12; +// #elif (UNITY_5_5) + lineRenderer.numPositions = 12; +// #else +// lineRenderer.SetVertexCount(12); +// #endif + + lineRenderer.SetPosition(0, cgfTran.position + ((cgfTran.rotation * Vector3.up) * Size)); + lineRenderer.SetPosition(1, cgfTran.position); + lineRenderer.SetPosition(2, cgfTran.position + ((cgfTran.rotation * Vector3.down) * Size)); + lineRenderer.SetPosition(3, cgfTran.position); + lineRenderer.SetPosition(4, cgfTran.position + ((cgfTran.rotation * Vector3.left) * Size)); + lineRenderer.SetPosition(5, cgfTran.position); + lineRenderer.SetPosition(6, cgfTran.position + ((cgfTran.rotation * Vector3.right) * Size)); + lineRenderer.SetPosition(7, cgfTran.position); + lineRenderer.SetPosition(8, cgfTran.position + ((cgfTran.rotation * Vector3.forward) * Size)); + lineRenderer.SetPosition(9, cgfTran.position); + lineRenderer.SetPosition(10, cgfTran.position + ((cgfTran.rotation * Vector3.back) * Size)); + lineRenderer.SetPosition(11, cgfTran.position); + + break; + + case Shape.Capsule: + + //Models line +// #if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) +// lineRenderer.positionCount = 17; +// #elif (UNITY_5_5) + lineRenderer.numPositions = 17; +// #else +// lineRenderer.SetVertexCount(17); +// #endif + + //Starting Point + lineRenderer.SetPosition(0, cgfTran.position + ((cgfTran.rotation * Vector3.up) * capsuleRadius)); + lineRenderer.SetPosition(1, cgfTran.position); + lineRenderer.SetPosition(2, cgfTran.position + ((cgfTran.rotation * Vector3.down) * capsuleRadius)); + lineRenderer.SetPosition(3, cgfTran.position); + lineRenderer.SetPosition(4, cgfTran.position + ((cgfTran.rotation * Vector3.left) * capsuleRadius)); + lineRenderer.SetPosition(5, cgfTran.position); + lineRenderer.SetPosition(6, cgfTran.position + ((cgfTran.rotation * Vector3.right) * capsuleRadius)); + lineRenderer.SetPosition(7, cgfTran.position); + + //Middle Line + Vector3 endPointLoc = cgfTran.position + ((cgfTran.rotation * Vector3.forward) * Size); + lineRenderer.SetPosition(8, endPointLoc); + + //End Point + lineRenderer.SetPosition(9, endPointLoc + ((cgfTran.rotation * Vector3.up) * capsuleRadius)); + lineRenderer.SetPosition(10, endPointLoc); + lineRenderer.SetPosition(11, endPointLoc + ((cgfTran.rotation * Vector3.down) * capsuleRadius)); + lineRenderer.SetPosition(12, endPointLoc); + lineRenderer.SetPosition(13, endPointLoc + ((cgfTran.rotation * Vector3.left) * capsuleRadius)); + lineRenderer.SetPosition(14, endPointLoc); + lineRenderer.SetPosition(15, endPointLoc + ((cgfTran.rotation * Vector3.right) * capsuleRadius)); + lineRenderer.SetPosition(16, endPointLoc); + + break; + + case Shape.Raycast: + + //Models line +// #if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) +// lineRenderer.positionCount = 2; +// #elif (UNITY_5_5) + lineRenderer.numPositions = 2; +// #else +// lineRenderer.SetVertexCount(2); +// #endif + + lineRenderer.SetPosition(0, cgfTran.position); + lineRenderer.SetPosition(1, cgfTran.position + ((cgfTran.rotation * Vector3.forward) * Size)); + + break; + + case Shape.Box: + + //Models line +// #if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) +// lineRenderer.positionCount = 12; +// #elif (UNITY_5_5) + lineRenderer.numPositions = 12; +// #else +// lineRenderer.SetVertexCount(12); +// #endif + + lineRenderer.SetPosition(0, cgfTran.position + ((cgfTran.rotation * Vector3.up) * BoxSize.y)); + lineRenderer.SetPosition(1, cgfTran.position); + lineRenderer.SetPosition(2, cgfTran.position + ((cgfTran.rotation * Vector3.down) * BoxSize.y)); + lineRenderer.SetPosition(3, cgfTran.position); + lineRenderer.SetPosition(4, cgfTran.position + ((cgfTran.rotation * Vector3.left) * BoxSize.x)); + lineRenderer.SetPosition(5, cgfTran.position); + lineRenderer.SetPosition(6, cgfTran.position + ((cgfTran.rotation * Vector3.right) * BoxSize.x)); + lineRenderer.SetPosition(7, cgfTran.position); + lineRenderer.SetPosition(8, cgfTran.position + ((cgfTran.rotation * Vector3.forward) * BoxSize.z)); + lineRenderer.SetPosition(9, cgfTran.position); + lineRenderer.SetPosition(10, cgfTran.position + ((cgfTran.rotation * Vector3.back) * BoxSize.z)); + lineRenderer.SetPosition(11, cgfTran.position); + + break; + } + } + + //Sets up the gizmo colors for CGF for the editor + private void SetupDebugColors() + { + if (Enable) + { + if (forcePower == 0) + { + DebugGravityLineColorA = Color.white; + DebugGravityLineColorB = Color.white; + } + else if (forcePower > 0) + { + DebugGravityLineColorA = Color.green; + DebugGravityLineColorB = Color.green; + } + else + { + DebugGravityLineColorA = Color.red; + DebugGravityLineColorB = Color.red; + } + } + else + { + DebugGravityLineColorA = Color.white; + DebugGravityLineColorB = Color.white; + } + + DebugGravityLineColorA.a = .5f; + DebugGravityLineColorB.a = .1f; + } + + //Draws effected area by forces with debug draw line, so you can see it in Gizmos + private void DrawGravityForceGizmos() + { + //Circular Gravity Force Transform + Transform cgfTran = this.transform; + + //Renders type outline + switch (_shape) + { + case CGF.Shape.Sphere: + + Gizmos.color = DebugGravityLineColorB; + Gizmos.DrawSphere(cgfTran.position, Size); + + if (!isSelected) + { + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.up) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.down) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.left) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.right) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.forward) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.back) * Size), cgfTran.position); + } + else + { + Gizmos.color = DebugGravityLineColorB; + Gizmos.DrawSphere(cgfTran.position, Size); + } + + + break; + + case CGF.Shape.Capsule: + + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.up) * capsuleRadius), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.down) * capsuleRadius), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.left) * capsuleRadius), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.right) * capsuleRadius), cgfTran.position); + + Vector3 endPointLoc = cgfTran.position + ((cgfTran.rotation * Vector3.forward) * Size); + + Gizmos.DrawLine(cgfTran.position, endPointLoc); + + Gizmos.DrawLine(endPointLoc + ((cgfTran.rotation * Vector3.up) * capsuleRadius), endPointLoc); + Gizmos.DrawLine(endPointLoc + ((cgfTran.rotation * Vector3.down) * capsuleRadius), endPointLoc); + Gizmos.DrawLine(endPointLoc + ((cgfTran.rotation * Vector3.left) * capsuleRadius), endPointLoc); + Gizmos.DrawLine(endPointLoc + ((cgfTran.rotation * Vector3.right) * capsuleRadius), endPointLoc); + + break; + + case CGF.Shape.Raycast: + + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.forward) * Size), cgfTran.position); + + break; + + case CGF.Shape.Box: + + Matrix4x4 cubeTransform = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one * 2); + Matrix4x4 oldGizmosMatrix = Gizmos.matrix; + + Gizmos.matrix *= cubeTransform; + + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawWireCube(Vector3.zero, BoxSize); + + if (isSelected) + DebugGravityLineColorA.a = 1f; + + if (isSelected) + { + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawWireCube(Vector3.zero, BoxSize); + } + + Gizmos.color = DebugGravityLineColorB; + Gizmos.DrawCube(Vector3.zero, BoxSize); + + if (isSelected) + Gizmos.DrawCube(Vector3.zero, BoxSize); + + Gizmos.matrix = oldGizmosMatrix; + + if (!isSelected) + { + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.up) * BoxSize.y), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.down) * BoxSize.y), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.left) * BoxSize.x), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.right) * BoxSize.x), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.forward) * BoxSize.z), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.back) * BoxSize.z), cgfTran.position); + } + + break; + } + + if (memoryProperties.SeeColliders) + { + if (_shape == Shape.Sphere || _shape == Shape.Box) + { + if (ForcePower != 0) + { + for (int i = 0; i < ColliderListCount; i++) + { + if (isSelected) + { + Gizmos.color = DebugGravityLineColorA; + DebugGravityLineColorA.a = 1f; + } + Gizmos.DrawLine(this.transform.position, colliderList[i].gameObject.transform.position); + } + } + } + } + + if (memoryProperties.SeeRaycastHits) + { + if (_shape == Shape.Capsule || _shape == Shape.Raycast) + { + if (ForcePower != 0) + { + for (int i = 0; i < RaycastHitListCount; i++) + { + if (isSelected) + { + Gizmos.color = DebugGravityLineColorA; + DebugGravityLineColorA.a = 1f; + } + Gizmos.DrawLine(this.transform.position, raycastHitList[i].collider.gameObject.transform.position); + } + } + } + } + + if (_forcePositionProperties.ForcePosition == ForcePosition.ClosestCollider) + { + switch (_forceType) + { + case ForceType.ForceAtPosition: + case ForceType.Force: + case ForceType.ExplosionForce: + case ForceType.GravitationalAttraction: + + Gizmos.color = DebugGravityLineColorA; + if (_shape == Shape.Sphere || _shape == Shape.Box) + { + for (int i = 0; i < ColliderListCount; i++) + { + if (colliderList != null) + { + if (colliderList.Length > 0) + { + var rigidCheck = colliderList[i].attachedRigidbody; + if (rigidCheck != null) + { + if (_filterProperties.ValidateFilters(rigidCheck, colliderList[i])) + { + Vector3 pointA = FindClosestPoints(colliderList[i].transform.position, _forcePositionProperties.ClosestColliders); + Vector3 pointB = Vector3.zero; + + if (_forcePositionProperties.UseEffectedClosestPoint) + { + pointB = FindClosestPoints(pointA, colliderList[i]); + } + else + { + pointB = colliderList[i].transform.position; + } + + Gizmos.DrawWireSphere(pointA, .01f); + Gizmos.DrawLine(pointA, pointB); + Gizmos.DrawWireSphere(pointB, .01f); + } + } + } + } + } + } + + if (_shape == Shape.Capsule || _shape == Shape.Raycast) + { + for (int i = 0; i < RaycastHitListCount; i++) + { + if (raycastHitList != null) + { + if (raycastHitList.Length > 0) + { + var rigidCheck = raycastHitList[i].collider.attachedRigidbody; + if (rigidCheck != null) + { + if (_filterProperties.ValidateFilters(rigidCheck, raycastHitList[i].collider)) + { + Vector3 pointA = FindClosestPoints(raycastHitList[i].collider.transform.position, _forcePositionProperties.ClosestColliders); + Vector3 pointB = Vector3.zero; + + if (_forcePositionProperties.UseEffectedClosestPoint) + { + pointB = FindClosestPoints(pointA, raycastHitList[i].collider); + } + else + { + pointB = raycastHitList[i].collider.transform.position; + } + + Gizmos.DrawWireSphere(pointA, .01f); + Gizmos.DrawLine(pointA, pointB); + Gizmos.DrawWireSphere(pointB, .01f); + } + } + } + } + } + } + + break; + case ForceType.Torque: + break; + default: + break; + } + } + } + + //Draws CGF bounds for ClosestCollider + private void DrawClosetColliderGizmos() + { + if (!isSelected) + return; + + Gizmos.color = DebugGravityLineColorA; + + if (_forcePositionProperties.ForcePosition == CGF.ForcePosition.ClosestCollider) + { + for (int i = 0; i < _forcePositionProperties.ClosestColliders.Count; i++) + { + if (_forcePositionProperties.ClosestColliders[i] != null) + { + var meshFilter = _forcePositionProperties.ClosestColliders[i].gameObject.GetComponent(); + if (meshFilter != null) + { + var mesh = meshFilter.sharedMesh; + + if (mesh != null) + { + Gizmos.DrawWireMesh(mesh, meshFilter.gameObject.transform.position, meshFilter.gameObject.transform.rotation, meshFilter.gameObject.transform.lossyScale); + } + } + else + { + var bound = _forcePositionProperties.ClosestColliders[i].bounds; + Gizmos.DrawWireCube(bound.center, bound.size); + } + } + } + } + } + + #endregion + } +} diff --git a/Assets/CircularGravityForce/CGF.cs.meta b/Assets/CircularGravityForce/CGF.cs.meta new file mode 100644 index 0000000..cf107c6 --- /dev/null +++ b/Assets/CircularGravityForce/CGF.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 87af34050099e304aa6a8c92272087e3 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: ba43097a61014ab44a2382800df70049, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/CGF2D.cs b/Assets/CircularGravityForce/CGF2D.cs new file mode 100644 index 0000000..b0a394e --- /dev/null +++ b/Assets/CircularGravityForce/CGF2D.cs @@ -0,0 +1,1428 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Core logic for Circular Gravity Force for 2D. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; +using System.Linq; +using System.Collections.Generic; +using System.IO; + +#if (UNITY_EDITOR) +using UnityEditor; +#endif + +namespace CircularGravityForce +{ + [AddComponentMenu("Physics 2D/Circular Gravity Force 2D", -1)] + public class CGF2D : MonoBehaviour + { + #region Events + + public delegate void ApplyCGFEvent(CGF2D cgf, Rigidbody2D rigid, Collider2D coll); + public static event ApplyCGFEvent OnApplyCGFEvent; + + #endregion + + #region Enums + + //Force Types + public enum ForceType2D + { + ForceAtPosition, + Force, + Torque, + GravitationalAttraction + } + + //Force Types + public enum Shape2D + { + Sphere, + Raycast, + Box + } + + #endregion + + #region Classes + + //Manages all force position properties + [System.Serializable] + public class ForcePositionProperties + { + [SerializeField, Tooltip("Used for toggling force position properties.")] + private bool toggleForcePositionProperties; + public bool ToggleForcePositionProperties + { + get { return toggleForcePositionProperties; } + set { toggleForcePositionProperties = value; } + } + + [SerializeField, Tooltip("Force position options.")] + private CGF.ForcePosition forcePosition = CGF.ForcePosition.ThisTransform; + public CGF.ForcePosition ForcePosition + { + get { return forcePosition; } + set { forcePosition = value; } + } + + [SerializeField, Tooltip("Colliders for when using 'Closest Collider' for 'Force Position'")] + private List closestColliders; + public List ClosestColliders + { + get { return closestColliders; } + set { closestColliders = value; } + } + + [SerializeField, Tooltip("Finds the closest point on effected object and uses that as the force pivot.")] + private bool useEffectedClosestPoint = false; + public bool UseEffectedClosestPoint + { + get { return useEffectedClosestPoint; } + set { useEffectedClosestPoint = value; } + } + + [SerializeField, Tooltip("Height offset for closest colliders.")] + private float heightOffset = 0f; + public float HeightOffset + { + get { return heightOffset; } + set { heightOffset = value; } + } + + public ForcePositionProperties() + { + ClosestColliders = new List(); + } + } + + //Manages all filter type properties + [System.Serializable] + public class FilterProperties + { + //Filter effect types + public enum EffectType + { + Effect, + DontEffect, + } + + //Tag filter properties + [System.Serializable] + public class TagFilter + { + [SerializeField, Tooltip("Effect type for tag filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Tag name used for filter options.")] + private string tag = string.Empty; + public string Tag + { + get { return tag; } + set { tag = value; } + } + } + + //GameObject filter properties + [System.Serializable] + public class GameObjectFilter + { + [SerializeField, Tooltip("Effect type for Gameobject filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Gameobject used for filter options.")] + private GameObject gameObject; + public GameObject _gameObject + { + get { return gameObject; } + set { gameObject = value; } + } + } + + //Collider filter properties + [System.Serializable] + public class BoundsFilter + { + [SerializeField, Tooltip("Effect type for bounds collider filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Bound collider used for filter options.")] + private Collider2D collider; + public Collider2D _collider + { + get { return collider; } + set { collider = value; } + } + } + + //Physic material filter properties + [System.Serializable] + public class PhysicMaterialFilter + { + [SerializeField, Tooltip("Effect type for physic material filter options.")] + private EffectType effectType = EffectType.Effect; + public EffectType _effectType + { + get { return effectType; } + set { effectType = value; } + } + + [SerializeField, Tooltip("Physic material used for filter options.")] + private PhysicsMaterial2D physicMaterial; + public PhysicsMaterial2D _physicMaterial + { + get { return physicMaterial; } + set { physicMaterial = value; } + } + } + + // Filter Properties Constructor + public FilterProperties() + { + gameObjectFilter = new List(); + tagFilter = new List(); + boundsFilter = new List(); + physicMaterialFilter = new List(); + } + + [SerializeField, Tooltip("Used to filter out gameobjects, has authority over tags, colliders, physicMaterial, and layermasks.")] + private List gameObjectFilter; + public List _gameObjectFilter + { + get { return gameObjectFilter; } + set { gameObjectFilter = value; } + } + + [SerializeField, Tooltip("Used to filter out tags, has authority over colliders, physicMaterial, and layermasks.")] + private List tagFilter; + public List _tagFilter + { + get { return tagFilter; } + set { tagFilter = value; } + } + + [SerializeField, Tooltip("Used to filter out collider bounds, has authority over physicMaterial, and layermasks.")] + public List boundsFilter; + public List _boundsFilter + { + get { return boundsFilter; } + set { boundsFilter = value; } + } + + [SerializeField, Tooltip("Used to filter out physic material, has authority over layermasks.")] + public List physicMaterialFilter; + public List _physicMaterialFilter + { + get { return physicMaterialFilter; } + set { physicMaterialFilter = value; } + } + + [SerializeField, Tooltip("Used for fildering LayerMasks.")] + private LayerMask layerMaskFilter = -1; + public LayerMask _layerMaskFilter + { + get { return layerMaskFilter; } + set { layerMaskFilter = value; } + } + + //ValidateFilters all filter options + public bool ValidateFilters(Rigidbody2D rigid, Collider2D coll) + { + bool value = true; + + if (_gameObjectFilter.Count > 0) + { + for (int i = 0; i < _gameObjectFilter.Count; i++) + { + switch (_gameObjectFilter[i]._effectType) + { + case EffectType.Effect: + if (_gameObjectFilter[i]._gameObject == rigid.gameObject) + { + return true; + } + break; + case EffectType.DontEffect: + if (_gameObjectFilter[i]._gameObject == rigid.gameObject) + { + return false; + } + break; + } + } + } + + if (_tagFilter.Count > 0) + { + for (int i = 0; i < _tagFilter.Count; i++) + { + switch (_tagFilter[i]._effectType) + { + case EffectType.Effect: + if (rigid.transform.gameObject.CompareTag(_tagFilter[i].Tag)) + { + return true; + } + break; + case EffectType.DontEffect: + if (rigid.transform.gameObject.CompareTag(_tagFilter[i].Tag)) + { + return false; + } + break; + } + } + } + + if (_boundsFilter.Count > 0) + { + for (int i = 0; i < _boundsFilter.Count; i++) + { + switch (_boundsFilter[i]._effectType) + { + case EffectType.Effect: + if (_boundsFilter[i]._collider.bounds.Contains(rigid.position)) + { + return true; + } + break; + case EffectType.DontEffect: + if (_boundsFilter[i]._collider.bounds.Contains(rigid.position)) + { + return false; + } + break; + } + } + } + + if (_physicMaterialFilter.Count > 0) + { + for (int i = 0; i < _physicMaterialFilter.Count; i++) + { + switch (_physicMaterialFilter[i]._effectType) + { + case EffectType.Effect: + if (_physicMaterialFilter[i]._physicMaterial == coll.sharedMaterial) + { + return true; + } + break; + case EffectType.DontEffect: + if (_physicMaterialFilter[i]._physicMaterial == coll.sharedMaterial) + { + return false; + } + break; + } + } + } + + if (((1 << rigid.transform.gameObject.layer) & _layerMaskFilter) != 0) + { + value = true; + } + else if (((1 << rigid.transform.gameObject.layer) & _layerMaskFilter) == 0) + { + value = false; + } + + return value; + } + } + + //Trigger Area Filter + [System.Serializable] + public class TriggerAreaFilter2D + { + //Trigger Options + public enum TriggerAreaFilterOptions + { + Disabled, + OnlyAffectWithinTigger, + DontAffectWithinTigger, + } + + [SerializeField, Tooltip("Trigger area filter options.")] + private TriggerAreaFilterOptions triggerAreaFilterOptions = TriggerAreaFilterOptions.Disabled; + public TriggerAreaFilterOptions _triggerAreaFilterOptions + { + get { return triggerAreaFilterOptions; } + set { triggerAreaFilterOptions = value; } + } + + [SerializeField, Tooltip("Listed triggers used for the filter.")] + private List triggerAreas; + public List TriggerAreas + { + get { return triggerAreas; } + set { triggerAreas = value; } + } + } + + #endregion + + #region Properties/Constructor + + public CGF2D() + { + _transformProperties = new CGF.TransformProperties(); + _forcePositionProperties = new ForcePositionProperties(); + _filterProperties = new FilterProperties(); + _eventProperties = new CGF.EventProperties(); + _drawGravityProperties = new CGF.DrawGravityProperties(); + _memoryProperties = new CGF.MemoryProperties(); + } + + //Used for when wanting to see the cgf line + static private string CirularGravityLineName = "CirularGravityForce_LineDisplay"; + +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + //Warning message for Requiring Unity 5.3 + static private string WarningMessageBoxUnity_5_3 = "2D Box Shape Physics Requires Upgrading Project to Unity 5.3 or Higher."; +#endif + + [SerializeField, Tooltip("Enable/Disable the Circular Gravity Force.")] + private bool enable = true; + public bool Enable + { + get { return enable; } + set { enable = value; } + } + + [SerializeField, Tooltip("Shape of the Cirular Gravity Force.")] + private Shape2D shape2D = Shape2D.Sphere; + public Shape2D _shape2D + { + get { return shape2D; } + set { shape2D = value; } + } + + [SerializeField, Tooltip("The force type of the Cirular Gravity Force.")] + private ForceType2D forceType2D = ForceType2D.ForceAtPosition; + public ForceType2D _forceType2D + { + get { return forceType2D; } + set { forceType2D = value; } + } + + [SerializeField, Tooltip("Option for how to apply a force.")] + private ForceMode2D forceMode2D = ForceMode2D.Force; + public ForceMode2D _forceMode2D + { + get { return forceMode2D; } + set { forceMode2D = value; } + } + + [SerializeField, Tooltip("Projects the force to the right.")] + private bool projectRight = false; + public bool _projectRight + { + get { return projectRight; } + set { projectRight = value; } + } + + [SerializeField, Tooltip("Radius of the force.")] + private float size = 5f; + public float Size + { + get { return size; } + set { size = value; } + } + + [SerializeField, Tooltip("Radius of the force.")] + private Vector2 boxSize = Vector2.one * 5f; + public Vector2 BoxSize + { + get { return boxSize; } + set { boxSize = value; } + } + + [SerializeField, Tooltip("Power for the force, can be negative or positive.")] + private float forcePower = 10f; + public float ForcePower + { + get { return forcePower; } + set { forcePower = value; } + } + + [SerializeField, Tooltip("Velocity damping on effected rigidbodys.")] + private float velocityDamping = 0f; + public float VelocityDamping + { + get { return velocityDamping; } + set { velocityDamping = value; } + } + + [SerializeField, Tooltip("Angular velocity damping on effected rigidbodys.")] + private float angularVelocityDamping = 0f; + public float AngularVelocityDamping + { + get { return angularVelocityDamping; } + set { angularVelocityDamping = value; } + } + + [SerializeField, Tooltip("Manages all transform properties.")] + private CGF.TransformProperties transformProperties; + public CGF.TransformProperties _transformProperties + { + get { return transformProperties; } + set { transformProperties = value; } + } + + [SerializeField, Tooltip("Options for where you want the force to start. Only available 'Force At Position', 'Explosion Force', and 'Gravitational Attraction' force types.")] + private ForcePositionProperties forcePositionProperties; + public ForcePositionProperties _forcePositionProperties + { + get { return forcePositionProperties; } + set { forcePositionProperties = value; } + } + + [SerializeField, Tooltip("Filter properties options.")] + private FilterProperties filterProperties; + public FilterProperties _filterProperties + { + get { return filterProperties; } + set { filterProperties = value; } + } + + [SerializeField, Tooltip("Event properties options.")] + private CGF.EventProperties eventProperties; + public CGF.EventProperties _eventProperties + { + get { return eventProperties; } + set { eventProperties = value; } + } + + [SerializeField, Tooltip("Draw gravity properties.")] + private CGF.DrawGravityProperties drawGravityProperties; + public CGF.DrawGravityProperties _drawGravityProperties + { + get { return drawGravityProperties; } + set { drawGravityProperties = value; } + } + + [SerializeField, Tooltip("Memory Properties.")] + private CGF.MemoryProperties memoryProperties; + public CGF.MemoryProperties _memoryProperties + { + get { return memoryProperties; } + set { memoryProperties = value; } + } + + [SerializeField] + private int colliderListCount; + public int ColliderListCount + { + get { return colliderListCount; } + } + [SerializeField] + private int raycastHitListCount; + public int RaycastHitListCount + { + get { return raycastHitListCount; } + } + + //Selected Flag + bool isSelected = false; + + //Line Object + private GameObject cirularGravityLine; + + //Effected Rigidbodys + Collider2D[] colliderList; + RaycastHit2D[] raycastHitList; + + Color DebugGravityLineColorA; + Color DebugGravityLineColorB; + + #endregion + + #region Gizmos + + //Used for draying icons + void OnDrawGizmos() + { + if (_drawGravityProperties.DrawGizmo) + { +#if (UNITY_EDITOR) + string icon = "CircularGravityForce Icons/"; + icon = SetupIcons(icon); + SetupDebugColors(); + + isSelected = CheckGameObjects(); + + if (isSelected) + { + if (!EditorApplication.isPlaying && (_shape2D != Shape2D.Box)) + { + _drawGravityProperties.DrawGravityForceGizmos = false; + } + else + { + _drawGravityProperties.DrawGravityForceGizmos = true; + } + } + else + { + Gizmos.DrawIcon(this.transform.position, icon, true); + + _drawGravityProperties.DrawGravityForceGizmos = true; + } +#endif + if (_drawGravityProperties.DrawGravityForceGizmos) + { + DrawGravityForceGizmos(); + } + + DrawClosetColliderGizmos(); + } + } + +#if (UNITY_EDITOR) + bool CheckGameObjects() + { + if (Selection.activeGameObject == this.gameObject) + return true; + + foreach (var item in Selection.gameObjects) + { + if (item == this.gameObject) + return true; + } + + return false; + } + + string SetupIcons(string icon) + { + string cgfDir = string.Format("{0}/ResurgamStudios/CircularGravityForce Package/Gizmos/CircularGravityForce Icons/", Application.dataPath); + string dir = string.Format("{0}/Gizmos/CircularGravityForce Icons/", Application.dataPath); + + if (!Directory.Exists(dir)) + { + if (Directory.Exists(cgfDir)) + { + CopyIcons(cgfDir, dir); + + AssetDatabase.Refresh(); + } + } + + icon = icon + "cgf_icon"; + + if (forcePower == 0 || enable == false) + { + icon = icon + "0.png"; + } + else if (forcePower >= 0) + { + icon = icon + "1.png"; + } + else if (ForcePower < 0) + { + icon = icon + "2.png"; + } + + return icon; + } + + //Copys all cgf icons + void CopyIcons(string sourceDir, string targetDir) + { + Directory.CreateDirectory(targetDir); + + foreach (var file in Directory.GetFiles(sourceDir).Where(s => s.EndsWith(".png"))) + { + File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file))); + } + } +#endif + + #endregion + + #region Unity Events + + void Awake() + { + if (_memoryProperties.NonAllocPhysics) + { + colliderList = new Collider2D[_memoryProperties.ColliderBuffer]; + raycastHitList = new RaycastHit2D[_memoryProperties.RaycastHitBuffer]; + } + } + + //Update is called once per frame + void Update() + { + if (Enable) + { + //Sets up the line that gets rendered showing the area of forces + if (_drawGravityProperties.DrawGravityForce) + { + if (cirularGravityLine == null) + { + //Creates line for showing the force + cirularGravityLine = new GameObject(CirularGravityLineName); + cirularGravityLine.transform.SetParent(this.gameObject.transform, false); + cirularGravityLine.AddComponent(); + } + } + else + { + if (cirularGravityLine != null) + { + //Destroys line when not using + Destroy(cirularGravityLine); + } + } + } + else + { + if (cirularGravityLine != null) + { + //Destroys line when not using + Destroy(cirularGravityLine); + } + } + } + + //Used for when drawing the cgf line with no lag + void LateUpdate() + { + if (Enable) + { + //Validates the this.transform rotation and position + _transformProperties.ValidateTransform(this.transform); + + //Sets up the line that gets rendered showing the area of forces + if (_drawGravityProperties.DrawGravityForce) + { + if (cirularGravityLine != null) + { + DrawGravityForceLineRenderer(); + } + } + } + } + + //This function is called every fixed frame + void FixedUpdate() + { + if (Enable && ForcePower != 0) + { + CalculateAndEstimateForce(); + } + } + + #endregion + + #region Functions + + //Applys the force function + private void ApplyForce(Rigidbody2D rigid, Transform trans, Collider2D coll) + { + var transPos = trans.position; + + switch (_forcePositionProperties.ForcePosition) + { + case CGF.ForcePosition.ThisTransform: + break; + case CGF.ForcePosition.ClosestCollider: + if (_forcePositionProperties.ClosestColliders != null) + { + if (_forcePositionProperties.ClosestColliders.Count > 0) + { + float heightOffset = _forcePositionProperties.HeightOffset; + + if (!_forcePositionProperties.UseEffectedClosestPoint) + { + var point = FindClosestPoints(coll, _forcePositionProperties.ClosestColliders, false); + + transPos = GetVectorHeightOffset(point, coll.transform.position, heightOffset); + } + else + { + Vector3 pointA = FindClosestPoints(coll, _forcePositionProperties.ClosestColliders, false); + Vector3 pointB = FindClosestPoints(coll, _forcePositionProperties.ClosestColliders, true); + + float distanceThisA = Vector3.Distance(coll.transform.position, pointA); + float distanceAB = Vector3.Distance(pointA, pointB); + + transPos = GetVectorHeightOffset(pointA, coll.transform.position, Mathf.Abs(distanceThisA - distanceAB) + heightOffset); + } + + } + } + break; + } + + switch (_forceType2D) + { + //TODO: Add infinity check + case ForceType2D.ForceAtPosition: + ApplyCGFForceAtPosition(rigid, transPos, trans); + break; + case ForceType2D.Force: + ApplyCGFForce(rigid, transPos, trans); + break; + case ForceType2D.Torque: + ApplyCGFTorque(rigid, transPos, trans); + break; + case ForceType2D.GravitationalAttraction: + ApplyCGFGravitationalAttraction(rigid, transPos, trans); + break; + } + } + + private void ApplyCGFForceAtPosition(Rigidbody2D rigid, Vector3 transPos, Transform trans) + { + Vector3 velocity = new Vector3(rigid.velocity.x, rigid.velocity.y, 0f); + + Vector3 forceAtPoint = transPos; + + if (_projectRight || _shape2D == Shape2D.Raycast) + { + forceAtPoint = ((trans.right) * ForcePower) - (VelocityDamping * velocity); + } + else + { + forceAtPoint = ((rigid.gameObject.transform.position - transPos) * ForcePower) - (VelocityDamping * velocity); + } + + rigid.AddForceAtPosition(forceAtPoint, transPos, _forceMode2D); + } + + private void ApplyCGFForce(Rigidbody2D rigid, Vector3 transPos, Transform trans) + { + Vector3 velocity = new Vector3(rigid.velocity.x, rigid.velocity.y, 0f); + + if (_projectRight || _shape2D == Shape2D.Raycast) + { + rigid.AddForce(((trans.right) * ForcePower) - (VelocityDamping * velocity), _forceMode2D); + } + else + { + rigid.AddForce(((rigid.transform.position - transPos) * ForcePower) - (VelocityDamping * velocity), _forceMode2D); + } + } + + private void ApplyCGFTorque(Rigidbody2D rigid, Vector3 transPos, Transform trans) + { + rigid.AddTorque(-(ForcePower + ((rigid.angularVelocity * AngularVelocityDamping) * Time.deltaTime)), _forceMode2D); + } + + private void ApplyCGFGravitationalAttraction(Rigidbody2D rigid, Vector3 transPos, Transform trans) + { + Vector3 velocity = new Vector3(rigid.velocity.x, rigid.velocity.y, 0f); + + if (_projectRight || _shape2D == Shape2D.Raycast) + { + Vector3 gravitationalAttraction = (trans.right).normalized * rigid.mass * ForcePower / (trans.right).sqrMagnitude; + + if (float.IsNaN(gravitationalAttraction.x) && float.IsNaN(gravitationalAttraction.y) && float.IsNaN(gravitationalAttraction.z)) + { + gravitationalAttraction = Vector3.zero; + } + + rigid.AddForce(gravitationalAttraction - (VelocityDamping * velocity), _forceMode2D); + } + else + { + Vector3 gravitationalAttraction = (rigid.gameObject.transform.position - transPos).normalized * rigid.mass * ForcePower / (rigid.gameObject.transform.position - transPos).sqrMagnitude; + + if (float.IsNaN(gravitationalAttraction.x) && float.IsNaN(gravitationalAttraction.y) && float.IsNaN(gravitationalAttraction.z)) + { + gravitationalAttraction = Vector3.zero; + } + + rigid.AddForce(gravitationalAttraction - (VelocityDamping * velocity), _forceMode2D); + } + } + + //Calculate and Estimate the force + private void CalculateAndEstimateForce() + { + if (_shape2D == Shape2D.Sphere) + { + #region Sphere + + colliderListCount = 0; + + if (_shape2D == Shape2D.Sphere) + { + if (_memoryProperties.NonAllocPhysics) + { + colliderListCount = Physics2D.OverlapCircleNonAlloc(this.transform.position, Size, colliderList, _memoryProperties.ColliderLayerMask); + } + else + { + colliderList = Physics2D.OverlapCircleAll(this.transform.position, Size, _memoryProperties.ColliderLayerMask); + colliderListCount = colliderList.Length; + } + } + + for (int i = 0; i < colliderListCount; i++) + { + if (colliderList[i] != null) + { + if (!colliderList[i].isTrigger) + { + var rigid = colliderList[i].attachedRigidbody; + + if (rigid != null) + { + if (_filterProperties.ValidateFilters(rigid, colliderList[i])) + { + ApplyForce(rigid, this.transform, colliderList[i]); + + //Enables send message & events + if (eventProperties.EnableEvents) + { + if (OnApplyCGFEvent != null) + { + OnApplyCGFEvent.Invoke(this, rigid, colliderList[i]); + } + } + if (eventProperties.EnableSendMessage) + { + rigid.SendMessage("OnApplyCGF", this, SendMessageOptions.DontRequireReceiver); + } + } + } + } + } + } + + #endregion + } + else + { + #region RayCast + + //Circular Gravity Force Transform + Transform cgfTran = this.transform; + + raycastHitListCount = 0; + + if (_shape2D == Shape2D.Raycast) + { + if (_memoryProperties.NonAllocPhysics) + { + raycastHitListCount = Physics2D.RaycastNonAlloc(cgfTran.position, cgfTran.rotation * Vector3.right, raycastHitList, Size, _memoryProperties.ColliderLayerMask); + } + else + { + raycastHitList = Physics2D.RaycastAll(cgfTran.position, cgfTran.rotation * Vector3.right, Size, _memoryProperties.ColliderLayerMask); + raycastHitListCount = raycastHitList.Length; + } + } + + if (_shape2D == Shape2D.Box) + { +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + if (_memoryProperties.NonAllocPhysics) + { + raycastHitListCount = Physics2D.BoxCastNonAlloc(this.transform.position, new Vector2(boxSize.x * 2, boxSize.y * 2), this.transform.eulerAngles.z, Vector3.zero, raycastHitList, _memoryProperties.ColliderLayerMask); + } + else + { + raycastHitList = Physics2D.BoxCastAll(this.transform.position, new Vector2(boxSize.x * 2, boxSize.y * 2), this.transform.eulerAngles.z, Vector3.zero, _memoryProperties.ColliderLayerMask); + raycastHitListCount = raycastHitList.Length; + } +#else + Debug.LogWarning(WarningMessageBoxUnity_5_3); +#endif + } + + for (int i = 0; i < raycastHitListCount; i++) + { + if (raycastHitList[i].collider != null) + { + if (!raycastHitList[i].collider.isTrigger) + { + var rigid = raycastHitList[i].collider.attachedRigidbody; + + if (rigid != null) + { + if (_filterProperties.ValidateFilters(rigid, raycastHitList[i].collider)) + { + ApplyForce(rigid, this.transform, raycastHitList[i].collider); + + //Enables send message & events + if (eventProperties.EnableEvents) + { + if (OnApplyCGFEvent != null) + { + OnApplyCGFEvent.Invoke(this, rigid, raycastHitList[i].collider); + } + } + if (eventProperties.EnableSendMessage) + { + rigid.SendMessage("OnApplyCGF", this, SendMessageOptions.DontRequireReceiver); + } + } + } + } + } + } + + #endregion + } + } + + public Vector3 FindClosestPoints(Collider2D point, List closestColliders, bool findClosestPoint) + { + Vector3 closestPoint = new Vector3(Mathf.Infinity, Mathf.Infinity, Mathf.Infinity); + + if (closestColliders.Count > 0) + { + for (int i = 0; i < closestColliders.Count; i++) + { + if (closestColliders[i] != null) + { + if (closestColliders[i].gameObject.activeSelf && closestColliders[i].enabled) + { + var distance = Vector3.Distance(point.transform.position, closestPoint); + + var newPoint = FindClosestPoints(point, closestColliders[i], findClosestPoint); + + if (distance > Vector3.Distance(point.transform.position, newPoint)) + { + closestPoint = newPoint; + } + } + } + } + } + + return closestPoint; + } + + public Vector3 FindClosestPoints(Collider2D point, Collider2D closestCollider, bool findClosestPoint) + { + Vector3 closestPoint = new Vector3(Mathf.Infinity, Mathf.Infinity, Mathf.Infinity); + + if (closestCollider != null) + { + var distance = Vector3.Distance(point.transform.position, closestPoint); + + var newPoint = point.transform.position; + +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + // if (!findClosestPoint) + // newPoint = point.Distance(closestCollider).pointB; + // else + // newPoint = point.Distance(closestCollider).pointA; +#else + Debug.LogWarning(CGF.WarningMessageClosestPoint_5_6); +#endif + + if (distance > Vector3.Distance(point.transform.position, newPoint)) + { + closestPoint = newPoint; + } + } + else + { + closestPoint = point.transform.position; + } + + return closestPoint; + } + + public Vector3 GetVectorHeightOffset(Vector3 A, Vector3 B, float x) + { + Vector3 P = x * Vector3.Normalize(B - A) + A; + return P; + } + + #endregion + + #region Static Functions + + //Static function used to create CGFs + public static GameObject CreateCGF() + { + //Creates empty gameobject. + GameObject cgf = new GameObject(); + + //Sets gameojbect Name + cgf.name = "CGF 2D"; + + //Creates Circular Gravity Force component + cgf.AddComponent()._drawGravityProperties.GravityLineMaterial = new Material(Shader.Find("GUI/Text Shader")); + + return cgf; + } + + #endregion + + #region Draw + + //Draws effected area by forces line renderer + private void DrawGravityForceLineRenderer() + { + //Circular Gravity Force Transform + Transform cgfTran = this.transform; + + Color DebugGravityLineColor; + + if (Enable) + { + if (ForcePower == 0) + DebugGravityLineColor = Color.white; + else if (ForcePower > 0) + DebugGravityLineColor = Color.green; + else + DebugGravityLineColor = Color.red; + } + else + { + DebugGravityLineColor = Color.white; + } + + //Line setup + LineRenderer lineRenderer = cirularGravityLine.GetComponent(); +#if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) + lineRenderer.startWidth = _drawGravityProperties.Thickness; + lineRenderer.endWidth = _drawGravityProperties.Thickness; + lineRenderer.numCornerVertices = 4; +#else + lineRenderer.SetWidth(_drawGravityProperties.Thickness, _drawGravityProperties.Thickness); +#endif + lineRenderer.material = _drawGravityProperties.GravityLineMaterial; + lineRenderer.material.color = DebugGravityLineColor; + + //Renders type outline + switch (_shape2D) + { + case Shape2D.Sphere: + + //Models line +// #if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) +// lineRenderer.positionCount = 8; +// #elif (UNITY_5_5) + lineRenderer.numPositions = 8; +// #else +// lineRenderer.SetVertexCount(8); +// #endif + + lineRenderer.SetPosition(0, cgfTran.position + ((cgfTran.rotation * Vector3.up) * Size)); + lineRenderer.SetPosition(1, cgfTran.position); + lineRenderer.SetPosition(2, cgfTran.position + ((cgfTran.rotation * Vector3.down) * Size)); + lineRenderer.SetPosition(3, cgfTran.position); + lineRenderer.SetPosition(4, cgfTran.position + ((cgfTran.rotation * Vector3.left) * Size)); + lineRenderer.SetPosition(5, cgfTran.position); + lineRenderer.SetPosition(6, cgfTran.position + ((cgfTran.rotation * Vector3.right) * Size)); + lineRenderer.SetPosition(7, cgfTran.position); + + break; + + case Shape2D.Raycast: + + //Models line +// #if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) +// lineRenderer.positionCount = 2; +// #elif (UNITY_5_5) + lineRenderer.numPositions = 2; +// #else +// lineRenderer.SetVertexCount(2); +// #endif + + lineRenderer.SetPosition(0, cgfTran.position); + lineRenderer.SetPosition(1, cgfTran.position + ((cgfTran.rotation * Vector3.right) * Size)); + + break; + + + case Shape2D.Box: + + //Models line +// #if !(UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4) +// lineRenderer.positionCount = 8; +// #elif (UNITY_5_5) + lineRenderer.numPositions = 8; +// #else +// lineRenderer.SetVertexCount(8); +// #endif + + lineRenderer.SetPosition(0, cgfTran.position + ((cgfTran.rotation * Vector3.up) * BoxSize.y)); + lineRenderer.SetPosition(1, cgfTran.position); + lineRenderer.SetPosition(2, cgfTran.position + ((cgfTran.rotation * Vector3.down) * BoxSize.y)); + lineRenderer.SetPosition(3, cgfTran.position); + lineRenderer.SetPosition(4, cgfTran.position + ((cgfTran.rotation * Vector3.left) * BoxSize.x)); + lineRenderer.SetPosition(5, cgfTran.position); + lineRenderer.SetPosition(6, cgfTran.position + ((cgfTran.rotation * Vector3.right) * BoxSize.x)); + lineRenderer.SetPosition(7, cgfTran.position); + + break; + } + } + + //Sets up the gizmo colors for CGF for the editor + private void SetupDebugColors() + { + if (Enable) + { + if (forcePower == 0) + { + DebugGravityLineColorA = Color.white; + DebugGravityLineColorB = Color.white; + } + else if (forcePower > 0) + { + DebugGravityLineColorA = Color.green; + DebugGravityLineColorB = Color.green; + } + else + { + DebugGravityLineColorA = Color.red; + DebugGravityLineColorB = Color.red; + } + } + else + { + DebugGravityLineColorA = Color.white; + DebugGravityLineColorB = Color.white; + } + + DebugGravityLineColorA.a = .5f; + DebugGravityLineColorB.a = .1f; + } + + //Draws effected area by forces with debug draw line, so you can see it in Gizmos + private void DrawGravityForceGizmos() + { + //Circular Gravity Force Transform + Transform cgfTran = this.transform; + + //Renders type outline + switch (_shape2D) + { + case Shape2D.Sphere: + + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.up) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.down) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.left) * Size), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.right) * Size), cgfTran.position); + + break; + + case Shape2D.Raycast: + + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.right) * Size), cgfTran.position); + + break; + + case Shape2D.Box: + + Vector3 BoxSize = new Vector3(boxSize.x, boxSize.y, 0f); + + Gizmos.color = DebugGravityLineColorA; + Matrix4x4 cubeTransform = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one * 2); + Matrix4x4 oldGizmosMatrix = Gizmos.matrix; + + Gizmos.matrix *= cubeTransform; + + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawWireCube(Vector3.zero, BoxSize); + + if (isSelected) + DebugGravityLineColorA.a = 1f; + + if (isSelected) + { + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawWireCube(Vector3.zero, BoxSize); + } + + Gizmos.color = DebugGravityLineColorB; + Gizmos.DrawCube(Vector3.zero, BoxSize); + + if (isSelected) + Gizmos.DrawCube(Vector3.zero, BoxSize); + + Gizmos.matrix = oldGizmosMatrix; + + if (!isSelected) + { + Gizmos.color = DebugGravityLineColorA; + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.up) * BoxSize.y), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.down) * BoxSize.y), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.left) * BoxSize.x), cgfTran.position); + Gizmos.DrawLine(cgfTran.position + ((cgfTran.rotation * Vector3.right) * BoxSize.x), cgfTran.position); + } + + break; + } + + if (memoryProperties.SeeColliders) + { + if (_shape2D == Shape2D.Sphere) + { + if (ForcePower != 0) + { + for (int i = 0; i < ColliderListCount; i++) + { + if (isSelected) + { + Gizmos.color = DebugGravityLineColorA; + DebugGravityLineColorA.a = 1f; + } + Gizmos.DrawLine(this.transform.position, colliderList[i].gameObject.transform.position); + } + } + } + } + + if (memoryProperties.SeeRaycastHits) + { + if (shape2D == Shape2D.Raycast || _shape2D == Shape2D.Box) + { + if (ForcePower != 0) + { + for (int i = 0; i < RaycastHitListCount; i++) + { + if (isSelected) + { + Gizmos.color = DebugGravityLineColorA; + DebugGravityLineColorA.a = 1f; + } + Gizmos.DrawLine(this.transform.position, raycastHitList[i].collider.gameObject.transform.position); + } + } + } + } + + if (_forcePositionProperties.ForcePosition == CGF.ForcePosition.ClosestCollider) + { + switch (_forceType2D) + { + case ForceType2D.ForceAtPosition: + case ForceType2D.Force: + case ForceType2D.GravitationalAttraction: + + Gizmos.color = DebugGravityLineColorA; + if (_shape2D == Shape2D.Sphere) + { + for (int i = 0; i < ColliderListCount; i++) + { + if (colliderList != null) + { + if (colliderList.Length > 0) + { + var rigidCheck = colliderList[i].attachedRigidbody; + if (rigidCheck != null) + { + if (_filterProperties.ValidateFilters(rigidCheck, colliderList[i])) + { + Vector3 pointA = FindClosestPoints(colliderList[i], _forcePositionProperties.ClosestColliders, false); + Vector3 pointB = Vector3.zero; + + if (_forcePositionProperties.UseEffectedClosestPoint) + { + pointB = FindClosestPoints(colliderList[i], _forcePositionProperties.ClosestColliders, true); + } + else + { + pointB = colliderList[i].transform.position; + } + + Gizmos.DrawWireSphere(pointA, .01f); + Gizmos.DrawLine(pointA, pointB); + Gizmos.DrawWireSphere(pointB, .01f); + } + } + } + } + } + } + + if (_shape2D == Shape2D.Raycast || _shape2D == Shape2D.Box) + { + for (int i = 0; i < RaycastHitListCount; i++) + { + if (raycastHitList != null) + { + if (raycastHitList.Length > 0) + { + var rigidCheck = raycastHitList[i].collider.attachedRigidbody; + if (rigidCheck != null) + { + if (_filterProperties.ValidateFilters(rigidCheck, raycastHitList[i].collider)) + { + Vector3 pointA = FindClosestPoints(raycastHitList[i].collider, _forcePositionProperties.ClosestColliders, false); + Vector3 pointB = Vector3.zero; + + if (_forcePositionProperties.UseEffectedClosestPoint) + { + pointB = FindClosestPoints(raycastHitList[i].collider, _forcePositionProperties.ClosestColliders, true); + } + else + { + pointB = raycastHitList[i].collider.transform.position; + } + + Gizmos.DrawWireSphere(pointA, .01f); + Gizmos.DrawLine(pointA, pointB); + Gizmos.DrawWireSphere(pointB, .01f); + } + } + } + } + } + } + + break; + case ForceType2D.Torque: + break; + default: + break; + } + } + } + + //Draws CGF bounds for ClosestCollider + private void DrawClosetColliderGizmos() + { + if (!isSelected) + return; + + Gizmos.color = DebugGravityLineColorA; + + if (_forcePositionProperties.ForcePosition == CGF.ForcePosition.ClosestCollider) + { + for (int i = 0; i < _forcePositionProperties.ClosestColliders.Count; i++) + { + if (_forcePositionProperties.ClosestColliders[i] != null) + { + var bound = _forcePositionProperties.ClosestColliders[i].bounds; + Gizmos.DrawWireCube(bound.center, bound.size); + } + } + } + } + + #endregion + } +} diff --git a/Assets/CircularGravityForce/CGF2D.cs.meta b/Assets/CircularGravityForce/CGF2D.cs.meta new file mode 100644 index 0000000..346dcdf --- /dev/null +++ b/Assets/CircularGravityForce/CGF2D.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d97a967d72891a34da7d7400ed2c877c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: ba43097a61014ab44a2382800df70049, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Common.meta b/Assets/CircularGravityForce/Common.meta new file mode 100644 index 0000000..cf6e52c --- /dev/null +++ b/Assets/CircularGravityForce/Common.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 6c5b5a70d9acefa4cbbdc9d89809669c +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/CircularGravityForce/Common/CGFCollection.cs b/Assets/CircularGravityForce/Common/CGFCollection.cs new file mode 100644 index 0000000..700e068 --- /dev/null +++ b/Assets/CircularGravityForce/Common/CGFCollection.cs @@ -0,0 +1,117 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for a CGF data structer. +*******************************************************************************************/ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace CircularGravityForce +{ + public class CGFCollection + { + public class EffectedObject + { + private Rigidbody rigidbody; + public Rigidbody _rigidbody + { + get { return rigidbody; } + set { rigidbody = value; } + } + + private object objectHistory; + public object ObjectHistory + { + get { return objectHistory; } + set { objectHistory = value; } + } + + private float gameTime; + public float GameTime + { + get { return gameTime; } + set { gameTime = value; } + } + + private float timeEffected; + public float TimeEffected + { + get { return timeEffected; } + set { timeEffected = value; } + } + } + + private List effectedObjects; + public List EffectedObjects + { + get { return effectedObjects; } + set { effectedObjects = value; } + } + + public CGFCollection() + { + EffectedObjects = new List(); + } + + public void Add(Rigidbody rigid, float gameTime, float timeEffected) + { + bool foundFlag = false; + for (int i = 0; i < EffectedObjects.Count; i++) + { + if (EffectedObjects[i]._rigidbody == rigid) + { + EffectedObjects[i].GameTime = gameTime; + EffectedObjects[i].TimeEffected = timeEffected; + + foundFlag = true; + + break; + } + } + + if (!foundFlag) + { + var item = new EffectedObject(); + item._rigidbody = rigid; + + item.GameTime = gameTime; + item.TimeEffected = timeEffected; + SetEffectedObjectHistory(rigid, item); + EffectedObjects.Add(item); + } + + UpdateEffectedObject(rigid); + } + + public void Sync() + { + if (EffectedObjects.Count > 0) + { + for (int i = 0; i < EffectedObjects.Count; i++) + { + if ((Time.time - EffectedObjects[i].GameTime) > EffectedObjects[i].TimeEffected) + { + ResetEffectedObject(EffectedObjects[i]); + } + } + } + } + + public virtual void SetEffectedObjectHistory(Rigidbody rigid, EffectedObject effectedObject) + { + + } + + public virtual void UpdateEffectedObject(Rigidbody rigid) + { + + } + + public virtual void ResetEffectedObject(EffectedObject effectedObject) + { + + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Common/CGFCollection.cs.meta b/Assets/CircularGravityForce/Common/CGFCollection.cs.meta new file mode 100644 index 0000000..23110f9 --- /dev/null +++ b/Assets/CircularGravityForce/Common/CGFCollection.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f8640210c45296a41afbc06d2a93aebf +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/CircularGravityForce/Common/CGFCollection2D.cs b/Assets/CircularGravityForce/Common/CGFCollection2D.cs new file mode 100644 index 0000000..c85d984 --- /dev/null +++ b/Assets/CircularGravityForce/Common/CGFCollection2D.cs @@ -0,0 +1,117 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for a CGF data structer 2D. +*******************************************************************************************/ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace CircularGravityForce +{ + public class CGFCollection2D + { + public class EffectedObject + { + private Rigidbody2D rigidbody; + public Rigidbody2D _rigidbody + { + get { return rigidbody; } + set { rigidbody = value; } + } + + private object objectHistory; + public object ObjectHistory + { + get { return objectHistory; } + set { objectHistory = value; } + } + + private float gameTime; + public float GameTime + { + get { return gameTime; } + set { gameTime = value; } + } + + private float timeEffected; + public float TimeEffected + { + get { return timeEffected; } + set { timeEffected = value; } + } + } + + private List effectedObjects; + public List EffectedObjects + { + get { return effectedObjects; } + set { effectedObjects = value; } + } + + public CGFCollection2D() + { + EffectedObjects = new List(); + } + + public void Add(Rigidbody2D rigid, float gameTime, float timeEffected) + { + bool foundFlag = false; + for (int i = 0; i < EffectedObjects.Count; i++) + { + if (EffectedObjects[i]._rigidbody == rigid) + { + EffectedObjects[i].GameTime = gameTime; + EffectedObjects[i].TimeEffected = timeEffected; + + foundFlag = true; + + break; + } + } + + if (!foundFlag) + { + var item = new EffectedObject(); + item._rigidbody = rigid; + + item.GameTime = gameTime; + item.TimeEffected = timeEffected; + SetEffectedObjectHistory(rigid, item); + EffectedObjects.Add(item); + } + + UpdateEffectedObject(rigid); + } + + public void Sync() + { + if (EffectedObjects.Count > 0) + { + for (int i = 0; i < EffectedObjects.Count; i++) + { + if ((Time.time - EffectedObjects[i].GameTime) > EffectedObjects[i].TimeEffected) + { + ResetEffectedObject(EffectedObjects[i]); + } + } + } + } + + public virtual void SetEffectedObjectHistory(Rigidbody2D rigid, EffectedObject effectedObject) + { + + } + + public virtual void UpdateEffectedObject(Rigidbody2D rigid) + { + + } + + public virtual void ResetEffectedObject(EffectedObject effectedObject) + { + + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Common/CGFCollection2D.cs.meta b/Assets/CircularGravityForce/Common/CGFCollection2D.cs.meta new file mode 100644 index 0000000..96d4a47 --- /dev/null +++ b/Assets/CircularGravityForce/Common/CGFCollection2D.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6cc8c2e251aaa440b0a89a35f83facc +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/CircularGravityForce/Editor.meta b/Assets/CircularGravityForce/Editor.meta new file mode 100644 index 0000000..643620a --- /dev/null +++ b/Assets/CircularGravityForce/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 92b85dc0098b7564aa11bf61e828c6bc +folderAsset: yes +timeCreated: 1455067498 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Editor/CGF2D_Editor.cs b/Assets/CircularGravityForce/Editor/CGF2D_Editor.cs new file mode 100644 index 0000000..78a6f17 --- /dev/null +++ b/Assets/CircularGravityForce/Editor/CGF2D_Editor.cs @@ -0,0 +1,973 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used overwriting the Inspector GUI, and Scene GUI +*******************************************************************************************/ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections; +using CircularGravityForce; + +namespace CircularGravityForce +{ + [CustomEditor(typeof(CGF2D)), CanEditMultipleObjects] + public class CGF2D_Editor : Editor + { + private GUIStyle panelStyle; + private GUIStyle titleStyle; + private TitleImage titleImage; + + private SerializedProperty enable_property; + private SerializedProperty shape_property; + private SerializedProperty forceType_property; + private SerializedProperty forceMode_property; + private SerializedProperty projectRight_property; + private SerializedProperty forcePower_property; + private SerializedProperty velocityDamping_property; + private SerializedProperty angularVelocityDamping_property; + private SerializedProperty size_property; + private SerializedProperty boxSize_property; + + private SerializedProperty toggleTransformProperties; + private SerializedProperty transformProperties_overridePosition; + private SerializedProperty transformProperties_localPosition; + private SerializedProperty transformProperties_positionValue; + private SerializedProperty transformProperties_overrideRotation; + private SerializedProperty transformProperties_localRotation; + private SerializedProperty transformProperties_rotationValue; + + private SerializedProperty toggleForcePositionProperties; + private SerializedProperty forcePositionProperties_forcePosition; + private SerializedProperty forcePositionProperties_closestColliders; + private SerializedProperty forcePositionProperties_useEffectedClosestPoint; + private SerializedProperty forcePositionProperties_heightOffset; + + private SerializedProperty toggleEventProperties; + private SerializedProperty eventProperties_enableEvents; + private SerializedProperty eventProperties_enableSendMessage; + + private SerializedProperty toggleMemoryProperties_property; + private SerializedProperty memoryProperties_colliderLayerMask_property; + private SerializedProperty memoryProperties_seeAffectedColliders_property; + private SerializedProperty memoryProperties_seeAffectedRaycastHits_property; + private SerializedProperty memoryProperties_nonAllocPhysics_property; + private SerializedProperty memoryProperties_colliderBuffer_property; + private SerializedProperty memoryProperties_raycastHitBuffer_property; + + private SerializedProperty colliderListCount_property; + private SerializedProperty raycastHitListCount_property; + + private CGF2D cgf; + + private bool change = false; + private float spacing = 10f; + + private Color redBar = new Color(1f, 0f, 0f, .4f); + + private string helpText; + private MessageType messageType = MessageType.Info; + + public void OnEnable() + { + //Title Image Resource + titleImage = new TitleImage("Assets/ResurgamStudios/CircularGravityForce Package/Gizmos/CGF Title.png"); + + enable_property = serializedObject.FindProperty("enable"); + shape_property = serializedObject.FindProperty("shape2D"); + forceType_property = serializedObject.FindProperty("forceType2D"); + forceMode_property = serializedObject.FindProperty("forceMode2D"); + projectRight_property = serializedObject.FindProperty("projectRight"); + forcePower_property = serializedObject.FindProperty("forcePower"); + velocityDamping_property = serializedObject.FindProperty("velocityDamping"); + angularVelocityDamping_property = serializedObject.FindProperty("angularVelocityDamping"); + size_property = serializedObject.FindProperty("size"); + boxSize_property = serializedObject.FindProperty("boxSize"); + + toggleTransformProperties = serializedObject.FindProperty("transformProperties.toggleTransformProperties"); + transformProperties_overridePosition = serializedObject.FindProperty("transformProperties.overridePosition"); + transformProperties_localPosition = serializedObject.FindProperty("transformProperties.localPosition"); + transformProperties_positionValue = serializedObject.FindProperty("transformProperties.positionValue"); + transformProperties_overrideRotation = serializedObject.FindProperty("transformProperties.overrideRotation"); + transformProperties_localRotation = serializedObject.FindProperty("transformProperties.localRotation"); + transformProperties_rotationValue = serializedObject.FindProperty("transformProperties.rotationValue"); + + toggleForcePositionProperties = serializedObject.FindProperty("forcePositionProperties.toggleForcePositionProperties"); + forcePositionProperties_forcePosition = serializedObject.FindProperty("forcePositionProperties.forcePosition"); + forcePositionProperties_closestColliders = serializedObject.FindProperty("forcePositionProperties.closestColliders"); + forcePositionProperties_useEffectedClosestPoint = serializedObject.FindProperty("forcePositionProperties.useEffectedClosestPoint"); + forcePositionProperties_heightOffset = serializedObject.FindProperty("forcePositionProperties.heightOffset"); + + toggleEventProperties = serializedObject.FindProperty("eventProperties.toggleEventProperties"); + eventProperties_enableEvents = serializedObject.FindProperty("eventProperties.enableEvents"); + eventProperties_enableSendMessage = serializedObject.FindProperty("eventProperties.enableSendMessage"); + + toggleMemoryProperties_property = serializedObject.FindProperty("memoryProperties.toggleMemoryProperties"); + memoryProperties_colliderLayerMask_property = serializedObject.FindProperty("memoryProperties.colliderLayerMask"); + memoryProperties_seeAffectedColliders_property = serializedObject.FindProperty("memoryProperties.seeColliders"); + memoryProperties_seeAffectedRaycastHits_property = serializedObject.FindProperty("memoryProperties.seeRaycastHits"); + memoryProperties_nonAllocPhysics_property = serializedObject.FindProperty("memoryProperties.nonAllocPhysics"); + memoryProperties_colliderBuffer_property = serializedObject.FindProperty("memoryProperties.colliderBuffer"); + memoryProperties_raycastHitBuffer_property = serializedObject.FindProperty("memoryProperties.raycastHitBuffer"); + colliderListCount_property = serializedObject.FindProperty("colliderListCount"); + raycastHitListCount_property = serializedObject.FindProperty("raycastHitListCount"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + panelStyle = new GUIStyle(GUI.skin.box); + panelStyle.padding = new RectOffset(panelStyle.padding.left + 10, panelStyle.padding.right, panelStyle.padding.top, panelStyle.padding.bottom); + EditorGUILayout.BeginVertical(panelStyle); + + /*<----------------------------------------------------------------------------------------------------------*/ + titleStyle = new GUIStyle(GUI.skin.label); + titleStyle.alignment = TextAnchor.UpperCenter; + GUILayout.BeginVertical(); + GUILayout.Box(titleImage.content, titleStyle); + GUILayout.EndVertical(); + /*<----------------------------------------------------------------------------------------------------------*/ + +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + if (shape_property.enumValueIndex == (int)CGF2D.Shape2D.Box) + EditorGUILayout.HelpBox(CGF.WarningMessageBoxUnity_5_3, MessageType.Warning, true); +#endif + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(enable_property, new GUIContent("Enable")); + if (EditorGUI.EndChangeCheck()) + { + enable_property.boolValue = EditorGUILayout.Toggle(enable_property.boolValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(shape_property, new GUIContent("Shape")); + if (EditorGUI.EndChangeCheck()) + { + shape_property.enumValueIndex = Convert.ToInt32(EditorGUILayout.EnumPopup((CGF2D.Shape2D)shape_property.enumValueIndex)); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forceType_property, new GUIContent("Force Type")); + if (EditorGUI.EndChangeCheck()) + { + forceType_property.enumValueIndex = Convert.ToInt32(EditorGUILayout.EnumPopup((CGF.ForceType)forceType_property.enumValueIndex)); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + if (helpText != string.Empty) + EditorGUILayout.HelpBox(helpText, messageType, true); + + switch (forceType_property.enumValueIndex) + { + case (int)CGF2D.ForceType2D.ForceAtPosition: + helpText = "Applies force at position. As a result this will apply a torque and force on the objects."; + break; + case (int)CGF2D.ForceType2D.Force: + helpText = "Adds a force to the objects."; + break; + case (int)CGF2D.ForceType2D.Torque: + helpText = "Adds a torque to the objects."; + break; + case (int)CGF2D.ForceType2D.GravitationalAttraction: + helpText = "Adds gravitational attraction based off newtonian gravity."; + break; + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forceMode_property, new GUIContent("Force Mode")); + if (EditorGUI.EndChangeCheck()) + { + forceMode_property.enumValueIndex = Convert.ToInt32(EditorGUILayout.EnumPopup((ForceMode)forceMode_property.enumValueIndex)); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + if (shape_property.enumValueIndex != (int)CGF2D.Shape2D.Raycast) + { + switch (forceType_property.enumValueIndex) + { + case (int)CGF2D.ForceType2D.ForceAtPosition: + case (int)CGF2D.ForceType2D.Force: + case (int)CGF2D.ForceType2D.GravitationalAttraction: + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(projectRight_property, new GUIContent("Project Right")); + if (EditorGUI.EndChangeCheck()) + { + projectRight_property.boolValue = EditorGUILayout.Toggle(projectRight_property.boolValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + } + } + + switch (forceType_property.enumValueIndex) + { + case (int)CGF2D.ForceType2D.ForceAtPosition: + case (int)CGF2D.ForceType2D.Force: + case (int)CGF2D.ForceType2D.GravitationalAttraction: + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(velocityDamping_property, new GUIContent("Velocity Damping")); + if (EditorGUI.EndChangeCheck()) + { + velocityDamping_property.floatValue = EditorGUILayout.FloatField(velocityDamping_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + case (int)CGF.ForceType.Torque: + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(angularVelocityDamping_property, new GUIContent("Angular Velocity Damping")); + if (EditorGUI.EndChangeCheck()) + { + angularVelocityDamping_property.floatValue = EditorGUILayout.FloatField(angularVelocityDamping_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePower_property, new GUIContent("Force Power")); + if (EditorGUI.EndChangeCheck()) + { + forcePower_property.floatValue = EditorGUILayout.FloatField(forcePower_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + if (shape_property.enumValueIndex == (int)CGF2D.Shape2D.Box) + { + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(boxSize_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + } + else + { + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(size_property, new GUIContent("Size")); + if (EditorGUI.EndChangeCheck()) + { + if (size_property.floatValue >= 0) + { + size_property.floatValue = EditorGUILayout.FloatField(size_property.floatValue); + } + else + { + size_property.floatValue = 0; + } + + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + } + + toggleTransformProperties.boolValue = EditorGUILayout.Foldout(toggleTransformProperties.boolValue, "Transform Properties"); + if (toggleTransformProperties.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_overridePosition, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (transformProperties_overridePosition.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_localPosition, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_positionValue, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_overrideRotation, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (transformProperties_overrideRotation.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_localRotation, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_rotationValue, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + } + + switch (forceType_property.enumValueIndex) + { + case (int)CGF2D.ForceType2D.ForceAtPosition: + case (int)CGF2D.ForceType2D.Force: + case (int)CGF2D.ForceType2D.GravitationalAttraction: + + toggleForcePositionProperties.boolValue = EditorGUILayout.Foldout(toggleForcePositionProperties.boolValue, "Force Position Properties"); + if (toggleForcePositionProperties.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_forcePosition, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (forcePositionProperties_forcePosition.enumValueIndex == (int)CGF.ForcePosition.ClosestCollider) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_closestColliders, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_useEffectedClosestPoint, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_heightOffset, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + } + break; + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(serializedObject.FindProperty("filterProperties"), true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + toggleEventProperties.boolValue = EditorGUILayout.Foldout(toggleEventProperties.boolValue, "Event Properties"); + if (toggleEventProperties.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(eventProperties_enableEvents, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (eventProperties_enableEvents.boolValue) + { + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.TextArea("//Enable Events Example:\n\nusing CircularGravityForce;\n\nvoid Awake()\n{\n CGF2D.OnApplyCGFEvent += CGF_OnApplyCGFEvent;\n}\n\nvoid OnDestroy()\n{\n CGF2D.OnApplyCGFEvent -= CGF_OnApplyCGFEvent;\n}\n\nprivate void CGF_OnApplyCGFEvent(CGF2D cgf, Rigidbody2D rigid, Collider2D coll)\n{\n Debug.Log(\"Hello World\");\n}", GUILayout.ExpandWidth(true), GUILayout.MinWidth(0)); + GUILayout.EndHorizontal(); + } + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(eventProperties_enableSendMessage, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (eventProperties_enableSendMessage.boolValue) + { + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.TextArea("//Enable Events Example:\n\nusing CircularGravityForce;\n\nprivate void OnApplyCGF(CGF2D cgf)\n{\n Debug.Log(\"Hello World\");\n}\n", GUILayout.ExpandWidth(true), GUILayout.MinWidth(0)); + GUILayout.EndHorizontal(); + } + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(serializedObject.FindProperty("drawGravityProperties"), true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + toggleMemoryProperties_property.boolValue = EditorGUILayout.Foldout(toggleMemoryProperties_property.boolValue, "Memory Properties"); + if (toggleMemoryProperties_property.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_colliderLayerMask_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (shape_property.enumValueIndex == (int)CGF.Shape.Sphere || shape_property.enumValueIndex == (int)CGF.Shape.Box) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_seeAffectedColliders_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + + if (shape_property.enumValueIndex == (int)CGF.Shape.Capsule || shape_property.enumValueIndex == (int)CGF.Shape.Raycast) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_seeAffectedRaycastHits_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + + if (Application.isPlaying) + GUI.enabled = false; + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_nonAllocPhysics_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + GUI.enabled = true; + + if (memoryProperties_nonAllocPhysics_property.boolValue) + { + + if (shape_property.enumValueIndex == (int)CGF2D.Shape2D.Sphere) + { + if (Application.isPlaying) + GUI.enabled = false; + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_colliderBuffer_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + if (memoryProperties_colliderBuffer_property.intValue >= 1) + { + memoryProperties_colliderBuffer_property.intValue = EditorGUILayout.IntField(memoryProperties_colliderBuffer_property.intValue); + } + else + { + memoryProperties_colliderBuffer_property.intValue = 1; + } + + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + GUI.enabled = true; + + float collidersUsed = (float)colliderListCount_property.intValue; + float collidersNotUsed = (float)memoryProperties_colliderBuffer_property.intValue; + float collidersUsedPercent = collidersUsed / collidersNotUsed; + + if (collidersUsedPercent == 1f) + GUI.backgroundColor = redBar; + + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUI.ProgressBar(EditorGUILayout.BeginVertical(), collidersUsedPercent, string.Format("{0} : {1}", collidersUsed, collidersNotUsed)); + GUILayout.Space(16); + EditorGUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + + if (shape_property.enumValueIndex == (int)CGF2D.Shape2D.Raycast || shape_property.enumValueIndex == (int)CGF2D.Shape2D.Box) + { + if (Application.isPlaying) + GUI.enabled = false; + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_raycastHitBuffer_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + if (memoryProperties_raycastHitBuffer_property.intValue >= 1) + { + memoryProperties_raycastHitBuffer_property.intValue = EditorGUILayout.IntField(memoryProperties_raycastHitBuffer_property.intValue); + } + else + { + memoryProperties_raycastHitBuffer_property.intValue = 1; + } + + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + GUI.enabled = true; + + float raycastHitsUsed = (float)raycastHitListCount_property.intValue; + float raycastHitsNotUsed = (float)memoryProperties_raycastHitBuffer_property.intValue; + float raycastHitsUsedPercent = raycastHitsUsed / raycastHitsNotUsed; + + if (raycastHitsUsedPercent == 1f) + GUI.backgroundColor = redBar; + + if (raycastHitsUsedPercent == 1f) + GUI.color = Color.magenta; + + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUI.ProgressBar(EditorGUILayout.BeginVertical(), raycastHitsUsedPercent, string.Format("{0} : {1}", raycastHitsUsed, raycastHitsNotUsed)); + GUILayout.Space(16); + EditorGUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + } + } + + EditorGUILayout.EndVertical(); + + if (change) + { + change = false; + } + + serializedObject.ApplyModifiedProperties(); + } + + void OnSceneGUI() + { + cgf = (CGF2D)target; + + if (cgf._drawGravityProperties.DrawGizmo) + { + + Color mainColor; + Color tranMainColor; + + if (cgf.Enable) + { + if (cgf.ForcePower == 0) + { + mainColor = Color.white; + tranMainColor = Color.white; + } + else if (cgf.ForcePower > 0) + { + mainColor = Color.green; + tranMainColor = Color.green; + } + else + { + mainColor = Color.red; + tranMainColor = Color.red; + } + } + else + { + mainColor = Color.white; + tranMainColor = Color.white; + } + + tranMainColor.a = .1f; + + Handles.color = mainColor; + + float gizmoSize = 0f; + float gizmoOffset = 0f; + + if (mainColor == Color.green) + { + gizmoSize = (cgf.Size / 8f); + if (gizmoSize > .5f) + gizmoSize = .5f; + else if (gizmoSize < -.5f) + gizmoSize = -.5f; + gizmoOffset = -gizmoSize / 1.5f; + } + else if (mainColor == Color.red) + { + gizmoSize = -(cgf.Size / 8f); + if (gizmoSize > .5f) + gizmoSize = .5f; + else if (gizmoSize < -.5f) + gizmoSize = -.5f; + gizmoOffset = gizmoSize / 1.5f; + } + + Quaternion qUp = cgf.transform.transform.rotation; + qUp.SetLookRotation(cgf.transform.rotation * Vector3.up); + Quaternion qDown = cgf.transform.transform.rotation; + qDown.SetLookRotation(cgf.transform.rotation * Vector3.down); + Quaternion qLeft = cgf.transform.transform.rotation; + qLeft.SetLookRotation(cgf.transform.rotation * Vector3.forward); + Quaternion qRight = cgf.transform.transform.rotation; + qRight.SetLookRotation(cgf.transform.rotation * Vector3.back); + Quaternion qForward = cgf.transform.transform.rotation; + qForward.SetLookRotation(cgf.transform.rotation * Vector3.right); + Quaternion qBack = cgf.transform.transform.rotation; + qBack.SetLookRotation(cgf.transform.rotation * Vector3.left); + + float dotSpace = 10f; + float sizeValue = cgf.Size; + float sizeBoxValueX = cgf.BoxSize.x; + float sizeBoxValueY = cgf.BoxSize.y; + + switch (cgf._shape2D) + { + case CGF2D.Shape2D.Sphere: + + Handles.color = tranMainColor; + Handles.color = mainColor; + + if ((cgf._forceType2D == CGF2D.ForceType2D.ForceAtPosition || + cgf._forceType2D == CGF2D.ForceType2D.GravitationalAttraction || + cgf._forceType2D == CGF2D.ForceType2D.Force) && + !cgf._projectRight) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.up, cgf.Size + gizmoOffset, 1f), qUp, gizmoSize); + DrawConeCap(GetVector(Vector3.down, cgf.Size + gizmoOffset, 1f), qDown, gizmoSize); + DrawConeCap(GetVector(Vector3.left, cgf.Size + gizmoOffset, 1f), qBack, gizmoSize); + } + } + else if (cgf._forceType2D == CGF2D.ForceType2D.Torque) + { + DrawConeCap(GetVector(Vector3.up, cgf.Size + gizmoOffset, 1f), qForward, gizmoSize); + DrawConeCap(GetVector(Vector3.down, cgf.Size + gizmoOffset, 1f), qBack, gizmoSize); + DrawConeCap(GetVector(Vector3.right, cgf.Size + gizmoOffset, 1f), qDown, gizmoSize); + DrawConeCap(GetVector(Vector3.left, cgf.Size + gizmoOffset, 1f), qUp, gizmoSize); + } + else + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.left, cgf.Size + gizmoOffset, 1f), qBack, -gizmoSize); + } + } + + if (cgf._forceType2D != CGF2D.ForceType2D.Torque) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.right, cgf.Size + gizmoOffset, 1f), qForward, gizmoSize); + } + } + + Handles.DrawDottedLine(GetVector(Vector3.up, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.down, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.left, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.right, cgf.Size, 1), cgf.transform.position, dotSpace); + + DrawCircleCap(cgf.transform.position, qLeft, cgf.Size); + + Handles.color = mainColor; + sizeValue = cgf.Size; + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.up, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.down, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.left, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.right, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + if (sizeValue < 0) + cgf.Size = 0; + else + cgf.Size = sizeValue; + + break; + case CGF2D.Shape2D.Raycast: + + Handles.DrawDottedLine(cgf.transform.position + ((cgf.transform.rotation * Vector3.right) * cgf.Size), cgf.transform.position, dotSpace); + + if (cgf._forceType2D != CGF2D.ForceType2D.Torque) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.right, cgf.Size + gizmoOffset, 1f), qForward, gizmoSize); + } + } + else + { + DrawConeCap(GetVector(Vector3.right, cgf.Size + gizmoOffset, 1f), qDown, gizmoSize); + } + + Handles.color = mainColor; + sizeValue = cgf.Size; + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.right, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + if (sizeValue < 0) + cgf.Size = 0; + else + cgf.Size = sizeValue; + + break; + case CGF2D.Shape2D.Box: + + if ((cgf._forceType2D == CGF2D.ForceType2D.ForceAtPosition || + cgf._forceType2D == CGF2D.ForceType2D.GravitationalAttraction || + cgf._forceType2D == CGF2D.ForceType2D.Force) && + !cgf._projectRight) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.up, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qUp, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.down, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qDown, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.left, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.x, gizmoSize), 1f), qBack, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + } + } + else if (cgf._forceType2D == CGF2D.ForceType2D.Torque) + { + DrawConeCap(GetVector(Vector3.up, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qForward, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.down, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qBack, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.right, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.x, gizmoSize), 1f), qDown, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + DrawConeCap(GetVector(Vector3.left, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.x, gizmoSize), 1f), qUp, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + } + else + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.left, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.x, gizmoSize), 1f), qBack, -CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + } + } + + if (cgf._forceType2D != CGF2D.ForceType2D.Torque) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.right, CGF_Editor.GetArrowOffsetForBox(mainColor, cgf.BoxSize.x, gizmoSize), 1f), qForward, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + } + } + + Handles.DrawDottedLine(GetVector(Vector3.up, cgf.BoxSize.y, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.down, cgf.BoxSize.y, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.left, cgf.BoxSize.x, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.right, cgf.BoxSize.x, 1), cgf.transform.position, dotSpace); + + Handles.color = mainColor; + sizeBoxValueX = cgf.BoxSize.x; + sizeBoxValueY = cgf.BoxSize.y; + sizeBoxValueY = DrawScaleValueHandle(sizeBoxValueY, GetVector(Vector3.up, cgf.BoxSize.y, 1f), cgf.transform.rotation, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + sizeBoxValueY = DrawScaleValueHandle(sizeBoxValueY, GetVector(Vector3.down, cgf.BoxSize.y, 1f), cgf.transform.rotation, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + sizeBoxValueX = DrawScaleValueHandle(sizeBoxValueX, GetVector(Vector3.left, cgf.BoxSize.x, 1f), cgf.transform.rotation, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + sizeBoxValueX = DrawScaleValueHandle(sizeBoxValueX, GetVector(Vector3.right, cgf.BoxSize.x, 1f), cgf.transform.rotation, CGF_Editor.GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + if (sizeBoxValueX < 0) + cgf.BoxSize = new Vector3(0f, cgf.BoxSize.y); + else + cgf.BoxSize = new Vector3(sizeBoxValueX, cgf.BoxSize.y); + if (sizeBoxValueY < 0) + cgf.BoxSize = new Vector3(cgf.BoxSize.x, 0f); + + else + cgf.BoxSize = new Vector3(cgf.BoxSize.x, sizeBoxValueY); + break; + } + + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawSphereCap(cgf.transform.position, cgf.transform.rotation, gizmoSize / 2f); + } + } + + if (GUI.changed) + { + EditorUtility.SetDirty(target); + } + } + + Vector3 GetVector(Vector3 vector, float size, float times) + { + return cgf.transform.position + (((cgf.transform.rotation * vector) * size) / times); + } + + void DrawConeCap(Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + Handles.ConeCap(0, position, rotation, gizmoSize); +#else + if (Event.current.type == EventType.Repaint) + { + Handles.ConeHandleCap(0, position, rotation, gizmoSize, EventType.Repaint); + } +#endif + } + + void DrawCircleCap(Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + Handles.CircleCap(0, position, rotation, gizmoSize); +#else + if (Event.current.type == EventType.Repaint) + { + Handles.CircleHandleCap(0, position, rotation, gizmoSize, EventType.Repaint); + } +#endif + } + + float DrawScaleValueHandle(float value, Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + return Handles.ScaleValueHandle(value, position, rotation, gizmoSize, Handles.DotCap, .25f); +#else + return Handles.ScaleValueHandle(value, position, rotation, gizmoSize, Handles.DotHandleCap, .25f); +#endif + } + + void DrawSphereCap(Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + Handles.SphereCap(0, position, rotation, gizmoSize / 2f); +#else + if (Event.current.type == EventType.Repaint) + { + Handles.SphereHandleCap(0, position, rotation, gizmoSize / 2f, EventType.Repaint); + } +#endif + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Editor/CGF2D_Editor.cs.meta b/Assets/CircularGravityForce/Editor/CGF2D_Editor.cs.meta new file mode 100644 index 0000000..4333b1c --- /dev/null +++ b/Assets/CircularGravityForce/Editor/CGF2D_Editor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c664f87bfb88a02498fa27a847c529ab +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Editor/CGF_Editor.cs b/Assets/CircularGravityForce/Editor/CGF_Editor.cs new file mode 100644 index 0000000..ca9c6ee --- /dev/null +++ b/Assets/CircularGravityForce/Editor/CGF_Editor.cs @@ -0,0 +1,1183 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used overwriting the Inspector GUI, and Scene GUI +*******************************************************************************************/ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections; +using CircularGravityForce; + +namespace CircularGravityForce +{ + [Serializable] + public class TitleImage + { + public Texture2D image; + public GUIContent content; + + public TitleImage(string imagePath) + { + content = new GUIContent(""); + this.image = (Texture2D)AssetDatabase.LoadAssetAtPath(imagePath, typeof(Texture2D)); + content.image = this.image; + } + } + + [CustomEditor(typeof(CGF)), CanEditMultipleObjects] + public class CGF_Editor : Editor + { + private GUIStyle panelStyle; + private GUIStyle titleStyle; + private TitleImage titleImage; + + private SerializedProperty enable_property; + private SerializedProperty shape_property; + private SerializedProperty forceType_property; + private SerializedProperty forceMode_property; + private SerializedProperty projectForward_property; + private SerializedProperty forcePower_property; + private SerializedProperty velocityDamping_property; + private SerializedProperty angularVelocityDamping_property; + private SerializedProperty size_property; + private SerializedProperty torqueMaxAngularVelocity_property; + private SerializedProperty explosionForceUpwardsModifier_property; + private SerializedProperty capsuleRadius_property; + private SerializedProperty boxSize_property; + + private SerializedProperty toggleTransformProperties; + private SerializedProperty transformProperties_overridePosition; + private SerializedProperty transformProperties_localPosition; + private SerializedProperty transformProperties_positionValue; + private SerializedProperty transformProperties_overrideRotation; + private SerializedProperty transformProperties_localRotation; + private SerializedProperty transformProperties_rotationValue; + + private SerializedProperty toggleForcePositionProperties; + private SerializedProperty forcePositionProperties_forcePosition; + private SerializedProperty forcePositionProperties_closestColliders; + private SerializedProperty forcePositionProperties_useEffectedClosestPoint; + private SerializedProperty forcePositionProperties_heightOffset; + + private SerializedProperty toggleEventProperties; + private SerializedProperty eventProperties_enableEvents; + private SerializedProperty eventProperties_enableSendMessage; + + private SerializedProperty toggleMemoryProperties_property; + private SerializedProperty memoryProperties_colliderLayerMask_property; + private SerializedProperty memoryProperties_seeAffectedColliders_property; + private SerializedProperty memoryProperties_seeAffectedRaycastHits_property; + private SerializedProperty memoryProperties_nonAllocPhysics_property; + private SerializedProperty memoryProperties_colliderBuffer_property; + private SerializedProperty memoryProperties_raycastHitBuffer_property; + + private SerializedProperty colliderListCount_property; + private SerializedProperty raycastHitListCount_property; + + private CGF cgf; + + private bool change = false; + private float spacing = 10f; + + private Color redBar = new Color(1f, 0f, 0f, .4f); + + private string helpText; + private MessageType messageType = MessageType.Info; + + public void OnEnable() + { + //Title Image Resource + titleImage = new TitleImage("Assets/ResurgamStudios/CircularGravityForce Package/Gizmos/CGF Title.png"); + + enable_property = serializedObject.FindProperty("enable"); + shape_property = serializedObject.FindProperty("shape"); + forceType_property = serializedObject.FindProperty("forceType"); + forceMode_property = serializedObject.FindProperty("forceMode"); + projectForward_property = serializedObject.FindProperty("projectForward"); + forcePower_property = serializedObject.FindProperty("forcePower"); + velocityDamping_property = serializedObject.FindProperty("velocityDamping"); + angularVelocityDamping_property = serializedObject.FindProperty("angularVelocityDamping"); + size_property = serializedObject.FindProperty("size"); + torqueMaxAngularVelocity_property = serializedObject.FindProperty("forceTypeProperties.torqueMaxAngularVelocity"); + explosionForceUpwardsModifier_property = serializedObject.FindProperty("forceTypeProperties.explosionForceUpwardsModifier"); + capsuleRadius_property = serializedObject.FindProperty("capsuleRadius"); + boxSize_property = serializedObject.FindProperty("boxSize"); + + toggleTransformProperties = serializedObject.FindProperty("transformProperties.toggleTransformProperties"); + transformProperties_overridePosition = serializedObject.FindProperty("transformProperties.overridePosition"); + transformProperties_localPosition = serializedObject.FindProperty("transformProperties.localPosition"); + transformProperties_positionValue = serializedObject.FindProperty("transformProperties.positionValue"); + transformProperties_overrideRotation = serializedObject.FindProperty("transformProperties.overrideRotation"); + transformProperties_localRotation = serializedObject.FindProperty("transformProperties.localRotation"); + transformProperties_rotationValue = serializedObject.FindProperty("transformProperties.rotationValue"); + + toggleForcePositionProperties = serializedObject.FindProperty("forcePositionProperties.toggleForcePositionProperties"); + forcePositionProperties_forcePosition = serializedObject.FindProperty("forcePositionProperties.forcePosition"); + forcePositionProperties_closestColliders = serializedObject.FindProperty("forcePositionProperties.closestColliders"); + forcePositionProperties_useEffectedClosestPoint = serializedObject.FindProperty("forcePositionProperties.useEffectedClosestPoint"); + forcePositionProperties_heightOffset = serializedObject.FindProperty("forcePositionProperties.heightOffset"); + + toggleEventProperties = serializedObject.FindProperty("eventProperties.toggleEventProperties"); + eventProperties_enableEvents = serializedObject.FindProperty("eventProperties.enableEvents"); + eventProperties_enableSendMessage = serializedObject.FindProperty("eventProperties.enableSendMessage"); + + toggleMemoryProperties_property = serializedObject.FindProperty("memoryProperties.toggleMemoryProperties"); + memoryProperties_colliderLayerMask_property = serializedObject.FindProperty("memoryProperties.colliderLayerMask"); + memoryProperties_seeAffectedColliders_property = serializedObject.FindProperty("memoryProperties.seeColliders"); + memoryProperties_seeAffectedRaycastHits_property = serializedObject.FindProperty("memoryProperties.seeRaycastHits"); + memoryProperties_nonAllocPhysics_property = serializedObject.FindProperty("memoryProperties.nonAllocPhysics"); + memoryProperties_colliderBuffer_property = serializedObject.FindProperty("memoryProperties.colliderBuffer"); + memoryProperties_raycastHitBuffer_property = serializedObject.FindProperty("memoryProperties.raycastHitBuffer"); + + colliderListCount_property = serializedObject.FindProperty("colliderListCount"); + raycastHitListCount_property = serializedObject.FindProperty("raycastHitListCount"); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + panelStyle = new GUIStyle(GUI.skin.box); + panelStyle.padding = new RectOffset(panelStyle.padding.left + 10, panelStyle.padding.right, panelStyle.padding.top, panelStyle.padding.bottom); + EditorGUILayout.BeginVertical(panelStyle); + + /*<----------------------------------------------------------------------------------------------------------*/ + titleStyle = new GUIStyle(GUI.skin.label); + titleStyle.alignment = TextAnchor.UpperCenter; + GUILayout.BeginVertical(); + GUILayout.Box(titleImage.content, titleStyle); + GUILayout.EndVertical(); + /*<----------------------------------------------------------------------------------------------------------*/ + +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + if (forcePositionProperties_forcePosition.enumValueIndex == (int)CGF.ForcePosition.ClosestCollider) + EditorGUILayout.HelpBox(CGF.WarningMessageClosestPoint_5_6, MessageType.Warning, true); +#endif + +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) + if (shape_property.enumValueIndex == (int)CGF.Shape.Box) + EditorGUILayout.HelpBox(CGF.WarningMessageBoxUnity_5_3, MessageType.Warning, true); + + if (memoryProperties_nonAllocPhysics_property.boolValue) + EditorGUILayout.HelpBox(CGF.WarningMessageNonAllocUnity_5_3, MessageType.Warning, true); +#endif + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(enable_property, new GUIContent("Enable")); + if (EditorGUI.EndChangeCheck()) + { + enable_property.boolValue = EditorGUILayout.Toggle(enable_property.boolValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(shape_property, new GUIContent("Shape")); + if (EditorGUI.EndChangeCheck()) + { + shape_property.enumValueIndex = Convert.ToInt32(EditorGUILayout.EnumPopup((CGF.Shape)shape_property.enumValueIndex)); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forceType_property, new GUIContent("Force Type")); + if (EditorGUI.EndChangeCheck()) + { + forceType_property.enumValueIndex = Convert.ToInt32(EditorGUILayout.EnumPopup((CGF.ForceType)forceType_property.enumValueIndex)); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + if (helpText != string.Empty) + EditorGUILayout.HelpBox(helpText, messageType, true); + + switch (forceType_property.enumValueIndex) + { + case (int)CGF.ForceType.ForceAtPosition: + helpText = "Applies force at position. As a result this will apply a torque and force on the objects."; + break; + case (int)CGF.ForceType.Force: + helpText = "Adds a force to the objects."; + break; + case (int)CGF.ForceType.Torque: + helpText = "Adds a torque to the objects."; + break; + case (int)CGF.ForceType.ExplosionForce: + helpText = "Applies a force to a objects that simulates explosion effects."; + break; + case (int)CGF.ForceType.GravitationalAttraction: + helpText = "Adds gravitational attraction based off newtonian gravity."; + break; + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forceMode_property, new GUIContent("Force Mode")); + if (EditorGUI.EndChangeCheck()) + { + forceMode_property.enumValueIndex = Convert.ToInt32(EditorGUILayout.EnumPopup((ForceMode)forceMode_property.enumValueIndex)); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + if (shape_property.enumValueIndex != (int)CGF.Shape.Raycast) + { + switch (forceType_property.enumValueIndex) + { + case (int)CGF.ForceType.ForceAtPosition: + case (int)CGF.ForceType.Force: + case (int)CGF.ForceType.GravitationalAttraction: + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(projectForward_property, new GUIContent("Project Forward")); + if (EditorGUI.EndChangeCheck()) + { + projectForward_property.boolValue = EditorGUILayout.Toggle(projectForward_property.boolValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + } + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePower_property, new GUIContent("Force Power")); + if (EditorGUI.EndChangeCheck()) + { + forcePower_property.floatValue = EditorGUILayout.FloatField(forcePower_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + switch (forceType_property.enumValueIndex) + { + case (int)CGF.ForceType.Torque: + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(torqueMaxAngularVelocity_property, new GUIContent("Max Angular Velocity")); + if (EditorGUI.EndChangeCheck()) + { + torqueMaxAngularVelocity_property.floatValue = EditorGUILayout.FloatField(torqueMaxAngularVelocity_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + + case (int)CGF.ForceType.ExplosionForce: + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(explosionForceUpwardsModifier_property, new GUIContent("Upwards Modifier")); + if (EditorGUI.EndChangeCheck()) + { + explosionForceUpwardsModifier_property.floatValue = EditorGUILayout.FloatField(explosionForceUpwardsModifier_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + } + + switch (forceType_property.enumValueIndex) + { + case (int)CGF.ForceType.ForceAtPosition: + case (int)CGF.ForceType.Force: + case (int)CGF.ForceType.GravitationalAttraction: + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(velocityDamping_property, new GUIContent("Velocity Damping")); + if (EditorGUI.EndChangeCheck()) + { + velocityDamping_property.floatValue = EditorGUILayout.FloatField(velocityDamping_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + + case (int)CGF.ForceType.Torque: + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(angularVelocityDamping_property, new GUIContent("Angular Velocity Damping")); + if (EditorGUI.EndChangeCheck()) + { + angularVelocityDamping_property.floatValue = EditorGUILayout.FloatField(angularVelocityDamping_property.floatValue); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + } + + if (shape_property.enumValueIndex != (int)CGF.Shape.Box) + { + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(size_property, new GUIContent("Size")); + if (EditorGUI.EndChangeCheck()) + { + if (size_property.floatValue >= 0) + { + size_property.floatValue = EditorGUILayout.FloatField(size_property.floatValue); + } + else + { + size_property.floatValue = 0; + } + } + /*<----------------------------------------------------------------------------------------------------------*/ + } + + switch (shape_property.enumValueIndex) + { + case (int)CGF.Shape.Capsule: + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(capsuleRadius_property, new GUIContent("Capsule Radius")); + if (EditorGUI.EndChangeCheck()) + { + if (capsuleRadius_property.floatValue >= 0) + { + capsuleRadius_property.floatValue = EditorGUILayout.FloatField(capsuleRadius_property.floatValue); + } + else + { + capsuleRadius_property.floatValue = 0; + } + + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + case (int)CGF.Shape.Box: + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(boxSize_property, new GUIContent("Box Size")); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + break; + + } + + toggleTransformProperties.boolValue = EditorGUILayout.Foldout(toggleTransformProperties.boolValue, "Transform Properties"); + if (toggleTransformProperties.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_overridePosition, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (transformProperties_overridePosition.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_localPosition, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_positionValue, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_overrideRotation, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (transformProperties_overrideRotation.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_localRotation, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(transformProperties_rotationValue, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + } + + switch (forceType_property.enumValueIndex) + { + case (int)CGF.ForceType.ForceAtPosition: + case (int)CGF.ForceType.Force: + case (int)CGF.ForceType.ExplosionForce: + case (int)CGF.ForceType.GravitationalAttraction: + + toggleForcePositionProperties.boolValue = EditorGUILayout.Foldout(toggleForcePositionProperties.boolValue, "Force Position Properties"); + if (toggleForcePositionProperties.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_forcePosition, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (forcePositionProperties_forcePosition.enumValueIndex == (int)CGF.ForcePosition.ClosestCollider) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_closestColliders, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_useEffectedClosestPoint, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(forcePositionProperties_heightOffset, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + } + break; + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(serializedObject.FindProperty("filterProperties"), true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + toggleEventProperties.boolValue = EditorGUILayout.Foldout(toggleEventProperties.boolValue, "Event Properties"); + if (toggleEventProperties.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(eventProperties_enableEvents, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (eventProperties_enableEvents.boolValue) + { + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.TextArea("//Enable Events Example:\n\nusing CircularGravityForce;\n\nvoid Awake()\n{\n CGF.OnApplyCGFEvent += CGF_OnApplyCGFEvent;\n}\n\nvoid OnDestroy()\n{\n CGF.OnApplyCGFEvent -= CGF_OnApplyCGFEvent;\n}\n\nprivate void CGF_OnApplyCGFEvent(CGF cgf, Rigidbody rigid, Collider coll)\n{\n Debug.Log(\"Hello World\");\n}", GUILayout.ExpandWidth(true), GUILayout.MinWidth(0)); + GUILayout.EndHorizontal(); + } + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(eventProperties_enableSendMessage, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (eventProperties_enableSendMessage.boolValue) + { + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.TextArea("//Enable Events Example:\n\nusing CircularGravityForce;\n\nprivate void OnApplyCGF(CGF cgf)\n{\n Debug.Log(\"Hello World\");\n}\n", GUILayout.ExpandWidth(true), GUILayout.MinWidth(0)); + GUILayout.EndHorizontal(); + } + } + + /*<----------------------------------------------------------------------------------------------------------*/ + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(serializedObject.FindProperty("drawGravityProperties"), true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + /*<----------------------------------------------------------------------------------------------------------*/ + + toggleMemoryProperties_property.boolValue = EditorGUILayout.Foldout(toggleMemoryProperties_property.boolValue, "Memory Properties"); + if (toggleMemoryProperties_property.boolValue) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_colliderLayerMask_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + if (shape_property.enumValueIndex == (int)CGF.Shape.Sphere || shape_property.enumValueIndex == (int)CGF.Shape.Box) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_seeAffectedColliders_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + + if (shape_property.enumValueIndex == (int)CGF.Shape.Capsule || shape_property.enumValueIndex == (int)CGF.Shape.Raycast) + { + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_seeAffectedRaycastHits_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + } + + if (Application.isPlaying) + GUI.enabled = false; + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_nonAllocPhysics_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + GUI.enabled = true; + + if (memoryProperties_nonAllocPhysics_property.boolValue) + { + + if (shape_property.enumValueIndex == (int)CGF.Shape.Sphere || shape_property.enumValueIndex == (int)CGF.Shape.Box) + { + if (Application.isPlaying) + GUI.enabled = false; + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_colliderBuffer_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + if (memoryProperties_colliderBuffer_property.intValue >= 1) + { + memoryProperties_colliderBuffer_property.intValue = EditorGUILayout.IntField(memoryProperties_colliderBuffer_property.intValue); + } + else + { + memoryProperties_colliderBuffer_property.intValue = 1; + } + + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + GUI.enabled = true; + + float collidersUsed = (float)colliderListCount_property.intValue; + float collidersNotUsed = (float)memoryProperties_colliderBuffer_property.intValue; + float collidersUsedPercent = collidersUsed / collidersNotUsed; + + if (collidersUsedPercent == 1f) + GUI.backgroundColor = redBar; + + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUI.ProgressBar(EditorGUILayout.BeginVertical(), collidersUsedPercent, string.Format("{0} : {1}", collidersUsed, collidersNotUsed)); + GUILayout.Space(16); + EditorGUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + + if (shape_property.enumValueIndex == (int)CGF.Shape.Raycast || shape_property.enumValueIndex == (int)CGF.Shape.Capsule) + { + if (Application.isPlaying) + GUI.enabled = false; + + /*<----------------------------------------------------------------------------------------------------------*/ + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(memoryProperties_raycastHitBuffer_property, true, GUILayout.ExpandWidth(true)); + if (EditorGUI.EndChangeCheck()) + { + if (memoryProperties_raycastHitBuffer_property.intValue >= 1) + { + memoryProperties_raycastHitBuffer_property.intValue = EditorGUILayout.IntField(memoryProperties_raycastHitBuffer_property.intValue); + } + else + { + memoryProperties_raycastHitBuffer_property.intValue = 1; + } + + change = true; + } + GUILayout.EndHorizontal(); + /*<----------------------------------------------------------------------------------------------------------*/ + + GUI.enabled = true; + + float raycastHitsUsed = (float)raycastHitListCount_property.intValue; + float raycastHitsNotUsed = (float)memoryProperties_raycastHitBuffer_property.intValue; + float raycastHitsUsedPercent = raycastHitsUsed / raycastHitsNotUsed; + + if (raycastHitsUsedPercent == 1f) + GUI.backgroundColor = redBar; + + if (raycastHitsUsedPercent == 1f) + GUI.color = Color.magenta; + + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("", GUILayout.Width(spacing)); + EditorGUI.BeginChangeCheck(); + EditorGUI.ProgressBar(EditorGUILayout.BeginVertical(), raycastHitsUsedPercent, string.Format("{0} : {1}", raycastHitsUsed, raycastHitsNotUsed)); + GUILayout.Space(16); + EditorGUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + } + } + + EditorGUILayout.EndVertical(); + + if (change) + { + change = false; + } + + serializedObject.ApplyModifiedProperties(); + } + + void OnSceneGUI() + { + cgf = (CGF)target; + + if (cgf._drawGravityProperties.DrawGizmo) + { + Color mainColor; + Color tranMainColor; + + if (cgf.Enable) + { + if (cgf.ForcePower == 0) + { + mainColor = Color.white; + tranMainColor = Color.white; + } + else if (cgf.ForcePower > 0) + { + mainColor = Color.green; + tranMainColor = Color.green; + } + else + { + mainColor = Color.red; + tranMainColor = Color.red; + } + } + else + { + mainColor = Color.white; + tranMainColor = Color.white; + } + + tranMainColor.a = .1f; + + Handles.color = mainColor; + + float gizmoSize = 0f; + float gizmoOffset = 0f; + + if (mainColor == Color.green) + { + gizmoSize = (cgf.Size / 8f); + if (gizmoSize > .5f) + gizmoSize = .5f; + else if (gizmoSize < -.5f) + gizmoSize = -.5f; + gizmoOffset = -gizmoSize / 1.5f; + } + else if (mainColor == Color.red) + { + gizmoSize = -(cgf.Size / 8f); + if (gizmoSize > .5f) + gizmoSize = .5f; + else if (gizmoSize < -.5f) + gizmoSize = -.5f; + gizmoOffset = gizmoSize / 1.5f; + } + + Quaternion qUp = cgf.transform.transform.rotation; + qUp.SetLookRotation(cgf.transform.rotation * Vector3.up); + Quaternion qDown = cgf.transform.transform.rotation; + qDown.SetLookRotation(cgf.transform.rotation * Vector3.down); + Quaternion qLeft = cgf.transform.transform.rotation; + qLeft.SetLookRotation(cgf.transform.rotation * Vector3.left); + Quaternion qRight = cgf.transform.transform.rotation; + qRight.SetLookRotation(cgf.transform.rotation * Vector3.right); + Quaternion qForward = cgf.transform.transform.rotation; + qForward.SetLookRotation(cgf.transform.rotation * Vector3.forward); + Quaternion qBack = cgf.transform.transform.rotation; + qBack.SetLookRotation(cgf.transform.rotation * Vector3.back); + + float dotSpace = 10f; + float sizeValue = cgf.Size; + float capsuleRadiusValue = cgf.CapsuleRadius; + + switch (cgf._shape) + { + case CGF.Shape.Sphere: + + Handles.color = mainColor; + + if ((cgf._forceType == CGF.ForceType.ForceAtPosition || + cgf._forceType == CGF.ForceType.Force || + cgf._forceType == CGF.ForceType.ExplosionForce || + cgf._forceType == CGF.ForceType.GravitationalAttraction) && + !cgf._projectForward || (cgf._projectForward && cgf._forceType == CGF.ForceType.ExplosionForce)) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.up, cgf.Size + gizmoOffset, 1f), qUp, gizmoSize); + DrawConeCap(GetVector(Vector3.down, cgf.Size + gizmoOffset, 1f), qDown, gizmoSize); + DrawConeCap(GetVector(Vector3.left, cgf.Size + gizmoOffset, 1f), qLeft, gizmoSize); + DrawConeCap(GetVector(Vector3.right, cgf.Size + gizmoOffset, 1f), qRight, gizmoSize); + DrawConeCap(GetVector(Vector3.back, cgf.Size + gizmoOffset, 1f), qBack, gizmoSize); + } + } + else if (cgf._forceType == CGF.ForceType.Torque) + { + DrawConeCap(GetVector(Vector3.up, cgf.Size + gizmoOffset, 1f), qForward, gizmoSize); + DrawConeCap(GetVector(Vector3.down, cgf.Size + gizmoOffset, 1f), qBack, gizmoSize); + DrawConeCap(GetVector(Vector3.forward, cgf.Size + gizmoOffset, 1f), qDown, gizmoSize); + DrawConeCap(GetVector(Vector3.back, cgf.Size + gizmoOffset, 1f), qUp, gizmoSize); + } + else + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.back, cgf.Size + gizmoOffset, 1f), qBack, -gizmoSize); + } + } + + if (cgf._forceType != CGF.ForceType.Torque) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.forward, cgf.Size + gizmoOffset, 1f), qForward, gizmoSize); + } + } + + Handles.DrawDottedLine(GetVector(Vector3.up, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.down, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.left, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.right, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.forward, cgf.Size, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.back, cgf.Size, 1), cgf.transform.position, dotSpace); + + DrawCircleCap(cgf.transform.position, qUp, cgf.Size); + DrawCircleCap(cgf.transform.position, qRight, cgf.Size); + DrawCircleCap(cgf.transform.position, qForward, cgf.Size); + + Handles.color = mainColor; + sizeValue = cgf.Size; + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.up, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.down, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.left, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.right, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.forward, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.back, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + if (sizeValue < 0) + cgf.Size = 0; + else + cgf.Size = sizeValue; + + break; + case CGF.Shape.Capsule: + + Handles.DrawDottedLine(GetVector(Vector3.up, cgf.CapsuleRadius, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.down, cgf.CapsuleRadius, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.left, cgf.CapsuleRadius, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.right, cgf.CapsuleRadius, 1), cgf.transform.position, dotSpace); + + Handles.DrawDottedLine(cgf.transform.position, GetVector(Vector3.forward, cgf.Size, 1), dotSpace); + + Handles.DrawDottedLine(GetVector(Vector3.forward, cgf.Size, 1) + ((cgf.transform.rotation * Vector3.up) * cgf.CapsuleRadius), GetVector(Vector3.forward, cgf.Size, 1), dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.forward, cgf.Size, 1) + ((cgf.transform.rotation * Vector3.down) * cgf.CapsuleRadius), GetVector(Vector3.forward, cgf.Size, 1), dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.forward, cgf.Size, 1) + ((cgf.transform.rotation * Vector3.left) * cgf.CapsuleRadius), GetVector(Vector3.forward, cgf.Size, 1), dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.forward, cgf.Size, 1) + ((cgf.transform.rotation * Vector3.right) * cgf.CapsuleRadius), GetVector(Vector3.forward, cgf.Size, 1), dotSpace); + + if (cgf._forceType != CGF.ForceType.Torque) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.forward, cgf.Size + gizmoOffset, 1f), qForward, gizmoSize); + } + } + else + { + DrawConeCap(GetVector(Vector3.forward, cgf.Size + gizmoOffset, 1f), qDown, gizmoSize); + } + + DrawCircleCap(cgf.transform.position, qForward, cgf.CapsuleRadius); + DrawCircleCap(GetVector(Vector3.forward, cgf.Size, 1), qForward, cgf.CapsuleRadius); + + Handles.color = mainColor; + sizeValue = cgf.Size; + capsuleRadiusValue = cgf.CapsuleRadius; + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.forward, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + capsuleRadiusValue = DrawScaleValueHandle(capsuleRadiusValue, GetVector(Vector3.up, cgf.CapsuleRadius, 1f), cgf.transform.rotation, gizmoSize); + capsuleRadiusValue = DrawScaleValueHandle(capsuleRadiusValue, GetVector(Vector3.down, cgf.CapsuleRadius, 1f), cgf.transform.rotation, gizmoSize); + capsuleRadiusValue = DrawScaleValueHandle(capsuleRadiusValue, GetVector(Vector3.left, cgf.CapsuleRadius, 1f), cgf.transform.rotation, gizmoSize); + capsuleRadiusValue = DrawScaleValueHandle(capsuleRadiusValue, GetVector(Vector3.right, cgf.CapsuleRadius, 1f), cgf.transform.rotation, gizmoSize); + if (sizeValue < 0) + cgf.Size = 0; + else + cgf.Size = sizeValue; + if (capsuleRadiusValue < 0) + cgf.CapsuleRadius = 0; + else + cgf.CapsuleRadius = capsuleRadiusValue; + + break; + case CGF.Shape.Raycast: + + Handles.DrawDottedLine(cgf.transform.position + ((cgf.transform.rotation * Vector3.forward) * cgf.Size), cgf.transform.position, dotSpace); + + if (cgf._forceType != CGF.ForceType.Torque) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.forward, cgf.Size + gizmoOffset, 1f), qForward, gizmoSize); + } + } + else + { + DrawConeCap(GetVector(Vector3.forward, cgf.Size + gizmoOffset, 1f), qDown, gizmoSize); + } + + Handles.color = mainColor; + sizeValue = cgf.Size; + sizeValue = DrawScaleValueHandle(sizeValue, GetVector(Vector3.forward, cgf.Size, 1f), cgf.transform.rotation, gizmoSize); + if (sizeValue < 0) + cgf.Size = 0; + else + cgf.Size = sizeValue; + + break; + case CGF.Shape.Box: + + if ((cgf._forceType == CGF.ForceType.ForceAtPosition || + cgf._forceType == CGF.ForceType.Force || + cgf._forceType == CGF.ForceType.ExplosionForce || + cgf._forceType == CGF.ForceType.GravitationalAttraction) && + !cgf._projectForward || (cgf._projectForward && cgf._forceType == CGF.ForceType.ExplosionForce)) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.up, GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qUp, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.down, GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qDown, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.left, GetArrowOffsetForBox(mainColor, cgf.BoxSize.x, gizmoSize), 1f), qLeft, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + DrawConeCap(GetVector(Vector3.right, GetArrowOffsetForBox(mainColor, cgf.BoxSize.x, gizmoSize), 1f), qRight, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + DrawConeCap(GetVector(Vector3.back, GetArrowOffsetForBox(mainColor, cgf.BoxSize.z, gizmoSize), 1f), qBack, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.z)); + } + } + else if (cgf._forceType == CGF.ForceType.Torque) + { + Handles.DrawDottedLine(GetVector(Vector3.up, cgf.BoxSize.y, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.down, cgf.BoxSize.y, 1), cgf.transform.position, dotSpace); + + DrawConeCap(GetVector(Vector3.up, GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qForward, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.down, GetArrowOffsetForBox(mainColor, cgf.BoxSize.y, gizmoSize), 1f), qBack, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + DrawConeCap(GetVector(Vector3.forward, GetArrowOffsetForBox(mainColor, cgf.BoxSize.z, gizmoSize), 1f), qDown, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.z)); + DrawConeCap(GetVector(Vector3.back, GetArrowOffsetForBox(mainColor, cgf.BoxSize.z, gizmoSize), 1f), qUp, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.z)); + } + else + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.back, GetArrowOffsetForBox(mainColor, cgf.BoxSize.z, gizmoSize), 1f), qBack, -GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.z)); + } + } + + Handles.DrawDottedLine(GetVector(Vector3.forward, cgf.BoxSize.z, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.back, cgf.BoxSize.z, 1), cgf.transform.position, dotSpace); + + if (cgf._forceType != CGF.ForceType.Torque) + { + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + DrawConeCap(GetVector(Vector3.forward, GetArrowOffsetForBox(mainColor, cgf.BoxSize.z, gizmoSize), 1f), qForward, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.z)); + } + } + + Handles.DrawDottedLine(GetVector(Vector3.up, cgf.BoxSize.y, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.down, cgf.BoxSize.y, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.left, cgf.BoxSize.x, 1), cgf.transform.position, dotSpace); + Handles.DrawDottedLine(GetVector(Vector3.right, cgf.BoxSize.x, 1), cgf.transform.position, dotSpace); + + Handles.color = mainColor; + float sizeXValue = cgf.BoxSize.x; + float sizeYValue = cgf.BoxSize.y; + float sizeZValue = cgf.BoxSize.z; + sizeXValue = DrawScaleValueHandle(sizeXValue, GetVector(Vector3.left, cgf.BoxSize.x, 1f), cgf.transform.rotation, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + sizeXValue = DrawScaleValueHandle(sizeXValue, GetVector(Vector3.right, cgf.BoxSize.x, 1f), cgf.transform.rotation, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.x)); + sizeYValue = DrawScaleValueHandle(sizeYValue, GetVector(Vector3.up, cgf.BoxSize.y, 1f), cgf.transform.rotation, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + sizeYValue = DrawScaleValueHandle(sizeYValue, GetVector(Vector3.down, cgf.BoxSize.y, 1f), cgf.transform.rotation, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.y)); + sizeZValue = DrawScaleValueHandle(sizeZValue, GetVector(Vector3.forward, cgf.BoxSize.z, 1f), cgf.transform.rotation, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.z)); + sizeZValue = DrawScaleValueHandle(sizeZValue, GetVector(Vector3.back, cgf.BoxSize.z, 1f), cgf.transform.rotation, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.z)); + if (sizeXValue < 0) + cgf.BoxSize = new Vector3(0f, cgf.BoxSize.y, cgf.BoxSize.z); + else + cgf.BoxSize = new Vector3(sizeXValue, cgf.BoxSize.y, cgf.BoxSize.z); + if (sizeYValue < 0) + cgf.BoxSize = new Vector3(cgf.BoxSize.x, 0f, cgf.BoxSize.z); + else + cgf.BoxSize = new Vector3(cgf.BoxSize.x, sizeYValue, cgf.BoxSize.z); + if (sizeZValue < 0) + cgf.BoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y, 0f); + else + cgf.BoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y, sizeZValue); + break; + + } + + if (cgf._forcePositionProperties.ForcePosition == CGF.ForcePosition.ThisTransform) + { + if (cgf._shape != CGF.Shape.Box) + { + DrawSphereCap(cgf.transform.position, cgf.transform.rotation, gizmoSize / 2f); + } + else if (cgf._shape == CGF.Shape.Box) + { + DrawSphereCap(cgf.transform.position, cgf.transform.rotation, GetGismoSizeForBox(mainColor, gizmoSize, cgf.BoxSize.magnitude) / 2f); + } + } + } + + if (GUI.changed) + { + EditorUtility.SetDirty(target); + } + } + + Vector3 GetVector(Vector3 vector, float size, float times) + { + return cgf.transform.position + (((cgf.transform.rotation * vector) * size) / times); + } + + public static float GetGismoSizeForBox(Color color, float arrowSize, float cgfSize) + { + if (color == Color.green) + { + arrowSize = (cgfSize / 8f); + if (arrowSize > .5f) + arrowSize = .5f; + else if (arrowSize < -.5f) + arrowSize = -.5f; + } + else if (color == Color.red) + { + arrowSize = -(cgfSize / 8f); + if (arrowSize > .5f) + arrowSize = .5f; + else if (arrowSize < -.5f) + arrowSize = -.5f; + } + + return arrowSize; + } + + public static float GetArrowOffsetForBox(Color color, float boxSize, float gizmoSize) + { + float arrowSize = GetGismoSizeForBox(color, gizmoSize, boxSize); + + float offset = 0; + + if (color == Color.green) + { + offset = boxSize + (-arrowSize / 1.5f); + } + else if (color == Color.red) + { + offset = boxSize + (arrowSize / 1.5f); + } + + return offset; + } + + void DrawConeCap(Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + Handles.ConeCap(0, position, rotation, gizmoSize); +#else + if (Event.current.type == EventType.Repaint) + { + Handles.ConeHandleCap(0, position, rotation, gizmoSize, EventType.Repaint); + } +#endif + } + + + void DrawCircleCap(Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + Handles.CircleCap(0, position, rotation, gizmoSize); +#else + if (Event.current.type == EventType.Repaint) + { + Handles.CircleHandleCap(0, position, rotation, gizmoSize, EventType.Repaint); + } +#endif + } + + float DrawScaleValueHandle(float value, Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + return Handles.ScaleValueHandle(value, position, rotation, gizmoSize, Handles.DotCap, .25f); +#else + return Handles.ScaleValueHandle(value, position, rotation, gizmoSize, Handles.DotHandleCap, .25f); +#endif + } + + void DrawSphereCap(Vector3 position, Quaternion rotation, float gizmoSize) + { +#if (UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5) + Handles.SphereCap(0, position, rotation, gizmoSize / 2f); +#else + if (Event.current.type == EventType.Repaint) + { + Handles.SphereHandleCap(0, position, rotation, gizmoSize / 2f, EventType.Repaint); + } +#endif + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Editor/CGF_Editor.cs.meta b/Assets/CircularGravityForce/Editor/CGF_Editor.cs.meta new file mode 100644 index 0000000..edfc2bc --- /dev/null +++ b/Assets/CircularGravityForce/Editor/CGF_Editor.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 262524a135e86564fa5beede005bfb6a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Editor/CGF_Tool.cs b/Assets/CircularGravityForce/Editor/CGF_Tool.cs new file mode 100644 index 0000000..ceb53da --- /dev/null +++ b/Assets/CircularGravityForce/Editor/CGF_Tool.cs @@ -0,0 +1,499 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for adding CGF tool menu , menu context, and gameobejct items. +*******************************************************************************************/ +using UnityEngine; +using UnityEditor; +using System.Collections; + +namespace CircularGravityForce +{ + public class CGF_Tool : EditorWindow + { + #region Enumes + + enum CGFOptions + { + _3D, + _2D + } + + //Constructor + public CGF_Tool() + { + } + + #endregion + + #region MenuItems / ToolBar + + [MenuItem("GameObject/3D Object/CGF", false, 0)] + public static void GameObject_3D_Object_CGF() + { + CreateSimpleCGF(); + } + + [MenuItem("GameObject/2D Object/CGF 2D", false, 0)] + public static void GameObject_2D_Object_CGF() + { + CreateSimpleCGF2D(); + } + + [MenuItem("CONTEXT/CGF/Effects->Add 'AlignToForce'", false)] + public static void AddAlignToForce(MenuCommand command) + { + CGF cgf = (CGF)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF/Effects->Add 'NoGravity'", false)] + public static void AddNoGravity(MenuCommand command) + { + CGF cgf = (CGF)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF/Mods->Add 'Pulse'", false)] + public static void AddPulse(MenuCommand command) + { + CGF cgf = (CGF)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF/Mods->Add 'SizeByRaycast'", false)] + public static void AddSizeByRaycast(MenuCommand command) + { + CGF cgf = (CGF)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF2D/Effects->Add 2D 'AlignToForce'", false)] + public static void AddAlignToForce2D(MenuCommand command) + { + CGF2D cgf = (CGF2D)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF2D/Effects->Add 2D 'NoGravity'", false)] + public static void AddNoGravity2D(MenuCommand command) + { + CGF2D cgf = (CGF2D)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF2D/Mods->Add 2D 'Pulse'", false)] + public static void AddPulse2D(MenuCommand command) + { + CGF2D cgf = (CGF2D)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF2D/Mods->Add 2D 'SizeByRaycast'", false)] + public static void AddSizeByRaycast2D(MenuCommand command) + { + CGF2D cgf = (CGF2D)command.context; + cgf.gameObject.AddComponent(); + } + + [MenuItem("CONTEXT/CGF/Triggers->Add 'Enable'", false)] + static void CONTEXT_CircularGravity_Create_Enable(MenuCommand command) + { + CGF cgf = (CGF)command.context; + CreateEnableTrigger(cgf.gameObject, cgf); + } + + [MenuItem("CONTEXT/CGF2D/Triggers->Add 2D 'Enable'", false)] + static void CONTEXT_CircularGravity2D_Create_Enable(MenuCommand command) + { + CGF2D cgf = (CGF2D)command.context; + CreateEnableTrigger2D(cgf.gameObject, cgf); + } + + [MenuItem("CONTEXT/CGF/Triggers->Add 'Hover'", false)] + static void CONTEXT_CircularGravity_Create_Hover(MenuCommand command) + { + CGF cgf = (CGF)command.context; + CreateHoverTrigger(cgf.gameObject, cgf); + } + + [MenuItem("CONTEXT/CGF2D/Triggers->Add 2D 'Hover'", false)] + static void CONTEXT_CircularGravity2D_Create_Hover(MenuCommand command) + { + CGF2D cgf = (CGF2D)command.context; + CreateHoverTrigger2D(cgf.gameObject, cgf); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Quick CGF &q", false, 1)] + public static void QuickCGF() + { + CreateSimpleCGF(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Quick CGF 2D #&q", false, 2)] + public static void QuickCGF2D() + { + CreateSimpleCGF2D(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 'AlignToForce'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 'NoGravity'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 'Pulse'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 'SizeByRaycast'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 'Enable'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 'Hover'", true)] + public static bool CGF_Validation() + { + if (Selection.activeGameObject != null) + { + if (Selection.activeGameObject.GetComponent() != null) + { + return true; + } + } + + return false; + } + + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 2D 'AlignToForce'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 2D 'NoGravity'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 2D 'Pulse'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 2D 'SizeByRaycast'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 2D 'Enable'", true)] + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 2D 'Hover'", true)] + public static bool CGF_Validation2D() + { + if (Selection.activeGameObject != null) + { + if (Selection.activeGameObject.GetComponent() != null) + { + return true; + } + } + + return false; + } + + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 'AlignToForce'", false)] + public static void AddAlignToForce() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 'NoGravity'", false)] + public static void AddNoGravity() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 'Pulse'", false)] + public static void AddPulse() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 'SizeByRaycast'", false)] + public static void AddSizeByRaycast() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 2D 'AlignToForce'", false)] + public static void AddAlignToForce2D() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Effects/Add 2D 'NoGravity'", false)] + public static void AddNoGravity2D() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 2D 'Pulse'", false)] + public static void Add2DPulse() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Mods/Add 2D 'SizeByRaycast'", false)] + public static void Add2DSizeByRaycast() + { + Selection.activeGameObject.AddComponent(); + } + + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 'Enable'", false)] + public static void Trigger_AddEnable() + { + bool isCreated = false; + + if (Selection.activeGameObject != null) + { + var selectedObject = Selection.activeGameObject; + + if (selectedObject.GetComponent() != null) + { + var cgf = selectedObject; + var circularGravity = selectedObject.GetComponent(); + + CreateEnableTrigger(cgf, circularGravity); + + isCreated = true; + } + } + if (!isCreated) + { + var cgf = CreateSimpleCGF(); + CreateEnableTrigger(cgf, cgf.GetComponent()); + } + } + + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 'Hover'", false)] + public static void Trigger_AddHover() + { + bool isCreated = false; + + if (Selection.activeGameObject != null) + { + var selectedObject = Selection.activeGameObject; + + if (selectedObject.GetComponent() != null) + { + var cgf = selectedObject; + var circularGravity = selectedObject.GetComponent(); + + CreateHoverTrigger(cgf, circularGravity); + + isCreated = true; + } + } + if (!isCreated) + { + var cgf = CreateSimpleCGF(); + CreateHoverTrigger(cgf, cgf.GetComponent()); + } + } + + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 2D 'Enable'", false)] + public static void Trigger2D_AddEnable() + { + bool isCreated = false; + + if (Selection.activeGameObject != null) + { + var selectedObject = Selection.activeGameObject; + + if (selectedObject.GetComponent() != null) + { + var cgf = selectedObject; + var circularGravity = selectedObject.GetComponent(); + + CreateEnableTrigger2D(cgf, circularGravity); + + isCreated = true; + } + } + if (!isCreated) + { + var cgf = CreateSimpleCGF2D(); + CreateEnableTrigger2D(cgf, cgf.GetComponent()); + } + } + + [MenuItem("Tools/Resurgam Studios/CGF/Triggers/Add 2D 'Hover'", false)] + public static void Trigger2D_AddHover() + { + bool isCreated = false; + + if (Selection.activeGameObject != null) + { + var selectedObject = Selection.activeGameObject; + + if (selectedObject.GetComponent() != null) + { + var cgf = selectedObject; + var circularGravity = selectedObject.GetComponent(); + + CreateHoverTrigger2D(cgf, circularGravity); + + isCreated = true; + } + } + if (!isCreated) + { + var cgf = CreateSimpleCGF2D(); + CreateHoverTrigger2D(cgf, cgf.GetComponent()); + } + } + + [MenuItem("Tools/Resurgam Studios/CGF/Support/Unity Form", false)] + public static void SupportUnityForm() + { + Application.OpenURL("http://forum.unity3d.com/threads/circular-gravity-force.217100/"); + } + [MenuItem("Tools/Resurgam Studios/CGF/Support/Manual", false)] + public static void SupportManual() + { + Application.OpenURL("https://www.resurgamstudios.com/cgf-manual"); + } + [MenuItem("Tools/Resurgam Studios/CGF/Support/Asset Store", false)] + public static void SupportAssetStore() + { + Application.OpenURL("https://www.assetstore.unity3d.com/#!/content/8181"); + } + [MenuItem("Tools/Resurgam Studios/CGF/Support/Website", false)] + public static void SupportWebsite() + { + Application.OpenURL("https://www.resurgamstudios.com/cgf"); + } + [MenuItem("Tools/Resurgam Studios/CGF/Support/Version History", false)] + public static void SupportVersionHistory() + { + Application.OpenURL("https://www.resurgamstudios.com/cgf-versionhistory"); + } + + #endregion + + #region Events + + private static GameObject CreateSimpleCGF() + { + var cgf = CGF.CreateCGF(); + + FocusGameObject(cgf); + + return cgf; + } + private static GameObject CreateSimpleCGF2D() + { + var cgf = CGF2D.CreateCGF(); + + FocusGameObject(cgf, true); + + return cgf; + } + + private static void CreateEnableTrigger(GameObject cgf = null, CGF circularGravity = null) + { + GameObject triggerEnableObj = new GameObject(); + triggerEnableObj.name = "Trigger Enable"; + if (circularGravity != null) + { + triggerEnableObj.AddComponent().Cgf = circularGravity; + } + else + { + triggerEnableObj.AddComponent(); + } + if (cgf != null) + { + triggerEnableObj.transform.SetParent(cgf.transform, false); + } + triggerEnableObj.transform.position = triggerEnableObj.transform.position + Vector3.right * 6f; + triggerEnableObj.transform.rotation = Quaternion.Euler(0, 90, 0); + + if (cgf == null) + { + FocusGameObject(triggerEnableObj); + } + } + + private static void CreateHoverTrigger(GameObject cgf = null, CGF circularGravity = null) + { + GameObject triggerEnableObj = new GameObject(); + triggerEnableObj.name = "Trigger Hover"; + if (circularGravity != null) + { + triggerEnableObj.AddComponent().Cgf = circularGravity; + } + else + { + triggerEnableObj.AddComponent(); + } + if (cgf != null) + { + triggerEnableObj.transform.SetParent(cgf.transform, false); + } + triggerEnableObj.transform.position = triggerEnableObj.transform.position + Vector3.left * 6f; + triggerEnableObj.transform.rotation = Quaternion.Euler(-180, 0, 0); + + if (cgf == null) + { + FocusGameObject(triggerEnableObj); + } + } + + private static void CreateEnableTrigger2D(GameObject cgf = null, CGF2D circularGravity = null) + { + GameObject triggerEnableObj = new GameObject(); + triggerEnableObj.name = "Trigger Enable"; + if (circularGravity != null) + { + triggerEnableObj.AddComponent().Cgf = circularGravity; + } + else + { + triggerEnableObj.AddComponent(); + } + if (cgf != null) + { + triggerEnableObj.transform.SetParent(cgf.transform, false); + } + triggerEnableObj.transform.position = triggerEnableObj.transform.position + new Vector3(0, 6f); + + if (cgf == null) + { + FocusGameObject(triggerEnableObj, true); + } + } + + private static void CreateHoverTrigger2D(GameObject cgf = null, CGF2D circularGravity = null) + { + GameObject triggerEnableObj = new GameObject(); + triggerEnableObj.name = "Trigger Hover"; + if (circularGravity != null) + { + triggerEnableObj.AddComponent().Cgf = circularGravity; + } + else + { + triggerEnableObj.AddComponent(); + } + if (cgf != null) + { + triggerEnableObj.transform.SetParent(cgf.transform, false); + } + triggerEnableObj.transform.position = triggerEnableObj.transform.position + new Vector3(0, -6f); + triggerEnableObj.transform.rotation = Quaternion.Euler(0, 0, 180f); + + if (cgf == null) + { + FocusGameObject(triggerEnableObj, true); + } + } + + private static void FocusGameObject(GameObject focusGameObject, bool in2D = false) + { + //Sets the create location for the Circular Gravity Force gameobject + if (SceneView.lastActiveSceneView != null) + { + if (in2D) + focusGameObject.transform.position = new Vector3(SceneView.lastActiveSceneView.pivot.x, SceneView.lastActiveSceneView.pivot.y, 0f); + else + focusGameObject.transform.position = SceneView.lastActiveSceneView.pivot; + + //Sets the Circular Gravity Force gameobject selected in the hierarchy + Selection.activeGameObject = focusGameObject; + + //focus the editor camera on the Circular Gravity Force gameobject + SceneView.lastActiveSceneView.FrameSelected(); + } + else + { + focusGameObject.transform.position = Vector3.zero; + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Editor/CGF_Tool.cs.meta b/Assets/CircularGravityForce/Editor/CGF_Tool.cs.meta new file mode 100644 index 0000000..3563d90 --- /dev/null +++ b/Assets/CircularGravityForce/Editor/CGF_Tool.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 76c0ddc61c70c0e41995cf2975fdeb6a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Effects.meta b/Assets/CircularGravityForce/Effects.meta new file mode 100644 index 0000000..dbdfc92 --- /dev/null +++ b/Assets/CircularGravityForce/Effects.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: deed9b00ca452614196a9a92746a28ee +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/CircularGravityForce/Effects/CGF_AlignToForce.cs b/Assets/CircularGravityForce/Effects/CGF_AlignToForce.cs new file mode 100644 index 0000000..0be5cba --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_AlignToForce.cs @@ -0,0 +1,214 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf effects, enables align to force effect. +*******************************************************************************************/ +using System; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF))] + public class CGF_AlignToForce : MonoBehaviour + { + #region Events + + public delegate void ApplyAlignToForceEvent(CGF cgf, Rigidbody rigid, Collider coll, Vector3 transPos); + public static event ApplyAlignToForceEvent OnApplyAlignToForceEvent; + + #endregion + + public enum AlignDirection + { + Up, + Down, + Left, + Right, + Forward, + Backward + } + + [SerializeField, Tooltip("Enables align to force.")] + private bool enable = true; + public bool Enable + { + get { return enable; } + set { enable = value; } + } + + [SerializeField, Tooltip("If alignToForce is enabled, lets you pick the align direction of the GameObjects.")] + private AlignDirection alignDirection = AlignDirection.Down; + public AlignDirection _alignDirection + { + get { return alignDirection; } + set { alignDirection = value; } + } + + [SerializeField, Tooltip("Rotation speed.")] + private float rotateSpeed = 1f; + public float RotateSpeed + { + get { return rotateSpeed; } + set { rotateSpeed = value; } + } + + [SerializeField, Tooltip("The maximimum angular velocity of the rigidbody.")] + private float maxAngularVelocity = 7f; + public float MaxAngularVelocity + { + get { return maxAngularVelocity; } + set { maxAngularVelocity = value; } + } + + [SerializeField, Tooltip("Angular velocity damping.")] + private float angularVelocityDamping = 1f; + public float AngularVelocityDamping + { + get { return angularVelocityDamping; } + set { angularVelocityDamping = value; } + } + + [SerializeField, Tooltip("Use closest collider height offset.")] + private bool useClosestColliderHeightOffset = false; + public bool UseClosestColliderHeightOffset + { + get { return useClosestColliderHeightOffset; } + set { useClosestColliderHeightOffset = value; } + } + + [SerializeField, Tooltip("Filter properties options.")] + private CGF.FilterProperties filterProperties; + public CGF.FilterProperties _filterProperties + { + get { return filterProperties; } + set { filterProperties = value; } + } + + private CGF cgf; + + void Awake() + { + CGF.OnApplyCGFEvent += CGF_OnApplyCGFEvent; + + cgf = this.GetComponent(); + } + + void OnDestroy() + { + CGF.OnApplyCGFEvent -= CGF_OnApplyCGFEvent; + } + + private void CGF_OnApplyCGFEvent(CGF cgf, Rigidbody rigid, Collider coll) + { + if (this.cgf == cgf) + { + ApplyAlignment(cgf, rigid, coll); + } + } + + //Applys the alignment + private void ApplyAlignment(CGF cgf, Rigidbody rigid, Collider coll) + { + if (_filterProperties == null) + return; + + if (Enable) + { + if (_filterProperties.ValidateFilters(rigid, coll)) + { + var transPos = this.transform.position; + + switch (cgf._forcePositionProperties.ForcePosition) + { + case CGF.ForcePosition.ThisTransform: + break; + case CGF.ForcePosition.ClosestCollider: + if (cgf._forcePositionProperties.ClosestColliders != null) + { + if (cgf._forcePositionProperties.ClosestColliders.Count > 0) + { + float heightOffset = 0f; + + if (UseClosestColliderHeightOffset) + heightOffset = cgf._forcePositionProperties.HeightOffset; + + if (!cgf._forcePositionProperties.UseEffectedClosestPoint) + { + var point = cgf.FindClosestPoints(rigid.position, cgf._forcePositionProperties.ClosestColliders); + + transPos = cgf.GetVectorHeightOffset(point, rigid.position, heightOffset); + } + else + { + Vector3 pointA = cgf.FindClosestPoints(coll.transform.position, cgf._forcePositionProperties.ClosestColliders); + Vector3 pointB = cgf.FindClosestPoints(pointA, coll); + + float distanceThisA = Vector3.Distance(coll.transform.position, pointA); + float distanceAB = Vector3.Distance(pointA, pointB); + + transPos = cgf.GetVectorHeightOffset(pointA, coll.transform.position, Mathf.Abs(distanceThisA - distanceAB) + heightOffset); + } + } + } + break; + } + + Vector3 newLocal = Vector3.zero; + + switch (_alignDirection) + { + case AlignDirection.Up: + newLocal = -rigid.transform.up; + break; + case AlignDirection.Down: + newLocal = rigid.transform.up; + break; + case AlignDirection.Left: + newLocal = rigid.transform.right; + break; + case AlignDirection.Right: + newLocal = -rigid.transform.right; + break; + case AlignDirection.Forward: + newLocal = -rigid.transform.forward; + break; + case AlignDirection.Backward: + newLocal = rigid.transform.forward; + break; + } + + Quaternion targetRotation = Quaternion.FromToRotation(newLocal, rigid.position - transPos) * rigid.rotation; + + Quaternion deltaRotation = Quaternion.Inverse(rigid.rotation) * targetRotation; + Vector3 deltaAngles = GetRelativeAngles(deltaRotation.eulerAngles); + Vector3 worldDeltaAngles = rigid.transform.TransformDirection(deltaAngles); + + rigid.maxAngularVelocity = MaxAngularVelocity; + rigid.AddTorque((RotateSpeed * worldDeltaAngles) - ((AngularVelocityDamping * rigid.angularVelocity))); + + if (OnApplyAlignToForceEvent != null) + { + OnApplyAlignToForceEvent.Invoke(cgf, rigid, coll, transPos); + } + } + } + } + + // Convert angles above 180 degrees into negative/relative angles + Vector3 GetRelativeAngles(Vector3 angles) + { + Vector3 relativeAngles = angles; + if (relativeAngles.x > 180f) + relativeAngles.x -= 360f; + if (relativeAngles.y > 180f) + relativeAngles.y -= 360f; + if (relativeAngles.z > 180f) + relativeAngles.z -= 360f; + + return relativeAngles; + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Effects/CGF_AlignToForce.cs.meta b/Assets/CircularGravityForce/Effects/CGF_AlignToForce.cs.meta new file mode 100644 index 0000000..3e8ca8f --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_AlignToForce.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7b97dcb9fd140874d8c8d4d10c860a77 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 1e3a9531e1ba07546b9638ba70b6e081, type: 3} + userData: diff --git a/Assets/CircularGravityForce/Effects/CGF_AlignToForce2D.cs b/Assets/CircularGravityForce/Effects/CGF_AlignToForce2D.cs new file mode 100644 index 0000000..ff7e80f --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_AlignToForce2D.cs @@ -0,0 +1,200 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf effects, enables align to force effect. +*******************************************************************************************/ +using System; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF2D))] + public class CGF_AlignToForce2D : MonoBehaviour + { + #region Events + + public delegate void ApplyAlignToForceEvent(CGF2D cgf, Rigidbody2D rigid, Collider2D coll, Vector3 transPos); + public static event ApplyAlignToForceEvent OnApplyAlignToForceEvent; + + #endregion + + public enum AlignDirection + { + Up, + Down, + Left, + Right + } + + [SerializeField, Tooltip("Enables align to force.")] + private bool enable = true; + public bool Enable + { + get { return enable; } + set { enable = value; } + } + + [SerializeField, Tooltip("If alignToForce is enabled, lets you pick the align direction of the GameObjects.")] + private AlignDirection alignDirection = AlignDirection.Down; + public AlignDirection _alignDirection + { + get { return alignDirection; } + set { alignDirection = value; } + } + + [SerializeField, Tooltip("Rotation speed.")] + private float rotateSpeed = 1f; + public float RotateSpeed + { + get { return rotateSpeed; } + set { rotateSpeed = value; } + } + + [SerializeField, Tooltip("Angular velocity damping.")] + private float angularVelocityDamping = 0.1f; + public float AngularVelocityDamping + { + get { return angularVelocityDamping; } + set { angularVelocityDamping = value; } + } + + [SerializeField, Tooltip("Use closest collider height offset.")] + private bool useClosestColliderHeightOffset = false; + public bool UseClosestColliderHeightOffset + { + get { return useClosestColliderHeightOffset; } + set { useClosestColliderHeightOffset = value; } + } + + [SerializeField, Tooltip("Filter properties options.")] + private CGF2D.FilterProperties filterProperties; + public CGF2D.FilterProperties _filterProperties + { + get { return filterProperties; } + set { filterProperties = value; } + } + + private CGF2D cgf; + + void Awake() + { + CGF2D.OnApplyCGFEvent += CGF_OnApplyCGFEvent; + + cgf = this.GetComponent(); + } + + void OnDestroy() + { + CGF2D.OnApplyCGFEvent -= CGF_OnApplyCGFEvent; + } + + private void CGF_OnApplyCGFEvent(CGF2D cgf, Rigidbody2D rigid, Collider2D coll) + { + if (this.cgf == cgf) + { + ApplyAlignment(cgf, rigid, coll); + } + } + + //Applys the alignment + private void ApplyAlignment(CGF2D cgf, Rigidbody2D rigid, Collider2D coll) + { + if (_filterProperties == null) + return; + + if (Enable) + { + if (_filterProperties.ValidateFilters(rigid, coll)) + { + var transPos = this.transform.position; + + switch (cgf._forcePositionProperties.ForcePosition) + { + case CGF.ForcePosition.ThisTransform: + break; + case CGF.ForcePosition.ClosestCollider: + if (cgf._forcePositionProperties.ClosestColliders != null) + { + if (cgf._forcePositionProperties.ClosestColliders.Count > 0) + { + float heightOffset = 0f; + + if (UseClosestColliderHeightOffset) + heightOffset = cgf._forcePositionProperties.HeightOffset; + + if (!cgf._forcePositionProperties.UseEffectedClosestPoint) + { + var point = cgf.FindClosestPoints(coll, cgf._forcePositionProperties.ClosestColliders, false); + transPos = cgf.GetVectorHeightOffset(point, coll.transform.position, heightOffset); + } + else + { + Vector3 pointA = cgf.FindClosestPoints(coll, cgf._forcePositionProperties.ClosestColliders, false); + Vector3 pointB = cgf.FindClosestPoints(coll, cgf._forcePositionProperties.ClosestColliders, true); + + float distanceThisA = Vector3.Distance(coll.transform.position, pointA); + float distanceAB = Vector3.Distance(pointA, pointB); + + transPos = cgf.GetVectorHeightOffset(pointA, coll.transform.position, Mathf.Abs(distanceThisA - distanceAB) + heightOffset); + } + } + } + break; + } + + Vector3 newLocal = Vector3.zero; + + switch (_alignDirection) + { + case AlignDirection.Up: + newLocal = rigid.transform.up; + break; + case AlignDirection.Down: + newLocal = -rigid.transform.up; + break; + case AlignDirection.Left: + newLocal = -rigid.transform.right; + break; + case AlignDirection.Right: + newLocal = rigid.transform.right; + break; + } + + float angle = LookAtAngle(rigid, newLocal, transPos); + + rigid.AddTorque((RotateSpeed * angle) - ((rigid.angularVelocity * AngularVelocityDamping) * Time.deltaTime)); + + if (OnApplyAlignToForceEvent != null) + { + OnApplyAlignToForceEvent.Invoke(cgf, rigid, coll, transPos); + } + } + } + } + + public float LookAtAngle(Rigidbody2D rigid2D, Vector3 alignDirection, Vector3 target) + { + int turnTo = 0; + + Vector3 angleRelativeToMe = target - rigid2D.transform.position; + + //float angleDiff = Vector3.Angle(alignDirection, angleRelativeToMe); + + Vector3 cross = Vector3.Cross(alignDirection, angleRelativeToMe); + + if (cross.z < 0) + { + turnTo = -1; + } + else + { + turnTo = 1; + } + + return turnTo; + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Effects/CGF_AlignToForce2D.cs.meta b/Assets/CircularGravityForce/Effects/CGF_AlignToForce2D.cs.meta new file mode 100644 index 0000000..0aa74ac --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_AlignToForce2D.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 980839e152c5c9549a015c016acc649e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 1e3a9531e1ba07546b9638ba70b6e081, type: 3} + userData: diff --git a/Assets/CircularGravityForce/Effects/CGF_NoGravity.cs b/Assets/CircularGravityForce/Effects/CGF_NoGravity.cs new file mode 100644 index 0000000..1c425a0 --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_NoGravity.cs @@ -0,0 +1,108 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf effects, enables no gravity effect. +*******************************************************************************************/ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF))] + public class CGF_NoGravity : MonoBehaviour + { + public class OnGravity_CGFCollection : CGFCollection + { + public override void UpdateEffectedObject(Rigidbody rigid) + { + base.UpdateEffectedObject(rigid); + + rigid.useGravity = false; + } + + public override void ResetEffectedObject(EffectedObject effectedObject) + { + base.ResetEffectedObject(effectedObject); + + effectedObject._rigidbody.useGravity = true; + } + } + + [SerializeField, Tooltip("Enables no gravity.")] + private bool enable = true; + public bool Enable + { + get { return enable; } + set { enable = value; } + } + + [SerializeField, Tooltip("")] + private float timeEffected = 3f; + public float TimeEffected + { + get { return timeEffected; } + set { timeEffected = value; } + } + + [SerializeField, Tooltip("Filter properties options.")] + private CGF.FilterProperties filterProperties; + public CGF.FilterProperties _filterProperties + { + get { return filterProperties; } + set { filterProperties = value; } + } + + private OnGravity_CGFCollection cgfCollection; + public OnGravity_CGFCollection _cgfCollection + { + get { return cgfCollection; } + set { cgfCollection = value; } + } + + private CGF cgf; + + public CGF_NoGravity() + { + _cgfCollection = new OnGravity_CGFCollection(); + } + + void Awake() + { + CGF.OnApplyCGFEvent += CGF_OnApplyCGFEvent; + + cgf = this.GetComponent(); + } + + void OnDestroy() + { + CGF.OnApplyCGFEvent -= CGF_OnApplyCGFEvent; + } + + private void CGF_OnApplyCGFEvent(CGF cgf, Rigidbody rigid, Collider coll) + { + if (_filterProperties == null) + return; + + if (Enable) + { + if (this.cgf == cgf) + { + if (_filterProperties != null) + { + if (_filterProperties.ValidateFilters(rigid, coll)) + { + _cgfCollection.Add(rigid, Time.time, TimeEffected); + } + } + } + } + } + + void Update() + { + _cgfCollection.Sync(); + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Effects/CGF_NoGravity.cs.meta b/Assets/CircularGravityForce/Effects/CGF_NoGravity.cs.meta new file mode 100644 index 0000000..924dd9b --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_NoGravity.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8356fb58bf8a8e74ca3648eca7e3bb16 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c64924503c2c73b46b95b9c79d1d3dd6, type: 3} + userData: diff --git a/Assets/CircularGravityForce/Effects/CGF_NoGravity2D.cs b/Assets/CircularGravityForce/Effects/CGF_NoGravity2D.cs new file mode 100644 index 0000000..ef24f16 --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_NoGravity2D.cs @@ -0,0 +1,108 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf effects, enables no gravity effect. +*******************************************************************************************/ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF2D))] + public class CGF_NoGravity2D : MonoBehaviour + { + public class OnGravity_CGFCollection : CGFCollection2D + { + public override void UpdateEffectedObject(Rigidbody2D rigid) + { + base.UpdateEffectedObject(rigid); + + rigid.gravityScale = 0f; + } + + public override void ResetEffectedObject(EffectedObject effectedObject) + { + base.ResetEffectedObject(effectedObject); + + effectedObject._rigidbody.gravityScale = 1f; + } + } + + [SerializeField, Tooltip("Enables no gravity.")] + private bool enable = true; + public bool Enable + { + get { return enable; } + set { enable = value; } + } + + [SerializeField, Tooltip("")] + private float timeEffected = 3f; + public float TimeEffected + { + get { return timeEffected; } + set { timeEffected = value; } + } + + [SerializeField, Tooltip("Filter properties options.")] + private CGF2D.FilterProperties filterProperties; + public CGF2D.FilterProperties _filterProperties + { + get { return filterProperties; } + set { filterProperties = value; } + } + + private OnGravity_CGFCollection cgfCollection; + public OnGravity_CGFCollection _cgfCollection + { + get { return cgfCollection; } + set { cgfCollection = value; } + } + + private CGF2D cgf; + + public CGF_NoGravity2D() + { + _cgfCollection = new OnGravity_CGFCollection(); + } + + void Awake() + { + CGF2D.OnApplyCGFEvent += CGF_OnApplyCGFEvent; + + cgf = this.GetComponent(); + } + + void OnDestroy() + { + CGF2D.OnApplyCGFEvent -= CGF_OnApplyCGFEvent; + } + + private void CGF_OnApplyCGFEvent(CGF2D cgf, Rigidbody2D rigid, Collider2D coll) + { + if (_filterProperties == null) + return; + + if (Enable) + { + if (this.cgf == cgf) + { + if (_filterProperties != null) + { + if (_filterProperties.ValidateFilters(rigid, coll)) + { + _cgfCollection.Add(rigid, Time.time, TimeEffected); + } + } + } + } + } + + void Update() + { + _cgfCollection.Sync(); + } + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Effects/CGF_NoGravity2D.cs.meta b/Assets/CircularGravityForce/Effects/CGF_NoGravity2D.cs.meta new file mode 100644 index 0000000..ddbeeb1 --- /dev/null +++ b/Assets/CircularGravityForce/Effects/CGF_NoGravity2D.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f5cec0f401a4a1d4db197093167dc447 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c64924503c2c73b46b95b9c79d1d3dd6, type: 3} + userData: diff --git a/Assets/CircularGravityForce/Mods.meta b/Assets/CircularGravityForce/Mods.meta new file mode 100644 index 0000000..e03c539 --- /dev/null +++ b/Assets/CircularGravityForce/Mods.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a769c8fffb320d84f957d20e13604edf +folderAsset: yes +timeCreated: 1455067499 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Mods/CGF_Pulse.cs b/Assets/CircularGravityForce/Mods/CGF_Pulse.cs new file mode 100644 index 0000000..732b286 --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_Pulse.cs @@ -0,0 +1,208 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf mod, creates a pulse effect using the cgf. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF))] + public class CGF_Pulse : MonoBehaviour + { + #region Classis + + //Pulse properties + [System.Serializable] + public class PulseProperties + { + [SerializeField, Tooltip("Enable/Disable's the pulse.")] + private bool pulse = true; + public bool Pulse + { + get { return pulse; } + set { pulse = value; } + } + + [SerializeField, Tooltip("Speed of the pulse.")] + private float speed = 10f; + public float Speed + { + get { return speed; } + set { speed = value; } + } + + [SerializeField, Tooltip("Min pulse size.")] + private float minSize = 1f; + public float MinSize + { + get { return minSize; } + set { MinSize = value; } + } + + [SerializeField, Tooltip("Max pulse size.")] + private float maxSize = 5f; + public float MaxSize + { + get { return maxSize; } + set { maxSize = value; } + } + + [SerializeField, Tooltip("Min pulse box size.")] + private Vector3 minBoxSize = Vector3.one; + public Vector3 MinBoxSize + { + get { return minBoxSize; } + set { minBoxSize = value; } + } + + [SerializeField, Tooltip("Max pulse box size.")] + private Vector3 maxBoxSize = Vector3.one * 5f; + public Vector3 MaxBoxSize + { + get { return maxBoxSize; } + set { maxBoxSize = value; } + } + } + + #endregion + + #region Properties/Constructor + + [SerializeField, Tooltip("Pulse properties.")] + private PulseProperties pulseProperties; + public PulseProperties _pulseProperties + { + get { return pulseProperties; } + set { pulseProperties = value; } + } + + private CGF cgf; + + //Used to tell whether to add or subtract to pulse + private bool pulse_Positive; + private bool pulse_PositiveBoxX; + private bool pulse_PositiveBoxY; + private bool pulse_PositiveBoxZ; + + public CGF_Pulse() + { + _pulseProperties = new PulseProperties(); + } + + #endregion + + #region Unity Functions + + void Start() + { + cgf = this.GetComponent(); + + //Sets up pulse + if (_pulseProperties.Pulse) + { + cgf.Size = _pulseProperties.MinSize; + pulse_Positive = true; + pulse_PositiveBoxX = true; + pulse_PositiveBoxY = true; + pulse_PositiveBoxZ = true; + } + } + + void Update() + { + if (cgf.Enable) + { + if (_pulseProperties.Pulse) + { + CalculatePulse(); + } + } + } + + #endregion + + #region Functions + + //Calculatie the given pulse + void CalculatePulse() + { + if (_pulseProperties.Pulse) + { + if (cgf._shape != CGF.Shape.Box) + CalculatePulseBySize(); + else + CalculatePulseByBoxSize(); + } + } + + void CalculatePulseBySize() + { + if (pulse_Positive) + { + if (cgf.Size <= _pulseProperties.MaxSize) + cgf.Size = cgf.Size + (_pulseProperties.Speed * Time.deltaTime); + else + pulse_Positive = false; + } + else + { + if (cgf.Size >= _pulseProperties.MinSize) + cgf.Size = cgf.Size - (_pulseProperties.Speed * Time.deltaTime); + else + pulse_Positive = true; + } + } + + void CalculatePulseByBoxSize() + { + if (pulse_PositiveBoxX) + { + if (cgf.BoxSize.x <= _pulseProperties.MaxBoxSize.x) + cgf.BoxSize = new Vector3(cgf.BoxSize.x + (_pulseProperties.Speed * Time.deltaTime), cgf.BoxSize.y, cgf.BoxSize.z); + else + pulse_PositiveBoxX = false; + } + else + { + if (cgf.BoxSize.x >= _pulseProperties.MinBoxSize.x) + cgf.BoxSize = new Vector3(cgf.BoxSize.x - (_pulseProperties.Speed * Time.deltaTime), cgf.BoxSize.y, cgf.BoxSize.z); + else + pulse_PositiveBoxX = true; + } + + if (pulse_PositiveBoxY) + { + if (cgf.BoxSize.y <= _pulseProperties.MaxBoxSize.y) + cgf.BoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y + (_pulseProperties.Speed * Time.deltaTime), cgf.BoxSize.z); + else + pulse_PositiveBoxY = false; + } + else + { + if (cgf.BoxSize.y >= _pulseProperties.MinBoxSize.y) + cgf.BoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y - (_pulseProperties.Speed * Time.deltaTime), cgf.BoxSize.z); + else + pulse_PositiveBoxY = true; + } + + if (pulse_PositiveBoxZ) + { + if (cgf.BoxSize.z <= _pulseProperties.MaxBoxSize.z) + cgf.BoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y, cgf.BoxSize.z + (_pulseProperties.Speed * Time.deltaTime)); + else + pulse_PositiveBoxZ = false; + } + else + { + if (cgf.BoxSize.z >= _pulseProperties.MinBoxSize.z) + cgf.BoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y, cgf.BoxSize.z - (_pulseProperties.Speed * Time.deltaTime)); + else + pulse_PositiveBoxZ = true; + } + } + + #endregion + } +} diff --git a/Assets/CircularGravityForce/Mods/CGF_Pulse.cs.meta b/Assets/CircularGravityForce/Mods/CGF_Pulse.cs.meta new file mode 100644 index 0000000..ddd2a59 --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_Pulse.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 5ee348902befc68469fb62f0e43af39e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: a93e150b85cf97c449c9f73f1eac1c50, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Mods/CGF_Pulse2D.cs b/Assets/CircularGravityForce/Mods/CGF_Pulse2D.cs new file mode 100644 index 0000000..d64f2fe --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_Pulse2D.cs @@ -0,0 +1,187 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf mod, creates a pulse effect using the cgf in 2D. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF2D))] + public class CGF_Pulse2D : MonoBehaviour + { + #region Classis + + //Pulse properties + [System.Serializable] + public class PulseProperties + { + [SerializeField, Tooltip("Enable/Disable's the pulse.")] + private bool pulse = true; + public bool Pulse + { + get { return pulse; } + set { pulse = value; } + } + [SerializeField, Tooltip("Speed of the pulse.")] + private float speed = 10f; + public float Speed + { + get { return speed; } + set { speed = value; } + } + [SerializeField, Tooltip("Min pulse size.")] + private float minSize = 1f; + public float MinSize + { + get { return minSize; } + set { MinSize = value; } + } + [SerializeField, Tooltip("Max pulse size.")] + private float maxSize = 5f; + public float MaxSize + { + get { return maxSize; } + set { maxSize = value; } + } + + [SerializeField, Tooltip("Min pulse box size.")] + private Vector2 minBoxSize = Vector2.one; + public Vector2 MinBoxSize + { + get { return minBoxSize; } + set { minBoxSize = value; } + } + + [SerializeField, Tooltip("Max pulse box size.")] + private Vector2 maxBoxSize = Vector2.one * 5f; + public Vector2 MaxBoxSize + { + get { return maxBoxSize; } + set { maxBoxSize = value; } + } + } + + #endregion + + #region Properties/Constructor + + [SerializeField, Tooltip("Pulse properties.")] + private PulseProperties pulseProperties; + public PulseProperties _pulseProperties + { + get { return pulseProperties; } + set { pulseProperties = value; } + } + + private CGF2D cgf; + + //Used to tell whether to add or subtract to pulse + private bool pulse_Positive; + private bool pulse_PositiveBoxX; + private bool pulse_PositiveBoxY; + + public CGF_Pulse2D() + { + _pulseProperties = new PulseProperties(); + } + + #endregion + + #region Unity Functions + + void Start() + { + cgf = this.GetComponent(); + + if (_pulseProperties.Pulse) + { + cgf.Size = _pulseProperties.MinSize; + pulse_Positive = true; + pulse_PositiveBoxX = true; + pulse_PositiveBoxY = true; + } + } + + void Update() + { + if (cgf.Enable) + { + if (_pulseProperties.Pulse) + { + CalculatePulse(); + } + } + } + + #endregion + + #region Functions + + //Calculatie the given pulse + void CalculatePulse() + { + if (_pulseProperties.Pulse) + { + if (cgf._shape2D != CGF2D.Shape2D.Box) + CalculatePulseBySize(); + else + CalculatePulseByBoxSize(); + } + } + + void CalculatePulseBySize() + { + if (pulse_Positive) + { + if (cgf.Size <= _pulseProperties.MaxSize) + cgf.Size = cgf.Size + (_pulseProperties.Speed * Time.deltaTime); + else + pulse_Positive = false; + } + else + { + if (cgf.Size >= _pulseProperties.MinSize) + cgf.Size = cgf.Size - (_pulseProperties.Speed * Time.deltaTime); + else + pulse_Positive = true; + } + } + + void CalculatePulseByBoxSize() + { + if (pulse_PositiveBoxX) + { + if (cgf.BoxSize.x <= _pulseProperties.MaxBoxSize.x) + cgf.BoxSize = new Vector2(cgf.BoxSize.x + (_pulseProperties.Speed * Time.deltaTime), cgf.BoxSize.y); + else + pulse_PositiveBoxX = false; + } + else + { + if (cgf.BoxSize.x >= _pulseProperties.MinBoxSize.x) + cgf.BoxSize = new Vector2(cgf.BoxSize.x - (_pulseProperties.Speed * Time.deltaTime), cgf.BoxSize.y); + else + pulse_PositiveBoxX = true; + } + + if (pulse_PositiveBoxY) + { + if (cgf.BoxSize.y <= _pulseProperties.MaxBoxSize.y) + cgf.BoxSize = new Vector2(cgf.BoxSize.x, cgf.BoxSize.y + (_pulseProperties.Speed * Time.deltaTime)); + else + pulse_PositiveBoxY = false; + } + else + { + if (cgf.BoxSize.y >= _pulseProperties.MinBoxSize.y) + cgf.BoxSize = new Vector2(cgf.BoxSize.x, cgf.BoxSize.y - (_pulseProperties.Speed * Time.deltaTime)); + else + pulse_PositiveBoxY = true; + } + } + + #endregion + } +} diff --git a/Assets/CircularGravityForce/Mods/CGF_Pulse2D.cs.meta b/Assets/CircularGravityForce/Mods/CGF_Pulse2D.cs.meta new file mode 100644 index 0000000..889cc6b --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_Pulse2D.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 119293b2e68399a428b0e9b658187b31 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: a93e150b85cf97c449c9f73f1eac1c50, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast.cs b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast.cs new file mode 100644 index 0000000..7a3e39c --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast.cs @@ -0,0 +1,179 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf mod, sizes the cgf object based of the raycast hit point. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF))] + public class CGF_SizeByRaycast : MonoBehaviour + { + #region Properties + + [SerializeField, Tooltip("Offset the raycast.")] + private float offsetRaycast = 1f; + public float OffsetRaycast + { + get { return offsetRaycast; } + set { offsetRaycast = value; } + } + + [SerializeField, Tooltip("Max size that the circular gravity force can get.")] + private float maxCgfSize = 10f; + public float MaxCgfSize + { + get { return maxCgfSize; } + set { maxCgfSize = value; } + } + + [SerializeField, Tooltip("Doesnt size box size x.")] + private bool dontSizeBoxSizeX = false; + public bool DontSizeBoxSizeX + { + get { return dontSizeBoxSizeX; } + set { dontSizeBoxSizeX = value; } + } + + [SerializeField, Tooltip("Doesnt size box size y.")] + private bool dontSizeBoxSizeY = false; + public bool DontSizeBoxSizeY + { + get { return dontSizeBoxSizeY; } + set { dontSizeBoxSizeY = value; } + } + + [SerializeField, Tooltip("Doesnt size box size z.")] + private bool dontSizeBoxSizeZ = false; + public bool DontSizeBoxSizeZ + { + get { return dontSizeBoxSizeZ; } + set { dontSizeBoxSizeZ = value; } + } + + [SerializeField, Tooltip("Raycast hit point."), HideInInspector()] + private Vector3 hitPoint; + public Vector3 HitPoint + { + get { return hitPoint; } + set { hitPoint = value; } + } + + [SerializeField, Tooltip("Layer mask used with the ray cast.")] + private LayerMask layerMask = -1; + public LayerMask _layerMask + { + get { return layerMask; } + set { layerMask = value; } + } + + private CGF cgf; + + private float gizmoSize = .25f; + + #endregion + + #region Gizmos + + void OnDrawGizmos() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.forward); + + RaycastHit hitInfo; + + if(this.GetComponent() != null) + { + gizmoSize = (this.GetComponent().Size / 8f); + if (gizmoSize > .25f) + gizmoSize = .25f; + else if (gizmoSize < -.25f) + gizmoSize = -.25f; + } + + Color activeColor = Color.cyan; + Color nonActiveColor = Color.white; + + if (Physics.Raycast(this.transform.position, fwd, out hitInfo, MaxCgfSize, _layerMask)) + { + if (hitInfo.distance > maxCgfSize) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(this.transform.position, hitInfo.point); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + return; + } + + Gizmos.color = activeColor; + Gizmos.DrawLine(this.transform.position, hitInfo.point); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + Gizmos.DrawSphere(hitInfo.point + (fwd * OffsetRaycast), gizmoSize); + } + else + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(this.transform.position, this.transform.position + (fwd * MaxCgfSize)); + } + } + + #endregion + + #region Unity Functions + + // Use this for initialization + void Start() + { + cgf = this.GetComponent(); + + cgf.Size = maxCgfSize; + } + + // Update is called once per frame + void Update() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.forward); + + RaycastHit hitInfo; + + float setSize = cgf.Size; + + if (Physics.Raycast(this.transform.position, fwd, out hitInfo, MaxCgfSize, _layerMask)) + { + if (hitInfo.distance > maxCgfSize) + { + setSize = maxCgfSize + OffsetRaycast; + return; + } + + setSize = hitInfo.distance + OffsetRaycast; + + hitPoint = hitInfo.point; + } + + if(hitInfo.distance == 0) + { + hitPoint = Vector3.zero; + setSize = maxCgfSize + OffsetRaycast; + } + + if(cgf._shape != CGF.Shape.Box) + cgf.Size = setSize; + else + { + Vector3 setBoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y, cgf.BoxSize.z); + if (!DontSizeBoxSizeX) + setBoxSize = new Vector3(setSize, setBoxSize.y, setBoxSize.z); + if (!DontSizeBoxSizeY) + setBoxSize = new Vector3(setBoxSize.x, setSize, setBoxSize.z); + if (!DontSizeBoxSizeZ) + setBoxSize = new Vector3(setBoxSize.x, setBoxSize.y, setSize); + + cgf.BoxSize = setBoxSize; + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast.cs.meta b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast.cs.meta new file mode 100644 index 0000000..5eeef13 --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b6b9e89e01af01040a1b0c2237670ad8 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: dea38dc476f629e4a8e621ac392c18c4, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast2D.cs b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast2D.cs new file mode 100644 index 0000000..7fc3b5d --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast2D.cs @@ -0,0 +1,168 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf mod, sizes the cgf object based of the raycast hit point in 2D. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace CircularGravityForce +{ + [RequireComponent(typeof(CGF2D))] + public class CGF_SizeByRaycast2D : MonoBehaviour + { + #region Properties + + [SerializeField, Tooltip("Offset the raycast.")] + private float offsetRaycast = 1f; + public float OffsetRaycast + { + get { return offsetRaycast; } + set { offsetRaycast = value; } + } + + [SerializeField, Tooltip("Max size that the circular gravity force can get.")] + private float maxCgfSize = 10f; + public float MaxCgfSize + { + get { return maxCgfSize; } + set { maxCgfSize = value; } + } + + [SerializeField, Tooltip("Doesnt size box size x.")] + private bool dontSizeBoxSizeX = false; + public bool DontSizeBoxSizeX + { + get { return dontSizeBoxSizeX; } + set { dontSizeBoxSizeX = value; } + } + + [SerializeField, Tooltip("Doesnt size box size y.")] + private bool dontSizeBoxSizeY = false; + public bool DontSizeBoxSizeY + { + get { return dontSizeBoxSizeY; } + set { dontSizeBoxSizeY = value; } + } + + [SerializeField, Tooltip("Raycast hit point.")] + private Vector2 hitPoint; + public Vector2 HitPoint + { + get { return hitPoint; } + set { hitPoint = value; } + } + + [SerializeField, Tooltip("Layer mask used with the ray cast.")] + private LayerMask layerMask = -1; + public LayerMask _layerMask + { + get { return layerMask; } + set { layerMask = value; } + } + + private CGF2D cgf; + + private float gizmoSize = .25f; + + #endregion + + #region Gizmos + + void OnDrawGizmos() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.right); + + RaycastHit2D hitInfo = Physics2D.Raycast(this.transform.position, fwd, MaxCgfSize, _layerMask); + + if (this.GetComponent() != null) + { + gizmoSize = (this.GetComponent().Size / 8f); + if (gizmoSize > .25f) + gizmoSize = .25f; + else if (gizmoSize < -.25f) + gizmoSize = -.25f; + } + + Color activeColor = Color.cyan; + Color nonActiveColor = Color.white; + + if (hitInfo.transform == null) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(new Vector3(this.transform.position.x, this.transform.position.y, 0f), new Vector3(this.transform.position.x, this.transform.position.y, 0f) + (fwd * MaxCgfSize)); + return; + } + + if (Vector2.Distance(this.transform.position, hitInfo.point) > maxCgfSize) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(new Vector3(this.transform.position.x, this.transform.position.y, 0f), hitInfo.point); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + return; + } + else if(hitInfo.transform != null) + { + Gizmos.color = activeColor; + Gizmos.DrawLine(new Vector3(this.transform.position.x, this.transform.position.y, 0f), hitInfo.point); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + Gizmos.DrawSphere((Vector3)hitInfo.point + (fwd * OffsetRaycast), gizmoSize); + } + } + + #endregion + + #region Unity Functions + + // Use this for initialization + void Start() + { + cgf = this.GetComponent(); + + cgf.Size = maxCgfSize; + } + + // Update is called once per frame + void Update() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.right); + + RaycastHit2D hitInfo = Physics2D.Raycast(this.transform.position, fwd, MaxCgfSize, _layerMask); + + float setSize = cgf.Size; + + if (Vector2.Distance(this.transform.position, hitInfo.point) > maxCgfSize) + { + setSize = maxCgfSize + OffsetRaycast; + hitPoint = hitInfo.point; + return; + } + + if (Vector2.Distance(this.transform.position, hitInfo.point) == 0) + { + setSize = maxCgfSize + OffsetRaycast; + hitPoint = Vector2.zero; + } + else + { + setSize = Vector2.Distance(this.transform.position, hitInfo.point) + OffsetRaycast; + hitPoint = hitInfo.point; + } + + if (cgf._shape2D != CGF2D.Shape2D.Box) + cgf.Size = setSize; + else + { + Vector2 setBoxSize = new Vector3(cgf.BoxSize.x, cgf.BoxSize.y); + if (!DontSizeBoxSizeX) + setBoxSize = new Vector3(setSize, setBoxSize.y); + if (!DontSizeBoxSizeY) + setBoxSize = new Vector3(setBoxSize.x, setSize); + + cgf.BoxSize = setBoxSize; + } + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast2D.cs.meta b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast2D.cs.meta new file mode 100644 index 0000000..c47aca4 --- /dev/null +++ b/Assets/CircularGravityForce/Mods/CGF_SizeByRaycast2D.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0e62eb3613f3fad428e3536b7c331fab +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: dea38dc476f629e4a8e621ac392c18c4, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Triggers.meta b/Assets/CircularGravityForce/Triggers.meta new file mode 100644 index 0000000..d3bd7db --- /dev/null +++ b/Assets/CircularGravityForce/Triggers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 657d2602955c21b4d905fef2dbcd2cfb +folderAsset: yes +timeCreated: 1455067499 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger.cs b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger.cs new file mode 100644 index 0000000..49835f0 --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger.cs @@ -0,0 +1,130 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf trigger, used for enabling or disabling based of if the raycast +* is tripped. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; + +namespace CircularGravityForce +{ + public class CGF_EnableTrigger : MonoBehaviour + { + #region Properties + + [SerializeField, Tooltip("Circular gravity force object used for the enable trigger.")] + private CGF cgf; + public CGF Cgf + { + get { return cgf; } + set { cgf = value; } + } + + [SerializeField, Tooltip("Value when tripped.")] + private bool tripValue = true; + public bool TripValue + { + get { return tripValue; } + set { tripValue = value; } + } + + [SerializeField, Tooltip("Max trip wire distance.")] + private float maxTripDistance = 10f; + public float MaxTripDistance + { + get { return maxTripDistance; } + set { maxTripDistance = value; } + } + + //Used for if you want to ignore a layer + [SerializeField, Tooltip("Layer mask used for the ray cast.")] + private LayerMask layerMask = -1; + public LayerMask _layerMask + { + get { return layerMask; } + set { layerMask = value; } + } + + private float gizmoSize = .25f; + + #endregion + + #region Gizmos + + void OnDrawGizmos() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.forward); + + RaycastHit hitInfo; + + if (cgf != null) + { + gizmoSize = (cgf.Size / 8f); + if (gizmoSize > .25f) + gizmoSize = .25f; + else if (gizmoSize < -.25f) + gizmoSize = -.25f; + } + + Color activeColor = Color.cyan; + Color nonActiveColor = Color.white; + + if (Physics.Raycast(this.transform.position, fwd, out hitInfo, maxTripDistance, _layerMask)) + { + if (hitInfo.distance > maxTripDistance) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(this.transform.position, hitInfo.point); + Gizmos.DrawSphere(this.transform.position, gizmoSize); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + return; + } + + Gizmos.color = activeColor; + Gizmos.DrawLine(this.transform.position, hitInfo.point); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + } + else + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(this.transform.position, this.transform.position + (fwd * MaxTripDistance)); + } + + Gizmos.DrawSphere(this.transform.position, gizmoSize); + } + + #endregion + + #region Unity Functions + + void Start() + { + cgf.Enable = !TripValue; + } + + void Update() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.forward); + + RaycastHit hitInfo; + + if (Physics.Raycast(this.transform.position, fwd, out hitInfo, maxTripDistance, _layerMask)) + { + if (hitInfo.distance > maxTripDistance) + { + cgf.Enable = !TripValue; + return; + } + + cgf.Enable = TripValue; + } + else + { + cgf.Enable = !TripValue; + } + } + + #endregion + } +} diff --git a/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger.cs.meta b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger.cs.meta new file mode 100644 index 0000000..003e04d --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2aa51042984638f49b17f6d428c08f0c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c76c8054dda1d5b419f45f0fe57f07d3, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger2D.cs b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger2D.cs new file mode 100644 index 0000000..a158e6d --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger2D.cs @@ -0,0 +1,131 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf trigger, used for enabling or disabling based of if the raycast +* is tripped in 2D. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; + +namespace CircularGravityForce +{ + public class CGF_EnableTrigger2D : MonoBehaviour + { + #region Properties + + [SerializeField, Tooltip("Circular gravity force object used for the enable trigger.")] + private CGF2D cgf; + public CGF2D Cgf + { + get { return cgf; } + set { cgf = value; } + } + + [SerializeField, Tooltip("Value when tripped.")] + private bool tripValue = true; + public bool TripValue + { + get { return tripValue; } + set { tripValue = value; } + } + + [SerializeField, Tooltip("Max trip wire distance.")] + private float maxTripDistance = 10f; + public float MaxTripDistance + { + get { return maxTripDistance; } + set { maxTripDistance = value; } + } + + //Used for if you want to ignore a layer + [SerializeField, Tooltip("Layer mask used for the ray cast.")] + private LayerMask layerMask = -1; + public LayerMask _layerMask + { + get { return layerMask; } + set { layerMask = value; } + } + + private float gizmoSize = .25f; + + #endregion + + #region Gizmos + + void OnDrawGizmos() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.right); + + RaycastHit2D hitInfo = Physics2D.Raycast(this.transform.position, fwd, maxTripDistance, _layerMask); + + if (cgf != null) + { + gizmoSize = (cgf.Size / 8f); + if (gizmoSize > .25f) + gizmoSize = .25f; + else if (gizmoSize < -.25f) + gizmoSize = -.25f; + } + + Color activeColor = Color.cyan; + Color nonActiveColor = Color.white; + + Gizmos.DrawSphere(this.transform.position, gizmoSize); + + if (hitInfo.transform == null) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(this.transform.position, this.transform.position + (fwd * maxTripDistance)); + return; + } + + if (Vector2.Distance(this.transform.position, hitInfo.point) > maxTripDistance) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine (this.transform.position, hitInfo.point); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + return; + } + else if (hitInfo.transform != null) + { + Gizmos.color = activeColor; + Gizmos.DrawLine (this.transform.position, hitInfo.point); + Gizmos.DrawSphere(this.transform.position, gizmoSize); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + } + } + + #endregion + + #region Unity Functions + + void Start() + { + cgf.Enable = !TripValue; + } + + void Update() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.right); + + RaycastHit2D hitInfo = Physics2D.Raycast(this.transform.position, fwd, maxTripDistance, _layerMask); + + if (Vector2.Distance(this.transform.position, hitInfo.point) > maxTripDistance) + { + cgf.Enable = !TripValue; + return; + } + + if (hitInfo.transform != null) + { + cgf.Enable = TripValue; + } + else + { + cgf.Enable = !TripValue; + } + } + + #endregion + } +} diff --git a/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger2D.cs.meta b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger2D.cs.meta new file mode 100644 index 0000000..bea1662 --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_EnableTrigger2D.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: be77292b8f0ebb946b66dc461e4bb3d1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c76c8054dda1d5b419f45f0fe57f07d3, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger.cs b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger.cs new file mode 100644 index 0000000..fecbccc --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger.cs @@ -0,0 +1,133 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf trigger, used creating a hover effect using the cgf object. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace CircularGravityForce +{ + public class CGF_HoverTrigger : MonoBehaviour + { + #region Properties + + [SerializeField, Tooltip("Circular gravity force object used for the hover trigger.")] + private CGF cgf; + public CGF Cgf + { + get { return cgf; } + set { cgf = value; } + } + + [SerializeField, Tooltip("Hover force power.")] + private float forcePower = 30f; + public float ForcePower + { + get { return forcePower; } + set { forcePower = value; } + } + + [SerializeField, Tooltip("Hover distance.")] + private float hoverDistance = 3f; + public float HoverDistance + { + get { return hoverDistance; } + set { hoverDistance = value; } + } + + [SerializeField, Tooltip("Max distace it can hover.")] + private float maxDistance = 10f; + public float MaxDistance + { + get { return maxDistance; } + set { maxDistance = value; } + } + + [SerializeField, Tooltip("Layer mask used from the ray cast.")] + private LayerMask layerMask = -1; + public LayerMask _layerMask + { + get { return layerMask; } + set { layerMask = value; } + } + + private float gizmoSize = .25f; + + #endregion + + #region Gizmos + + void OnDrawGizmos() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.forward); + + RaycastHit hitInfo; + + if (cgf != null) + { + gizmoSize = (cgf.Size / 8f); + if (gizmoSize > .25f) + gizmoSize = .25f; + else if (gizmoSize < -.25f) + gizmoSize = -.25f; + } + + Color activeColor = Color.cyan; + Color nonActiveColor = Color.white; + + if (Physics.Raycast(this.transform.position, fwd, out hitInfo, maxDistance, _layerMask)) + { + if (hitInfo.distance < maxDistance) + { + Gizmos.color = activeColor; + } + else + { + Gizmos.color = nonActiveColor; + } + + Gizmos.DrawLine(this.transform.position, hitInfo.point); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + } + else + { + Gizmos.color = Color.white; + Gizmos.DrawLine(this.transform.position, this.transform.position + (fwd * MaxDistance)); + } + + Gizmos.DrawSphere(this.transform.position, gizmoSize); + } + + #endregion + + #region Unity Functions + + void Update() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.forward); + + RaycastHit hitInfo; + + if (Physics.Raycast(this.transform.position, fwd, out hitInfo, maxDistance, _layerMask)) + { + if (hitInfo.distance < maxDistance) + { + float proportionalHeight = (HoverDistance - hitInfo.distance) / HoverDistance; + cgf.ForcePower = proportionalHeight * ForcePower; + } + else + { + cgf.ForcePower = 0f; + } + } + else + { + cgf.ForcePower = 0f; + } + } + + #endregion + } +} diff --git a/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger.cs.meta b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger.cs.meta new file mode 100644 index 0000000..5d83086 --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d085fa86d99f0de4c830db21db27619a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: ebbfe06719ef10141a69ac0f48c3dc63, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger2D.cs b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger2D.cs new file mode 100644 index 0000000..783d232 --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger2D.cs @@ -0,0 +1,133 @@ +/******************************************************************************************* +* Author: Lane Gresham, AKA LaneMax +* Websites: http://resurgamstudios.com +* Description: Used for cgf trigger, used creating a hover effect using the cgf object in 2D. +*******************************************************************************************/ +using UnityEngine; +using System.Collections; + +namespace CircularGravityForce +{ + public class CGF_HoverTrigger2D : MonoBehaviour + { + #region Properties + + [SerializeField, Tooltip("Circular gravity force object used for the hover trigger.")] + private CGF2D cgf; + public CGF2D Cgf + { + get { return cgf; } + set { cgf = value; } + } + + [SerializeField, Tooltip("Hover force power.")] + private float forcePower = 30f; + public float ForcePower + { + get { return forcePower; } + set { forcePower = value; } + } + + [SerializeField, Tooltip("Max distace it can hover.")] + private float hoverDistance = 3f; + public float HoverDistance + { + get { return hoverDistance; } + set { hoverDistance = value; } + } + + [SerializeField, Tooltip("Max distace it can hover.")] + private float maxDistance = 10f; + public float MaxDistance + { + get { return maxDistance; } + set { maxDistance = value; } + } + + [SerializeField, Tooltip("Layer mask used from the ray cast.")] + private LayerMask layerMask = -1; + public LayerMask _layerMask + { + get { return layerMask; } + set { layerMask = value; } + } + + private float gizmoSize = .25f; + + #endregion + + #region Gizmos + + void OnDrawGizmos() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.right); + + RaycastHit2D hitInfo = Physics2D.Raycast(this.transform.position, fwd, MaxDistance, _layerMask); + + if (cgf != null) + { + gizmoSize = (cgf.Size / 8f); + if (gizmoSize > .25f) + gizmoSize = .25f; + else if (gizmoSize < -.25f) + gizmoSize = -.25f; + } + + Color activeColor = Color.cyan; + Color nonActiveColor = Color.white; + + Gizmos.DrawSphere(this.transform.position, gizmoSize); + + if (hitInfo.transform == null) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(this.transform.position, this.transform.position + (fwd * MaxDistance)); + return; + } + + if (Vector2.Distance(this.transform.position, hitInfo.point) > maxDistance) + { + Gizmos.color = nonActiveColor; + Gizmos.DrawLine(this.transform.position, hitInfo.point); + + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + return; + } + else if (hitInfo.transform != null) + { + Gizmos.color = activeColor; + Gizmos.DrawLine(this.transform.position, hitInfo.point); + Gizmos.DrawSphere(this.transform.position, gizmoSize); + Gizmos.DrawSphere(hitInfo.point, gizmoSize); + } + } + + #endregion + + #region Unity Functions + + void Update() + { + Vector3 fwd = this.transform.TransformDirection(Vector3.right); + + RaycastHit2D hitInfo = Physics2D.Raycast(this.transform.position, fwd, MaxDistance, _layerMask); + + if (Vector2.Distance(this.transform.position, hitInfo.point) > maxDistance) + { + cgf.ForcePower = 0f; + } + + if (hitInfo.transform != null) + { + float proportionalHeight = (HoverDistance - Vector2.Distance(this.transform.position, hitInfo.point)) / HoverDistance; + cgf.ForcePower = proportionalHeight * ForcePower; + } + else + { + cgf.ForcePower = 0f; + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger2D.cs.meta b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger2D.cs.meta new file mode 100644 index 0000000..5b76c6b --- /dev/null +++ b/Assets/CircularGravityForce/Triggers/CGF_HoverTrigger2D.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a037ad42fe338704ca48e18a9573104d +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: ebbfe06719ef10141a69ac0f48c3dc63, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/.gitattributes b/Assets/LipSync-Pro-main/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/Assets/LipSync-Pro-main/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Assets/LipSync-Pro-main/.gitignore b/Assets/LipSync-Pro-main/.gitignore new file mode 100644 index 0000000..6a7bb50 --- /dev/null +++ b/Assets/LipSync-Pro-main/.gitignore @@ -0,0 +1,36 @@ +[Ll]ibrary/ +[Tt]emp/ +[Oo]bj/ +[Bb]uild/ +[Bb]uilds/ +Assets/AssetStoreTools* + +# Visual Studio cache directory +.vs/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta + +# Unity3D Generated File On Crash Reports +sysinfo.txt + +# Builds +*.apk diff --git a/Assets/LipSync-Pro-main/LICENSE b/Assets/LipSync-Pro-main/LICENSE new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/Assets/LipSync-Pro-main/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources.meta new file mode 100644 index 0000000..e6910e8 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7e1a699a1b75abb4dac134babfa44ec3 +folderAsset: yes +timeCreated: 1460064333 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital.meta new file mode 100644 index 0000000..7f9597b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 03c69fbb18292aa46b90a5c808f0d2ba +folderAsset: yes +timeCreated: 1460048946 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller.meta new file mode 100644 index 0000000..8f0c3a2 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d8d15755430de914492a3a8db939c95b +folderAsset: yes +timeCreated: 1460048965 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark.meta new file mode 100644 index 0000000..55a73c2 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3a35b6bd7fd62fa4799895aea5daba76 +folderAsset: yes +timeCreated: 1453865904 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark/eyecontroller_logo.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark/eyecontroller_logo.png new file mode 100644 index 0000000..96e33fa Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark/eyecontroller_logo.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark/eyecontroller_logo.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark/eyecontroller_logo.png.meta new file mode 100644 index 0000000..78c6437 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Dark/eyecontroller_logo.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 2525d7dd0b483f04cb6041834e9e9258 +timeCreated: 1437475031 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light.meta new file mode 100644 index 0000000..60aa109 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e2f4ecf58f896e04794bd70f47bbe5cb +folderAsset: yes +timeCreated: 1453865900 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light/eyecontroller_logo.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light/eyecontroller_logo.png new file mode 100644 index 0000000..466597c Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light/eyecontroller_logo.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light/eyecontroller_logo.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light/eyecontroller_logo.png.meta new file mode 100644 index 0000000..b11149a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Eye Controller/Light/eyecontroller_logo.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 89e45c2302a94e6448de70e990db1a9c +timeCreated: 1437475031 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync.meta new file mode 100644 index 0000000..a2c13f7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bc25f7a6a8777034cb0623e966ffe219 +folderAsset: yes +timeCreated: 1460048952 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark.meta new file mode 100644 index 0000000..8bd3d48 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 476c7b8a00c55fb458e56d9c64e3f564 +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/down.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/down.png new file mode 100644 index 0000000..2eab425 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/down.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/down.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/down.png.meta new file mode 100644 index 0000000..b0389c8 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/down.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 97e233bb76603fc458cf36e8b8b516c8 +timeCreated: 1548722281 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/eye.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/eye.png new file mode 100644 index 0000000..80e4cd0 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/eye.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/eye.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/eye.png.meta new file mode 100644 index 0000000..e8d130e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/eye.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 9d6b0fcdbd4d0944789be04b43aa2de6 +timeCreated: 1453683423 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/icon.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/icon.png new file mode 100644 index 0000000..eab26bb Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/icon.png.meta new file mode 100644 index 0000000..dd9113f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 178b5e2d56e9d7647b798d7c2ff2506e +timeCreated: 1437065427 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/list.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/list.png new file mode 100644 index 0000000..0efb900 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/list.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/list.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/list.png.meta new file mode 100644 index 0000000..951a62b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/list.png.meta @@ -0,0 +1,114 @@ +fileFormatVersion: 2 +guid: a79853d7db6427b47b2d60eb59f33336 +timeCreated: 1513773938 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/locked.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/locked.png new file mode 100644 index 0000000..234a3ea Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/locked.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/locked.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/locked.png.meta new file mode 100644 index 0000000..d8a3dcc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/locked.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 5c8b65da1aa2ce94880df4af0ec77a3b +timeCreated: 1442429884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/logo_component.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/logo_component.png new file mode 100644 index 0000000..dcb8fc5 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/logo_component.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/logo_component.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/logo_component.png.meta new file mode 100644 index 0000000..4167da3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/logo_component.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 66f6896bb34e6d24da76779123904301 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/loop.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/loop.png new file mode 100644 index 0000000..7d93adf Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/loop.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/loop.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/loop.png.meta new file mode 100644 index 0000000..afb7297 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/loop.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: be5e652005382264ca6aa3001280114e +timeCreated: 1455410616 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/minus.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/minus.png new file mode 100644 index 0000000..a36d5b5 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/minus.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/minus.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/minus.png.meta new file mode 100644 index 0000000..c6f0480 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/minus.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: c58a7e0be8bb50040a4a9f653a66b485 +timeCreated: 1548722361 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/pause.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/pause.png new file mode 100644 index 0000000..e35fd27 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/pause.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/pause.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/pause.png.meta new file mode 100644 index 0000000..8402c4c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/pause.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 123000b7ed0e6e64a84605e7e78b7967 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/play.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/play.png new file mode 100644 index 0000000..1f3b0d5 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/play.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/play.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/play.png.meta new file mode 100644 index 0000000..ff1718a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/play.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 17d43a8e0f71ad0419776853367a7ca3 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/plus.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/plus.png new file mode 100644 index 0000000..1eb4bfd Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/plus.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/plus.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/plus.png.meta new file mode 100644 index 0000000..208f4df --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/plus.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 72e32e0135a07f348ad056dda99ad598 +timeCreated: 1548722361 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/presets.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/presets.png new file mode 100644 index 0000000..552cb92 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/presets.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/presets.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/presets.png.meta new file mode 100644 index 0000000..0cd5d22 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/presets.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 4d1bcd7209c7c584797e61f70611027c +timeCreated: 1449850423 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/record.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/record.png new file mode 100644 index 0000000..4158447 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/record.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/record.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/record.png.meta new file mode 100644 index 0000000..9a1ec69 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/record.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 17766184ea1f69544ac8a41d6eddfbe1 +timeCreated: 1559142085 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/save.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/save.png new file mode 100644 index 0000000..8ee5007 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/save.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/save.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/save.png.meta new file mode 100644 index 0000000..537d82e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/save.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: c043b6f0681bea245b14a271b2104391 +timeCreated: 1548723327 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/search.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/search.png new file mode 100644 index 0000000..0eac6fd Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/search.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/search.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/search.png.meta new file mode 100644 index 0000000..e37e357 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/search.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: b611fee8b6009a54c925470a487e2555 +timeCreated: 1476407810 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/settings.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/settings.png new file mode 100644 index 0000000..1197df1 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/settings.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/settings.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/settings.png.meta new file mode 100644 index 0000000..38f85b3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/settings.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 19c8fd5cda9cb4e40bb7cf2b883e2494 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/stop.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/stop.png new file mode 100644 index 0000000..e0a7164 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/stop.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/stop.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/stop.png.meta new file mode 100644 index 0000000..5a0ae9d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/stop.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 4aa63cf7169dafe469978d48daa1bc31 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/track.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/track.png new file mode 100644 index 0000000..b9004fa Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/track.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/track.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/track.png.meta new file mode 100644 index 0000000..1d262cc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/track.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 498eeaec2d4403a4d867e88ee0f24c3e +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/unlocked.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/unlocked.png new file mode 100644 index 0000000..2996d84 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/unlocked.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/unlocked.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/unlocked.png.meta new file mode 100644 index 0000000..a7eb0b3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/unlocked.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 1bab052f4195c314183c84e6ef90433f +timeCreated: 1442429884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/up.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/up.png new file mode 100644 index 0000000..0b60a26 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/up.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/up.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/up.png.meta new file mode 100644 index 0000000..28437d0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Dark/up.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 881e795ab77ded143aa169bb9502533c +timeCreated: 1548722281 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides.meta new file mode 100644 index 0000000..cdfda14 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9d04e1ed6339bdf43b32ca82172e299c +folderAsset: yes +timeCreated: 1435339608 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/AI.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/AI.png new file mode 100644 index 0000000..e9e21b4 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/AI.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/AI.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/AI.png.meta new file mode 100644 index 0000000..b14ce60 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/AI.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 3161e702c666a1f4d8cedfae9e7b1a5e +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/E.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/E.png new file mode 100644 index 0000000..c26d3d5 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/E.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/E.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/E.png.meta new file mode 100644 index 0000000..b38bef1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/E.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: c2b822832e10eca4fa278f1b51daa26e +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/FV.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/FV.png new file mode 100644 index 0000000..52da3cd Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/FV.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/FV.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/FV.png.meta new file mode 100644 index 0000000..c5a3e48 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/FV.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 525ebc52f22477e4286d8acd16dacb46 +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/L.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/L.png new file mode 100644 index 0000000..f7c58f2 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/L.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/L.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/L.png.meta new file mode 100644 index 0000000..6f43008 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/L.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 0cabe6e82f6fd7443bc6e668eb1c7ddd +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/MBP.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/MBP.png new file mode 100644 index 0000000..54291ca Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/MBP.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/MBP.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/MBP.png.meta new file mode 100644 index 0000000..6917f37 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/MBP.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: fb719555aa26eb14288cae4787f11f28 +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/O.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/O.png new file mode 100644 index 0000000..c235f20 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/O.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/O.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/O.png.meta new file mode 100644 index 0000000..5f71ebf --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/O.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: d3b724caf22f25548b438a7834b87e91 +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/U.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/U.png new file mode 100644 index 0000000..4c916fd Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/U.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/U.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/U.png.meta new file mode 100644 index 0000000..6e1e498 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/U.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: fa2a440ad71b40b42a982048a56b5a00 +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/WQ.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/WQ.png new file mode 100644 index 0000000..8ab0fc9 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/WQ.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/WQ.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/WQ.png.meta new file mode 100644 index 0000000..7de9310 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/WQ.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 37ab031cd42ce8848a1cd95ee5ee37a3 +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/etc.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/etc.png new file mode 100644 index 0000000..f7bae3a Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/etc.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/etc.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/etc.png.meta new file mode 100644 index 0000000..72b1a53 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Guides/etc.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 8ba44f1112856a9489917f711cbd1fff +timeCreated: 1435339608 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light.meta new file mode 100644 index 0000000..5654d08 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0c6dbada80dfe434b8a38f1e5d772a96 +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/down.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/down.png new file mode 100644 index 0000000..2adee68 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/down.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/down.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/down.png.meta new file mode 100644 index 0000000..c816832 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/down.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 2d6d4587225432b49b66fb1af690a14a +timeCreated: 1548723395 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/eye.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/eye.png new file mode 100644 index 0000000..f1213ce Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/eye.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/eye.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/eye.png.meta new file mode 100644 index 0000000..0aaff4a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/eye.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: e31fbfaa205385543a48e20cfe20e3a0 +timeCreated: 1453683423 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/icon.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/icon.png new file mode 100644 index 0000000..8ab5f2a Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/icon.png.meta new file mode 100644 index 0000000..eb14969 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 357aa4eae104d764bba17e6087bbd20e +timeCreated: 1437065427 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/list.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/list.png new file mode 100644 index 0000000..b603df2 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/list.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/list.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/list.png.meta new file mode 100644 index 0000000..d5f5a92 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/list.png.meta @@ -0,0 +1,114 @@ +fileFormatVersion: 2 +guid: 35a57c6a4694eec4498e20d0e4f54808 +timeCreated: 1513773938 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/locked.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/locked.png new file mode 100644 index 0000000..1d7bb7f Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/locked.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/locked.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/locked.png.meta new file mode 100644 index 0000000..bd971fd --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/locked.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 067ba8176d292d24b81e41aa7c3a92a5 +timeCreated: 1442429884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/logo_component.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/logo_component.png new file mode 100644 index 0000000..3864886 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/logo_component.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/logo_component.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/logo_component.png.meta new file mode 100644 index 0000000..920e650 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/logo_component.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 59c765ded93876843860c678f1ca61a6 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/loop.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/loop.png new file mode 100644 index 0000000..7fc1324 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/loop.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/loop.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/loop.png.meta new file mode 100644 index 0000000..a033a4e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/loop.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 26ad3d98ad37f02479799d31b7d14a05 +timeCreated: 1455410616 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/minus.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/minus.png new file mode 100644 index 0000000..beb80f8 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/minus.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/minus.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/minus.png.meta new file mode 100644 index 0000000..9c211aa --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/minus.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 3855aa02be475894b91d68733c76faaf +timeCreated: 1548723395 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/pause.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/pause.png new file mode 100644 index 0000000..654ab72 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/pause.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/pause.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/pause.png.meta new file mode 100644 index 0000000..a57b9e9 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/pause.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: fd3f93b8365c40e4fb0866fc27834969 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/play.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/play.png new file mode 100644 index 0000000..6e106a6 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/play.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/play.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/play.png.meta new file mode 100644 index 0000000..ef7708a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/play.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 3116bc19c9faff44bb98d22e1aa59b79 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/plus.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/plus.png new file mode 100644 index 0000000..cd5c708 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/plus.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/plus.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/plus.png.meta new file mode 100644 index 0000000..610701e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/plus.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 34ccb4eb24a91804d80411cd36353c52 +timeCreated: 1548723395 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/presets.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/presets.png new file mode 100644 index 0000000..98620f4 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/presets.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/presets.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/presets.png.meta new file mode 100644 index 0000000..0bed995 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/presets.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 14c74f297eda7af488a6533f098564a8 +timeCreated: 1449850423 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/record.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/record.png new file mode 100644 index 0000000..3395ccb Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/record.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/record.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/record.png.meta new file mode 100644 index 0000000..e0d022b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/record.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: c3b512d3fa7e6634383f0852ff3cce3c +timeCreated: 1559142085 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/save.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/save.png new file mode 100644 index 0000000..f2a6771 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/save.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/save.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/save.png.meta new file mode 100644 index 0000000..618fc20 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/save.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 396528d03d223164e9d5e90864d5f4f0 +timeCreated: 1548723395 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/search.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/search.png new file mode 100644 index 0000000..b238845 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/search.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/search.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/search.png.meta new file mode 100644 index 0000000..5201501 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/search.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 064e71373ba3efb44817ef89df7cc232 +timeCreated: 1476407810 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/settings.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/settings.png new file mode 100644 index 0000000..0f1932e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/settings.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/settings.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/settings.png.meta new file mode 100644 index 0000000..1435ac7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/settings.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 0e09619ccb85d1640a2cc33850a1517f +timeCreated: 1537453171 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/stop.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/stop.png new file mode 100644 index 0000000..4d5ec99 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/stop.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/stop.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/stop.png.meta new file mode 100644 index 0000000..139c8d9 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/stop.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 01f21d0fd18e0ed4cbfd71dbfa9b06ed +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/track.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/track.png new file mode 100644 index 0000000..ef93f72 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/track.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/track.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/track.png.meta new file mode 100644 index 0000000..90c273f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/track.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 05a216b8673055947b033f646d2bae07 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/unlocked.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/unlocked.png new file mode 100644 index 0000000..d61477a Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/unlocked.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/unlocked.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/unlocked.png.meta new file mode 100644 index 0000000..7275110 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/unlocked.png.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 5bd36b9810c569f4b8f8a35caf2e5743 +timeCreated: 1442429884 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/up.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/up.png new file mode 100644 index 0000000..33169b2 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/up.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/up.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/up.png.meta new file mode 100644 index 0000000..97320cb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Light/up.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 08e9d6a385341df40bd520f17c875cd6 +timeCreated: 1548723395 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_bottom.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_bottom.png new file mode 100644 index 0000000..c0cfcf0 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_bottom.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_bottom.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_bottom.png.meta new file mode 100644 index 0000000..bbdbe2c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_bottom.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 7f6a8abb4ff4e204aa40eb145b5cf7f5 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_middle.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_middle.png new file mode 100644 index 0000000..7a4c0d1 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_middle.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_middle.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_middle.png.meta new file mode 100644 index 0000000..86d2bfc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_middle.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: f8fe9d9aade167b478c5107348a630f8 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_top.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_top.png new file mode 100644 index 0000000..49b7827 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_top.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_top.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_top.png.meta new file mode 100644 index 0000000..1ed13b8 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/Playhead_top.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 06806d2783ef1654badcb731f4714cea +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/bin.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/bin.png new file mode 100644 index 0000000..5735982 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/bin.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/bin.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/bin.png.meta new file mode 100644 index 0000000..c3ac6ee --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/bin.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 5d60dda400dea324b8a4f4314427a786 +timeCreated: 1450558941 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-area.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-area.png new file mode 100644 index 0000000..b95f851 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-area.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-area.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-area.png.meta new file mode 100644 index 0000000..08237c0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-area.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 719ce24cf18618d46b23b18e3a7f4468 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-end.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-end.png new file mode 100644 index 0000000..d655d01 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-end.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-end.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-end.png.meta new file mode 100644 index 0000000..4d3c5cd --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-end.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: ea54d013d2cad224fac48e3a9018fbdb +timeCreated: 1458740624 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-in.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-in.png new file mode 100644 index 0000000..382bef2 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-in.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-in.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-in.png.meta new file mode 100644 index 0000000..07b1dcb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-in.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 24f43ffd1390e3d4d8b52c9d9902afee +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: 2 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-out.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-out.png new file mode 100644 index 0000000..b993849 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-out.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-out.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-out.png.meta new file mode 100644 index 0000000..6ff8303 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-out.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 57199aebfa9515a40954617323aa93f5 +timeCreated: 1458261277 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-start.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-start.png new file mode 100644 index 0000000..2af855f Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-start.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-start.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-start.png.meta new file mode 100644 index 0000000..87030bc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-blend-start.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 28d8015992fc6424cb5f325099a5a566 +timeCreated: 1458740519 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight-overlap.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight-overlap.png new file mode 100644 index 0000000..846ce63 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight-overlap.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight-overlap.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight-overlap.png.meta new file mode 100644 index 0000000..5f7fac6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight-overlap.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 97f0e3d64683b1342af1095785f67be3 +timeCreated: 1458314572 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight.png new file mode 100644 index 0000000..37045d6 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight.png.meta new file mode 100644 index 0000000..4e8c5d0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-highlight.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 2515a4b5bfc5f4f4b9de192cfe39e0f9 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-select.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-select.png new file mode 100644 index 0000000..61d13a2 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-select.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-select.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-select.png.meta new file mode 100644 index 0000000..26a415b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end-select.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 0c48a433ea0aba846947d94567cef434 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end.png new file mode 100644 index 0000000..800195a Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end.png.meta new file mode 100644 index 0000000..e73fa0d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-end.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: febfdd6f3b1b8244ead9a21893b669af +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-error.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-error.png new file mode 100644 index 0000000..ce6181d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-error.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-error.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-error.png.meta new file mode 100644 index 0000000..443166a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-error.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: b695f4decffe9994fac67f6aa98cad8c +timeCreated: 1457894689 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight-overlap.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight-overlap.png new file mode 100644 index 0000000..b3fa229 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight-overlap.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight-overlap.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight-overlap.png.meta new file mode 100644 index 0000000..0c83333 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight-overlap.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 52edc8de0534ff643bb2212cf3529ecc +timeCreated: 1458314572 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight.png new file mode 100644 index 0000000..e8e3cc3 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight.png.meta new file mode 100644 index 0000000..6cd102e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-highlight.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: c2843843cfd58cf409c34abe2b535715 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-select.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-select.png new file mode 100644 index 0000000..1022112 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-select.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-select.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-select.png.meta new file mode 100644 index 0000000..b7690d0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start-select.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 5ff8eed9ea55d074bafcacbfa9ffee19 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start.png new file mode 100644 index 0000000..c621340 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start.png.meta new file mode 100644 index 0000000..4620c09 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/emotion-start.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 59bc13069fc29964697f8b4538502689 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-highlight.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-highlight.png new file mode 100644 index 0000000..cc2b0d7 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-highlight.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-highlight.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-highlight.png.meta new file mode 100644 index 0000000..a8e8956 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-highlight.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 73cd6ba1207e68848b5c2e4b97945a64 +timeCreated: 1454773198 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-selected.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-selected.png new file mode 100644 index 0000000..02a5bd6 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-selected.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-selected.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-selected.png.meta new file mode 100644 index 0000000..bbc5146 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture-selected.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: d1dd780a48d7eb540a6789ab6caf045d +timeCreated: 1454773198 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture.png new file mode 100644 index 0000000..73ea293 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture.png.meta new file mode 100644 index 0000000..e3e4645 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/gesture.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 7b8e8780865e9424cade4b867978c995 +timeCreated: 1454773198 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/indicator.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/indicator.png new file mode 100644 index 0000000..8820c60 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/indicator.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/indicator.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/indicator.png.meta new file mode 100644 index 0000000..c7f6abb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/indicator.png.meta @@ -0,0 +1,116 @@ +fileFormatVersion: 2 +guid: 22526da083a1f1c418cf59698c4edc3c +timeCreated: 1494344847 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: tvOS + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/light-toolbar.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/light-toolbar.png new file mode 100644 index 0000000..5c66e96 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/light-toolbar.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/light-toolbar.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/light-toolbar.png.meta new file mode 100644 index 0000000..5c2856a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/light-toolbar.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 5f830c0e251d65042ab7edb180f5536e +timeCreated: 1450490563 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-highlight.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-highlight.png new file mode 100644 index 0000000..2ff436b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-highlight.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-highlight.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-highlight.png.meta new file mode 100644 index 0000000..0b4e8d6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-highlight.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 3d0ee762a921ced4fa799145aaab8849 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-selected.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-selected.png new file mode 100644 index 0000000..138c615 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-selected.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-selected.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-selected.png.meta new file mode 100644 index 0000000..3ce8cd3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-selected.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 6dd48afe11539d64fb72ab60630287f7 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-sustain.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-sustain.png new file mode 100644 index 0000000..25fd59a Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-sustain.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-sustain.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-sustain.png.meta new file mode 100644 index 0000000..a7d4e90 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker-sustain.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: d8bbbb01b2f68a042bad77f1b1651620 +timeCreated: 1463153687 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker.png new file mode 100644 index 0000000..059c699 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker.png.meta new file mode 100644 index 0000000..87fac39 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/marker.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 02fcd87127b069244b7682edaeb5bf22 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-bar.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-bar.png new file mode 100644 index 0000000..990a44d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-bar.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-bar.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-bar.png.meta new file mode 100644 index 0000000..85a5f37 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-bar.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 4d23b4721f842394687d6be1d7e0e7aa +timeCreated: 1457001270 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-icon.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-icon.png new file mode 100644 index 0000000..0e53d6f Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-icon.png.meta new file mode 100644 index 0000000..84a9d1b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/LipSync/preview-icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: c24091f1701a30049b149e5092bd43e1 +timeCreated: 1457001270 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared.meta new file mode 100644 index 0000000..3c7ea4e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a77ea06d1d2cf2c4d94624ca0204a16c +folderAsset: yes +timeCreated: 1460048970 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark.meta new file mode 100644 index 0000000..0e85e71 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d1845974f384f7943a96340383a0901b +folderAsset: yes +timeCreated: 1467820420 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/down.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/down.png new file mode 100644 index 0000000..1af3107 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/down.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/down.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/down.png.meta new file mode 100644 index 0000000..8091de2 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/down.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 219922b67491c8a4da2ba4ebcf7a6a7d +timeCreated: 1467820420 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/up.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/up.png new file mode 100644 index 0000000..c4acd8b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/up.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/up.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/up.png.meta new file mode 100644 index 0000000..6abcbfb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Dark/up.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: c155a80cb13d9d74c87ed0f2f7b15ccf +timeCreated: 1467820420 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light.meta new file mode 100644 index 0000000..67d4c77 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e26b9ef117628754dbdbadb547103461 +folderAsset: yes +timeCreated: 1467820420 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/down.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/down.png new file mode 100644 index 0000000..20b258c Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/down.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/down.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/down.png.meta new file mode 100644 index 0000000..f4cde37 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/down.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 4db27a5fed0ea414d99b2204d5a1a0e1 +timeCreated: 1467820420 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/up.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/up.png new file mode 100644 index 0000000..fcb66b3 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/up.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/up.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/up.png.meta new file mode 100644 index 0000000..868d56b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/Light/up.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 9b2b346bd394945469e69c67b95b49e2 +timeCreated: 1467820420 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_Icon.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_Icon.png new file mode 100644 index 0000000..42fcf96 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_Icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_Icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_Icon.png.meta new file mode 100644 index 0000000..48ef42c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_Icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 2c8d360cfab534443bb5da3efa39da08 +timeCreated: 1436875464 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 32 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_bg.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_bg.png new file mode 100644 index 0000000..ccc6816 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_bg.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_bg.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_bg.png.meta new file mode 100644 index 0000000..4b7d0d7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_bg.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 186b0f6426972c344bfae8c2b1f3d34a +timeCreated: 1436891046 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_button.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_button.png new file mode 100644 index 0000000..8a514a7 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_button.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_button.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_button.png.meta new file mode 100644 index 0000000..5095ad6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_button.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 1575e6051639ddf418ec0364b85c38e4 +timeCreated: 1450575285 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_left.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_left.png new file mode 100644 index 0000000..ab31e82 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_left.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_left.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_left.png.meta new file mode 100644 index 0000000..eca1079 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/RogoDigital_header_left.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 969b25bb682a30f498e3f0656fa68fc4 +timeCreated: 1436891046 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/default_icon.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/default_icon.png new file mode 100644 index 0000000..4e8b051 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/default_icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/default_icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/default_icon.png.meta new file mode 100644 index 0000000..db46b47 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/default_icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 7a5671071f7bb7941b29aa8e180220ea +timeCreated: 1437055656 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/white.png b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/white.png new file mode 100644 index 0000000..763a5c4 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/white.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/white.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/white.png.meta new file mode 100644 index 0000000..a6ccb1b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Editor Default Resources/Rogo Digital/Shared/white.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 9b99ca4755266ee4e957c9798ce4b4c5 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos.meta b/Assets/LipSync-Pro-main/Project/Assets/Gizmos.meta new file mode 100644 index 0000000..9a86624 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Gizmos.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f08bcfe7b5991c143b77c6442a7230c7 +folderAsset: yes +timeCreated: 1548722066 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/EyeController Icon.png b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/EyeController Icon.png new file mode 100644 index 0000000..9ccd89d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/EyeController Icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/EyeController Icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/EyeController Icon.png.meta new file mode 100644 index 0000000..0f47870 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/EyeController Icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 4958800ee87bc6240824ed379cf13e0b +timeCreated: 1454011083 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSync Icon.png b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSync Icon.png new file mode 100644 index 0000000..0e24c43 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSync Icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSync Icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSync Icon.png.meta new file mode 100644 index 0000000..efb1cf6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSync Icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: fe75762bf2ad668439cf1aa644a0e5bf +timeCreated: 1440094545 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncData Icon.png b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncData Icon.png new file mode 100644 index 0000000..dfed6d1 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncData Icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncData Icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncData Icon.png.meta new file mode 100644 index 0000000..c7579ba --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncData Icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 391b972e71309ab45839fafd498a2df5 +timeCreated: 1440093760 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncPreset Icon.png b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncPreset Icon.png new file mode 100644 index 0000000..4180665 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncPreset Icon.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncPreset Icon.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncPreset Icon.png.meta new file mode 100644 index 0000000..3bda1d5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Gizmos/LipSyncPreset Icon.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 37706586c99b75f4bbc2a0e589e0be7d +timeCreated: 1440093760 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital.meta new file mode 100644 index 0000000..8b4197b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: cfd9b15caf5e339459a46b4695386881 +folderAsset: yes +timeCreated: 1605198790 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro.meta new file mode 100644 index 0000000..23381d5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4c0d4845a3907e4419ebc1524194c78b +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync.meta new file mode 100644 index 0000000..f3bec76 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6fd91e75cd6b9f042ae329371a182283 +folderAsset: yes +timeCreated: 1441929583 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Editor.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Editor.meta new file mode 100644 index 0000000..b49592b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5137b5efa3198354c810d7e2f32a9e22 +folderAsset: yes +timeCreated: 1432928041 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps.meta new file mode 100644 index 0000000..a3ab305 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9749d7aee6838e14f84165f7cfe1cc12 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/Arpabet-Prestonblair.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/Arpabet-Prestonblair.asset new file mode 100644 index 0000000..de0b6b7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/Arpabet-Prestonblair.asset @@ -0,0 +1,101 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bec01a6ce71382249a21692e5f167af7, type: 3} + m_Name: Arpabet-Prestonblair + m_EditorClassIdentifier: + displayName: Arpabet - Preston-Blair + setAName: Arpabet + setBName: PrestonBlair + phonemeMap: + map: + - aLabel: IY + bLabel: E + - aLabel: IH + bLabel: AI + - aLabel: EH + bLabel: E + - aLabel: AE + bLabel: AI + - aLabel: AH + bLabel: U + - aLabel: UW + bLabel: O + - aLabel: UH + bLabel: U + - aLabel: AA + bLabel: AI + - aLabel: AO + bLabel: AI + - aLabel: EY + bLabel: AI + - aLabel: AY + bLabel: AI + - aLabel: OY + bLabel: AI + - aLabel: AW + bLabel: AI + - aLabel: OW + bLabel: O + - aLabel: ER + bLabel: U + - aLabel: JH + bLabel: CDGKNRSThYZ + - aLabel: L + bLabel: L + - aLabel: R + bLabel: CDGKNRSThYZ + - aLabel: Y + bLabel: CDGKNRSThYZ + - aLabel: W + bLabel: WQ + - aLabel: M + bLabel: MBP + - aLabel: N + bLabel: CDGKNRSThYZ + - aLabel: NG + bLabel: CDGKNRSThYZ + - aLabel: CH + bLabel: CDGKNRSThYZ + - aLabel: J + bLabel: CDGKNRSThYZ + - aLabel: DH + bLabel: CDGKNRSThYZ + - aLabel: B + bLabel: MBP + - aLabel: D + bLabel: CDGKNRSThYZ + - aLabel: G + bLabel: CDGKNRSThYZ + - aLabel: P + bLabel: MBP + - aLabel: T + bLabel: CDGKNRSThYZ + - aLabel: K + bLabel: CDGKNRSThYZ + - aLabel: Z + bLabel: CDGKNRSThYZ + - aLabel: ZH + bLabel: CDGKNRSThYZ + - aLabel: V + bLabel: FV + - aLabel: F + bLabel: FV + - aLabel: TH + bLabel: CDGKNRSThYZ + - aLabel: S + bLabel: CDGKNRSThYZ + - aLabel: SH + bLabel: CDGKNRSThYZ + - aLabel: HH + bLabel: CDGKNRSThYZ + - aLabel: sp + bLabel: Rest diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/Arpabet-Prestonblair.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/Arpabet-Prestonblair.asset.meta new file mode 100644 index 0000000..a4f603c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/Arpabet-Prestonblair.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4720afdd71a234c4592c95e72357bfb5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/ProsodyLabDE-PrestonBlair.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/ProsodyLabDE-PrestonBlair.asset new file mode 100644 index 0000000..04f37eb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/ProsodyLabDE-PrestonBlair.asset @@ -0,0 +1,107 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bec01a6ce71382249a21692e5f167af7, type: 3} + m_Name: ProsodyLabDE-PrestonBlair + m_EditorClassIdentifier: + displayName: Prosody Lab - Preston-Blair + setAName: ProsodyLab-DE + setBName: PrestonBlair + phonemeMap: + map: + - aLabel: p + bLabel: MBP + - aLabel: b + bLabel: MBP + - aLabel: t + bLabel: CDGKNRSThYZ + - aLabel: d + bLabel: CDGKNRSThYZ + - aLabel: k + bLabel: CDGKNRSThYZ + - aLabel: g + bLabel: CDGKNRSThYZ + - aLabel: N + bLabel: CDGKNRSThYZ + - aLabel: m + bLabel: MBP + - aLabel: n + bLabel: CDGKNRSThYZ + - aLabel: l + bLabel: L + - aLabel: r + bLabel: CDGKNRSThYZ + - aLabel: f + bLabel: FV + - aLabel: v + bLabel: FV + - aLabel: T + bLabel: CDGKNRSThYZ + - aLabel: D + bLabel: CDGKNRSThYZ + - aLabel: s + bLabel: CDGKNRSThYZ + - aLabel: z + bLabel: CDGKNRSThYZ + - aLabel: S + bLabel: CDGKNRSThYZ + - aLabel: j + bLabel: CDGKNRSThYZ + - aLabel: x + bLabel: CDGKNRSThYZ + - aLabel: h + bLabel: CDGKNRSThYZ + - aLabel: w + bLabel: WQ + - aLabel: tS + bLabel: CDGKNRSThYZ + - aLabel: dZ + bLabel: CDGKNRSThYZ + - aLabel: I + bLabel: AI + - aLabel: E + bLabel: E + - aLabel: '&' + bLabel: AI + - aLabel: V + bLabel: AI + - aLabel: O + bLabel: U + - aLabel: U + bLabel: U + - aLabel: '@' + bLabel: AI + - aLabel: i + bLabel: E + - aLabel: W + bLabel: AI + - aLabel: A + bLabel: AI + - aLabel: ~ + bLabel: AI + - aLabel: $ + bLabel: WQ + - aLabel: u + bLabel: O + - aLabel: eins + bLabel: AI + - aLabel: zwei + bLabel: AI + - aLabel: drei + bLabel: AI + - aLabel: vier + bLabel: AI + - aLabel: o + bLabel: O + - aLabel: / + bLabel: O + - aLabel: sp + bLabel: Rest diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/ProsodyLabDE-PrestonBlair.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/ProsodyLabDE-PrestonBlair.asset.meta new file mode 100644 index 0000000..d34fa00 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/Phoneme Maps/ProsodyLabDE-PrestonBlair.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 713e52fe3ef780a47ab241d66f41db3e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange.meta new file mode 100644 index 0000000..c27210c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4369ad39f6815474684643bf4d9d131b +folderAsset: yes +timeCreated: 1548365755 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx.meta new file mode 100644 index 0000000..8bbe2b4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 760edb7993ad40c4ebf071194e3d026f +folderAsset: yes +timeCreated: 1548365885 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/ChangeLog b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/ChangeLog new file mode 100644 index 0000000..809b43f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/ChangeLog @@ -0,0 +1,1759 @@ +Change History +-------------- + +This file contains a list of all changes starting after the release of +sox-11gamma, followed by a list of prior authors and features. + +$ox-14.4.2 2015-02-22 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.3.0 O -1/-2/-3/-4/-8 -b + 14.3.0 O -s/-u/-f -e + 14.3.0 O -A/-U/-o/-i/-a/-g -e + 14.4.0 E swap with parameters remix + 14.4.0 E mixer remix + 14.4.1 OpenMP < 3.0 OpenMP >= 3.0 + 14.4.1 F ffmpeg ffmpeg/avconv via pipe + +File formats: + + o Add optional support for reading Ogg Opus files. (John Stumpo) + o Fix for max size text chunks in aiff files. (cbagwell) + o Add reading support for RF64 WAV files. (Dave Lambley) + o Work around for libsndfile created RF64 files with invalid + sizes. (Dave Lambley) + o Detect MS ADPCM WAV files with invalid blocks. (cbagwell) + o Detect Sphere files with invalid header sizes. (cbagwell) + +Effects: + + o 'Deemph' can now also be used at 48kHz sample rate. (robs) + o 'Rate' now much faster in many cases. (robs) + o Allow sending spectrograms to stdout. (Ulrich Klauer) + o Allow use of Dolph window with spectrograms. (robs) + o Allow mixing time and sample-count arguments for the delay + effect, and for spectrogram -S and -d. (Ulrich Klauer) + o Support multi-channel LADSPA plugins. (Eric Wong) + o Support infinite repetition with repeat. (Ulrich Klauer) + o Improved pink noise frequency response in synth. (robs) + o Extended syntax for specifying audio positions to several + effects. (Ulrich Klauer) + o Fix integer overflow in mcompand. [3590093] (Guido Aulisi) + o Add optional latency compenstation for LADSPA plugins. (Eric Wong) + +Other new features: + + o New -p option for soxi to display sample precision. (Ulrich Klauer) + o New libsox example6: give explicit output attributes. (robs) + +Internal improvements: + + o Speed optimization for effects that operate on channels + independently. (Ulrich Klauer) + o Fix memory leaks. (Ulrich Klauer) + o Most internal symbols (lsx_*) are no longer exported. (Ulrich Klauer) + + +sox-14.4.1 2013-02-01 +---------- + +Newly deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.4.1 OpenMP < 3.0 OpenMP >= 3.0 14.4.1 + 14.4.1 F ffmpeg ffmpeg/avconf via pipe 14.4.1 + +File formats: + + o Fix pipe file-type detection regression. (robs) + o MAUD write fixes. [3507927] (Carl Eric Codere and Ulrich Klauer) + o Fix crash when seeking within a FLAC file. [3476843] (Eric Wong) + o Fix Ogg Vorbis files with certain numbers of channels being + truncated. (Ulrich Klauer) + o Fix reading 64-bit float WAVs. [3481510] (nu774 and Ulrich Klauer) + o Fix potential buffer overrun when writing FLAC files directly via + sox_write(). [3474924] (Eric Wong) + +Audio device drivers: + + o Check whether pulseaudio is available before choosing it as + default. (robs) + +Effects: + + o Restore 8 seconds default for spectrogram, if the input length is + not known. (Ulrich Klauer) + o Set output length for splice to unknown instead of 0. (Ulrich Klauer) + o Increase maximum width for spectrograms. (Ulrich Klauer) + o Fix memory leaks in LADSPA effect. (Eric Wong) + o Fix hang in several effects (rate, tempo, and those based on + dft_filter) when processing long files. [3592482, 3594822] (MrMod) + o Prevent (m)compand from tampering with their arguments. (Ulrich Klauer) + +Other bug fixes: + + o Fix input length calculation for combine methods other than + concatenate. (Ulrich Klauer) + o Fix to configure.ac to work with Autoconf 2.69. [3600293] (cbagwell) + o Use binary mode for pipes on all Windows compilers, rather than + MSVC only. [3602130] (Ulrich Klauer) + + +sox-14.4.0 2012-03-04 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.3.0 O --interactive --no-clobber + 14.3.0 E filter ~= sinc + 14.3.0 E norm -b, norm -i gain -B, gain -en + 14.3.0 PLAY_RATE_ARG SOX_OPTS + 14.2.0 E key alias pitch + 14.2.0 E pan ~= remix + 14.1.0 E resample alias rate + 14.1.0 E polyphase alias rate + 14.1.0 E rabbit alias rate + 14.3.1 F sndfile: sndfile 1.0.11 sndfile > 1.0.11 + 14.3.0 F flac: libFLAC < 1.1.3 libFLAC >= 1.1.3 + 14.3.1 F mp3: lame 3.97 lame > 3.97 + +Newly deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.4.0 E mixer remix 14.4.0 + 1 year + 14.4.0 E swap with parameters remix 14.4.0 + +Previously deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.3.0 O -1/-2/-3/-4/-8 -b 14.4.0 + 14.3.0 O -s/-u/-f -e 14.4.0 + 14.3.0 O -A/-U/-o/-i/-a/-g -e 14.4.0 + +File formats: + + o Mention in man pages that WAV files support floating point encodings. + o Add support for floating point encodings in AIFF-C files. (Ulrich Klauer) + o Pad WAV data chunk to an even number of bytes (as required by the + specification). [3203418] (Ulrich Klauer) + o Add optional MP2 write support with twolame library. (Paul Kelly) + +Audio device drivers: + + o Give pulseaudio driver higher priority than alsa or oss now that + its proven stable and gives user more features; such as per app + volume control. (cbagwell) + o Fix bug when specifying OSX coreaudio device name. Would only + search for first 3 devices. (cbagwell) + o Fix sox hangups are exit when using coreaudio. (cbagwell) + o Improve buffering in coreaudio driver (Michael Chen) + o Support enabling play/rec mode when user invokes sox as either + play or play.exe on windows. (cbagwell) + o Fix compile of sunaudio driver on OpenBSD (cbagwell) + +Effects: + + o Improvements to man pages for tempo effect. Really made in 14.3.2. + (Jim Harkins). + o New upsample effect. (robs) + o Fix to effects pipeline to let fade effect specify time from end of + file again. (cbagwell and Thor Andreassen) + o Fix man page default error for splice effect. (Ulrich Klauer) + o Enable support for --plot option on biquad and fir effects. (Ulrich Klauer) + o Effects chain can now be unlimited in length. (Ulrich Klauer) + o Fix newfile/restart effects when merging or mixing files. (Ulrich Klauer) + o Fix crashes in compand and mcompand effects. [3420893] (Ulrich Klauer) + o Let the delay effect gracefully handle the special case that a delay can + be more than the input length. [3055399] (Ulrich Klauer) + o New hilbert and downsample effects. (Ulrich Klauer) + o Fix problem where fade would sometimes fail if specifying a fade-out + immediately after a fade-in. (robs) + o Stricter syntax checking for several effects (might reveal bugs hidden + in existing scripts). (Ulrich Klauer) + o Calculate output audio length for most effects. (Ulrich Klauer) + o Fix problems with several effects when the buffer size was not evenly + divisible by the number of channels. [3420899] (Ulrich Klauer) + o Complete rewrite of the trim effect with extended syntax (backwards + compatible) and capabilities. [FR 2941349] (Ulrich Klauer) + o Fix trim optimization unexpectedly seeking backwards. (Ulrich Klauer) + o Prevent samples from getting lost at effects chain transitions in + multiple effects chain/multiple output modes. (Ulrich Klauer) + +Misc: + + o Minor improvements to the man page. (Ulrich Klauer) + o When using pipes (-p) on Windows, set file mode to binary. (cbagwell) + o Updated .dat format description in soxformat. (Jan Stary) + o Doxygen documentation for libSoX. (Doug Cook) + +Other bug fixes: + + o Fix several memory leaks. [3309913] (Jin-Myung Won and Ulrich Klauer) + o Fixed crashes in apps that call sox_format_init/quit() multiple times. + (cbagwell) + +Internal improvements: + + o Added use_threads variable to sox_globals. This should be used to enable + or disable use of parallel effects processing instead of directly calling + omp_set_num_threads. (Doug Cook) + o Fix compiler warnings. (Cristian Morales Vega [P. 3072301], Doug Cook) + o Improve large file support by using 64-bit numbers to count + samples. (Doug Cook, Thor Andreassen, Ulrich Klauer) + + +sox-14.3.2 2011-02-27 +---------- + +File formats: + + o Add seek support to mp3 handler for speed improvements. (Pavel Karneliuk) + o Fix bug were WavPack header was not updated correctly when closing + file. Fixed libsox memory leak when closing WavPack files. + (David Bryant) + o Fix RIFF chunk length error when writing 24-bit files. (David Bryant) + o 24-bit WAV files were leaving channel maps unassigned. Change to use + common channel mappings based on channel count. This allows to + work more seemlessly with other apps such as WavPack and Foobar2000. + (David Bryant) + o Fix ffmpeg playback bug caused by alignment requirements on some platforms. + Closes bug #3017690. (Reuben Thomas). + o Fix memory leak in ffmpeg. (Doug Cook) + o Handle 0 length chunks in WAV files gracefully. (Beat Jorg) + o When skipping over chunks, account for word alignment. Helps + with some Logic Pro generated files. (D Lambley) + o Fix incorrect MP3 file length determination with VBR & .5s initial + silence. (robs) + +Audio device drivers: + + o Fix immediate segfault on OSX while attempting to record. (Adam Fritzler) + o Fix segfault on OSX playback for some HW that gives smaller then + requested buffers. (cbagwell) + o Clean up system resource in coreaudio on close. Allows running + back-to-back open()/close()'s without exiting app first. (cbagwell) + o Add support for 32-bit samples to OSS driver. (Eric Lammerts) + o Add support for 24 and 32-bit samples to waveaudio (Win32) driver. + (Doug Cook) + o Support specifying audio device other than default on OSX (cbagwell) + +Effects: + + o F.R. [3051700] spectrogram -r for `raw' spectrogram, no legend. (robs) + o Fix -w option on stats effect. (Ronald Sprouse) + o Fix segfault with some ladspa plugins (Thor Andreassen) + o Optionally look for png.h in libpng directory to support OpenBSD + packaging. Helps enable spectrograph effect. (cbagwell) + o libpng15 requires application to include zlib.h header file. (cbagwell) + Add this to spectrograph effect. [3184238] + o Enable LADSPA effects on all platforms without any external + dependencies. Mainly useful for Linux, Windows and OS X which have + binaries readily available. (cbagwell) + o Support specifying an absolute end location for trim effect instead + only an offset from trim begin location. (Ulrich Klauer) + o Fix regression where MP3 handler required libmad headers to be installed. + (Samuli Suominen) + o Allow dynamic loading of lame to be enabled even if lame header files + are not installed. (Doug Cook) + +Other new features: + + o Soxi now reports duration of AMR files. (robs) + o Document the "multiple" combine option in man pages and in + usage output (Ulrich Klauer). + +Internal improvements: + + o Distribute msvc9 project files that had been in CVS only. (cbagwell) + o Add msvc10 project files (also compatible with the Windows SDK 7.1). + (Doug Cook) + o cmake now compiles waveaudio driver under windows environment. (cbagwell) + [3072672] + +sox-14.3.1 2010-04-11 +---------- + +Newly deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.3.1 F mp3: lame 3.97 lame > 3.97 2011-04-11 + 14.3.1 F sndfile: sndfile 1.0.11 sndfile > 1.0.11 14.3.1 + +Previously deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.2.0 E key alias pitch 14.3.1 + 14.2.0 E pan ~= mixer/remix 14.3.1 + 14.3.0 F flac: libFLAC 1.1.2,3 libFLAC > 1.1.3 14.3.1 + 14.3.0 PLAY_RATE_ARG SOX_OPTS 14.3.1 + 14.3.0 E norm -b, norm -i gain -B, gain -en 2010-06-14 + 14.3.0 E filter ~=sinc 2010-06-14 + 14.1.0 E resample alias rate 2010-06-14 + 14.1.0 E polyphase alias rate 2010-06-14 + 14.1.0 E rabbit alias rate 2010-06-14 + +LibSoX interface changes: + + o Added new variants of sox_open to allow read/write from/to memory + buffers (in POSIX 2008 environment); see example5.c. (robs) + +File formats: + + o New Grandstream ring-tone (gsrt) format. (robs) + o CVSD encode/decode speed-ups. (Kimberly Rockwell, P. Chaintreuil) + o Add ability to select MP3 compression parameters. (Jim Harkins) + o Now writes out ID3-tags in MP3 files with lame supports it. (Doug Cook) + o Also can write VBR Tag ("XING Header") in MP3 files. (Jim Hark / + Doug Cook) + o Increase percision of MP3 encoders to use 24-bits instead of + 16-bits. (Doug Cook) + o Fix failed writing 24-bit PAF files (and possibly other libsndfile + based formats). (cbagwell) + o Allow libsndfile to be dlopen()'ed at runtime if --enable-dl-sndfile + is used. (Doug Cook) + o Allow amr-nb/amr-wb to be dlopen()'ed at runtime if + --enable-dl-amrwb or --enable-dl-amrnb is used. (Doug Cook) + o amrnb and amrwb formats can optionally use opencore-amr libraries. + (cbagwell) + +Audio device drivers: + + o Add native windows audio driver. (Pavel Karneliuk, Doug Cook) + o Add 32-bit support to ALSA driver. (Pavel Hofman) + o Make OpenBSD sndio audio driver default over older sunau driver. + (cbagwell) + +Effects: + + o Fix [2254919] silence doesn't trim digital silence correctly. (robs) + o Fix [2859842] stats effect crashes on 64-bit arch. (Ulrich Klauer) + +Other new features: + + o Added libSoX example #4: concatenating audio files. (robs) + o Show soxi version & usage information when no args given. (robs) + +Other bug fixes: + + o Fix build so that grouped files (e.g. play -r 6k "*.vox" plays all + at 6k) works. (robs) + o Fix build to support auto file type detection with pipes on FreeBSD + and elsewhere. (Dan Nelson) + o Fix simultaneous play & rec not working. (robs) + o Fix multi-threading problems on multi-core Windows OS; also, change + default to single-threaded. + o Fix mistaken file size with pipe input on Windows. (Doug Cook) + o Fix missing documentation for -R (repeatable), and pulseaudio driver. + o Fix memory leak of format private data. (Slawomir Testowy) + +Internal improvements: + + o Move bit-rot detection support files to sub-directory (could + previously cause build problems). (robs) + o [2859244] Fixes to improve compatibility with MSVC. (Doug Cook) + o Added utilities to help any format handler dlopen() external + libraries at run time instead of link time. (Doug Cook) + o Compiling with mingw now has feature parity with cygwin. (Doug Cook + and cbagwell) + + + +sox-14.3.0 2009-06-14 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.1.0 E resample * ~= rate + 14.1.0 E polyphase * ~= rate + 14.1.0 E rabbit * ~= rate + 14.2.0 E dither: RPDF,scaled dither (TPDF only) + 14.1.0 F flac: libFLAC 1.1.1 libFLAC > 1.1.1 + + * But interface retained as an alias for `rate'. + +LibSoX interface changes: + + o sox_format_init() has been supeseded by sox_init(). + o Removed obsolete error codes (SOX_E...); new sox_strerror() + function to convert error codes to text. + o Use of sox_effect_options() is now mandatory when initialising an + effect (see example0.c for an example of this). + o sox_flow_effects() has a new (3rd) parameter: a void pointer + `client_data' that is passed as a new (2nd) parameter to the flow + callback function. client_data may be NULL. + +File formats: + + o Slight improvement to A-law/u-law conversion accuracy: round LSB + instead of truncating. (robs) + o Fix length in wav header with multi-channel output to pipe. (robs) + o Fix [2028181] w64 float format incompatibility. (Tim Munro) + o Fix reading AIFF files with pad bytes in COMT chunks. (Joe Holt) + o Fix AIFF file length bug to stop reading trash data on files that + have extra chunks at end of file. (Joe Holt) + o Fix file length being 4 bytes short for AIFF sowt CD tracks. (Joe Holt) + o Fix [2404566] segfault when converting from MS ADPCM wav file. (robs) + o Fix slight FLAC seek inaccuracy e.g. when using `trim' effect. (robs) + o Fix mp3 decode sometimes being up to a block short. (robs) + o Fix not outputing GSM-in-wav when input is GSM-in-wav. (robs) + +Audio device drivers: + + o New native OpenBSD audio handler for play/recording. (Alexandre Ratchov) + o 24-bit support for ALSA handler. (robs) + o Warn if ALSA under/overrun. (robs) + +Effects: + + o New `stats' effect; multichannel audio statistics. (robs) + o New `sinc' FFT filter effect; replacement for `filter'. (robs) + o New `fir' filter effect using external coefficients/file. (robs) + o New `biquad' filter effect using external coefficients. (robs) + o New `overdrive' effect. (robs) + o New `vad' Voice Activity Detector effect. (robs) + o `synth' enhancements: can now set common parameters for multiple + channels, new `pluck' and `tpdf' types, `scientific' note + notation, [2778142] just intonation. (robs) + o New multi-channel support and revised sizing options for `spectrogram'. + N.B. revised options are not directly backwards compatible -- see the + man page for details of the new syntax. (robs) + o Richer gain/normalise options. (robs) + o [2704442] Slight change to `riaa' gain: now norm'd to 0dB @ 1k + (previously 19.9dB @ DC). (Glenn Davis) + o Fix [2487589] `dither' clipping detection & handling. (robs) + o Fix `repeat' sometimes stopping repeating too soon. (robs) + o Fix `repeat' sometimes repeating wrong audio segments. (robs) + o Fix [2332343] 'silence' segfault with certain lengths. (cbagwell) + o Fix `silence' empty output file with A-law input. (robs) + o Fix temporary file problems in Windows (cygwin) with normalise and + other effects. (robs) + o Fix [2779041] spectrogram PNG file is invalid on Windows. (robs) + o Fix [2787587] `trim x 0' should produce zero length audio. (robs) + o Parallel effects channel processing on some hyper-threading/mult-core + architectures. New `--single-threaded' option to disable this. (robs) + +Other new features: + + o Added ability to create shared DLL's on cygwin (cbagwell) + o New `--guard' & `--norm' options; use temporary files to guard against + clipping for many, but not currently all, effects. (robs) + o New `--ignore-length' option to ignore length in input file header (for + simple encodings & for mp3); instead, read to end of file. (robs) + o New `--temp DIRECTORY' option. (robs) + o New `--play-rate-arg ARG' option. (robs) + o New SOX_OPTS environment variable; can be used to provide default + values for above and other options. (robs) + o Grouped files, e.g. play -r 6k "*.vox" plays all at 6k. (robs) + o Automatically `dither'; new `--no-dither' option to disable this. (robs) + o Can now use `v' & `V' keys to adjust volume whilst playing audio (on some + systems). (robs) + o New bitrate, time in seconds, & total options for soxi; bitrate + and file-size display for sox. (robs) + o `Magic' (libmagic) file type detection now selected using `--magic' + option (where supported). + o [2003121] In many cases, no longer need to specify -t when inputing + audio from a `pipe'. (robs) + o Support more Shoutcast URL variants. (robs) + o Added libSoX example #3: playing audio. (robs) + +Other bug fixes: + + o Fix [2262177] SoX build could fail with parse /etc/issue error. (robs) + o Fix "no handler for detected file type `application/octet-stream; + charset=binary'" with raw files when using libmagic. (robs) + +Internal improvements: + + o Rationalise use of and make repeatable across different platforms + pseudo random number generators. (robs) + o Rationalise effects' options interface (getopt compatible). (robs) + o Added stub headers to allow test compilation of all sources on + linux. (robs) + + +sox-14.2.0 2008-11-09 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.0.0 E pitch new pitch = old key + +File formats: + + o New `.cvu' unfiltered CVSD; supports any bit-rate. (robs) + o New `.sox' native format intended for intermediate files. (robs) + o Fix WAV write on 64-bit arch. (robs) + o Fix writing PRC ADPCM files. (Silas Brown) + o Fix problems reading short mp3 files. (robs) + +Effects: + + o N.B. Reduced default bandwidth setting for `rate' effect from 99% + to 95%; use `rate -s' to be compatible with SoX v14.1.0. (robs) + o New options for `rate' effect to configure phase response, + band-width and aliasing. (robs) + o New options for 'dither' effect: RPDF, TPDF, noise-shaping. (robs) + o New `riaa' effect: RIAA vinyl playback EQ. (robs) + o New `loudness' effect: gain control with ISO 226 loudness + compensation. (robs) + o New `bend' effect; pitch bending. (robs) + o New -b option for the norm effect; can be used to fix stereo + imbalance. (robs) + o Wider tempo range for `tempo' effect. (robs) + o New --effects-file option to read effects and arguments from + a file instead of command line. (cbagwell) + o `filter' effect now supports --plot. (robs) + o Improved documentation for the `stat' effect. (robs) + o Fix broken audio pass-through with noiseprof effect. (robs) + o Fix graph legend display when using --plot octave. (robs) + o Fix rare crash with `rate' effect. (robs) + o Fix [2190767] `norm' under-amplifying in some cases. (George Yohng) + o Fix [2007062] Earwax effect can overflow; should clip. (robs) + o Fix [2223251] mcompand should use linkwitz-riley. (robs) + o Fix `phaser' clicks and overflows. (robs) + o Trim will now skip past 2G point correctly. (cbagwell) + o Improved handling of speed changes in the effects chain. (robs) + +Other new features: + + o New psuedo-effects "newfile" and ":" to allow running + multiple effect chains on a single file. newfile will + create a new output file when an effect chain terminates. + Of most use with trim and silence effects. (cbagwell) + o Can now use multiple pipes as inputs to the combiner; + see `Special Filenames' in sox(1). (robs) + o Display SoX build/run environment information with -V -V. (robs) + o Display (with -V) the detected file-type if it differs from the + file extension. (robs) + o New -t option for soxi; to display the detected file type. (robs) + o New -b/--bits, -e/--encoding alternative options for specifying + audio encoding parameters. (robs) + o [FR 1958680] Support more than 32 input files. (robs) + o New native Mac OSX audio handler for playing/recording. (cbagwell) + +Other bug fixes: + + o Bump library version because it was not binary compatible with + SoX 14.0.1 (Pascal Giard) + o Turn off versioning of special libsox_fmt* libraries since thats + not really needed. (kwizart) + o Fixed crash when running play with no arguments. (Dan Nelson) + o Allow libpng to be found with -static option. (cbagwell) + o Allow libsamplerate to be found if pkg-config is installed but + no samplerate.pc exists. (cbagwell) + o [2038855] external lpc10 lib patch. (Oden Eriksson, Mandriva) + o Fix memory leaks in effects chain when restarting effects. (cbagwell) + o Fixed pkg-config CFLAGS. (evilynux) + o Fix sndfile inclusion in build in some circumstances. (robs) + o Fix [2026912] Fails on URL-like filenames. (robs) + o Always add _LARGEFILE_SUPPORT when off_t is 64bits to work around + buggy platforms. Fixes not able to read WAV files. (cbagwell) + +Internal improvements: + + o Fixed all compiler warnings (with gcc 4.3.1, 64-bit arch.). (robs) + o Updates to internal effects chain API. (cbagwell) + o Retire old FFT routines (speeds up `noisered' effect). (robs) + o Allow effects to use getopt. (robs) + o Use libmagic for mp3. (robs) + o Change sox_seek() offset to 64-bit to work with > 2G files (cbagwell) + o Merged libsfx back into libsox to align with sox.h API. (cbagwell) + + +sox-14.1.0 2008-7-29 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 13.0.0 O -e -n + 13.0.0 O -b/-w/-l/-d -1/-2/-4/-8 + 13.0.0 E avg, pick mixer + 13.0.0 E highp, lowp highpass -1, lowpass -1 + 13.0.0 E mask dither + 13.0.0 E vibro ~= tremolo + 13.0.0 F auto Becomes internal only + +File formats: + + o New option --help-format shows info about supported format(s). (robs) + o New WavPack format (includes lossless audio compression, but not + guaranteed lossless file compression). (robs) + o New htk format. (robs) + o Add .f4 & .f8 raw file extensions. (robs) + o Writing aiff, aifc & dvms now repeatable with -R. (robs) + o Writing hcom no longer fails with unsupported rate--chooses + best match. (robs) + o Au/snd: added support for 32-bit integer and 64-bit float PCM + encoding/decoding; display name of unsupported encoding. (robs) + o Can now write .amb (.wav variant) files [FR 1902232]. (robs) + o Can now read 2,3(2.6),4 bit ADPCM .voc files [FR 1714991]. (robs) + o Can now read some MP3 ID3 tags. (robs) + o Can now write Sounder files. (robs) + o Can now write DEC-variant au files (with -x). (robs) + o Comments support for SoundTool files. (robs) + o Fix [1864216] comments mangled when writing ogg-vorbis. (robs) + o Fix short noise at end of alsa playback. (Morita Sho/Tim Munro/robs) + o Fix wve seek accuracy. (robs) + o Fix lpc10 not working. (robs) + o Fix [1187257] wav MS-ADPCM block-align size incorrect. (robs) + o For wav & au, fix [548256] size in header wrong when piping out. (robs) + o Fix IRCAM SF header processing; support all (modern) variants. (robs) + o Fix 24-bit read/write on big-endian systems. (robs) + o Fix crash trying to open non-existent play-list. (robs) + o Fix FLAC read from stdin with libFLAC >= 8. (Patrick Taylor Ramsey/robs) + o Fix [1997637] Trim effect loses samples (with wav). (robs) + +Effects: + + o New `splice' effect; splice together audio sections. (robs) + o New `remix' effect; mixes any number of channels. (robs) + o New `norm' (normalise) effect. (robs) + o New `delay' effect; delay one or more channels. (robs) + o New `contrast' enhancement effect [FR 708923]. (robs) + o Improved `rate' resampling effect; resample, polyphase, & rabbit + now deprecated. (robs) + o New `spectrogram' effect; creates a PNG (if built with PNG lib). (robs) + o `synth' can now sweep linearly and squarely (as well as + exponentially). (robs) + o Can now `fade' out to EOF without giving file-length (if it can + be determined from the input file header). (robs) + o Fix synth max. level setting for some output encodings. (robs) + o Fix crash on 64-bit arch. with tempo & key effects. (Sami Liedes) + o `gain' alias for the vol effect. (robs) + +Other new features: + + o Now possible to control play-back resampling quality (and hence + cpu-load) via the PLAY_RATE_ARG environment variable. (robs) + o Command line support for multiple file comments. (robs) + o New --combine=mix-power option to mix combine using 1/sqrt(n) scaling + instead of 1/n [FR 2012856]. (robs) + o New --input-buffer option to specify (only) input buffer size. (robs) + o New `soxi' utility to extract/display file header fields. (robs) + o Pkg-config support. (Pascal Giard) + o Simple VU meter. (robs) + o Heuristic to detect when playing an album and set + the default replay-gain mode to `album'. (robs) + o Better auto-choice of output file format parameters when + type is different to that of input file. (robs) + o SoX now treats (and displays) encoding size & signal precision + separately. (robs) + o Default audio devices (sox), and allow environment variables to + be used to override the default audio device driver (rec/play) + and default audio device (all). (robs) + o Simpler file info display for `play'. (robs) + o For some file-types, warn if file size seems too short. (robs) + o Added auto-detect for caf, sndr, txw & sf files. (robs) + o Added example0: simpler example of how to develop applications that + use the libSoX effects chain. (robs) + o Added example2: simple example of how to develop applications that + use libSoX to read an audio file. (robs) + o Moved contents of soxexam man page into soxeffect man page. (robs) + +Other bug fixes: + + o Fix [1890983] rec shortcut should apply bit depth (8-bit, + 16-bit, etc.) to input handler. (robs) + o Fix ungraceful handling of out of disc space and other write + errors (bug was introduced in 14.0.0). (robs) + o Fix endian selection (-B, -L, -x) in some circumstances. (robs) + o Fix auto-detect of hcom files. (robs) + +Internal improvements: + + o Use FORTIFY_SOURCE with gcc. (robs) + o Fixed all compiler warnings (with gcc 4.2.3, 32-bit arch). (robs) + o Reimplement (separately) SoundTool & Sounder format handlers. (robs) + o Allow formats & effects to have any size of private data. (robs) + + +sox-14.0.1 2008-01-29 +---------- + + File formats: + + o Added support for non-standard, non-WAVE_FORMAT_EXTENSIBLE + (esp. 24-bit) PCM wav (see wavpcm in soxformat.7 for details). (robs) + + Effects: + + o Reimplemented reverb to be similar to freeverb. (robs) + + Bug fixes: + + o Fix Sndtool read error causing noise at start. (Reynir Stefánsson) + o Fix mixer with >4 numbers, and mixer -3 behaving as mixer -4. (robs) + o Fix [1748909] sox does not report remaining playtime of mp3s. (robs) + o Fix failure to read AIFF files with empty MARK chunk. (robs) + o Fix spurious 'Premature EOF' message in some circumstances. (robs) + o Switched to 16-bit for libao driver since not all its plugins + support it (such as oss, nas, and pulse audio) (Morita Sho) + o Stop crash when "rec" is run with no arguments (Morita Sho). + o Fix -V (without argument) on non-gnu systems. (robs) + o Fix reported (with -V) output audio length in some cases. (robs) + o Fix actual FLAC output file audio length in some cases. (robs) + o Fix poor 24-bit FLAC compression & support newer versions of + libFLAC (1.2.x). (robs) + o Fix loss of 1 decoded FLAC block when using "trim 0 ...". (robs) + o Fix trim when first effect with IMA-ADPCM input wav file. (robs) + + Internal improvements: + + o Let "make distcheck" run some automated test scripts. + o Distribute missing cmake files. + o Fix ogg vorbis compile error on some platforms. + o Remove unused libltdl that could cause header mismatch with + installed libltdl. + o Fix AMR detection with --disable-shared. (robs) + o Updated configure to support linking to static libraries + on mingw for flac, ogg, and libsamplerate libraries. + o Added example1: simple example of how to develop applications that + use the libSoX effects chain. (robs) + + +sox-14.0.0 2007-09-11 +---------- + + File formats: + + o Added ffmpeg support. (Reuben Thomas) + o FLAC: added seekable decoding; added seek-table generation. (robs) + o Added M3U & PLS playlist formats [FR# 1667341] (Note: SHOUTcast PLS + is only partially supported). (robs) + o Made format readers and writers into individual modules for easier + distribution of differently-licensed code. (Reuben Thomas) + o Added libao support. (Reuben Thomas) + o Added support for ADPCM-encoded PRC files, based on Danny Smith's + rec2wav and sndcmp. (Reuben Thomas) + o Added AMR-NB [FR# 728875] & AMR-WB formats (with external libs). (robs) + o Added LPC-10 support. (Reuben Thomas) + + Effects: + + o Use LADSPA effects (one input, one output). (Reuben Thomas) + o --octave option changed to --plot; can now also use gnuplot to + plot effect transfer function. (robs) + o Added soft-knee companding. (robs) + o Show (with --plot) compand transfer function. (robs) + o Allow e.g. "vol 6dB" (as well as "vol 6 dB"). (robs) + o Changed deemph filter from 1st order to 2nd order for + slightly better accuracy. (robs) + o Add option to silence effect to leave periods of silence + in and only strip out extra silence. (Mark Schreiber) + o synth can now generate any number of channels. (robs) + o mixer can now mixdown to mono any number of channels. (robs) + o Added oops effect (mixer special case). (robs) + o All effects that could only work on mono or stereo audio, now + work with any number of channels. (robs) + o Added WSOLA-based key and tempo effects. (robs) + + Other new features: + + o Show (with -S) if clipping is occurring. (robs) + o Added internet input file support (needs wget). (robs) + o Made it possible to build without sound drivers. (Reuben Thomas) + + Bug fixes: + + o Fix (m)compand transfer function non-linearities; fix compand + drain volume. (robs) + o Fix crash with pan effect. (robs) + o Add missing RM define to Makefiles so installs work. + (Bug# 1666599) (cbagwell) + o Fix I/O performance regression in 13.0.0. (Reuben Thomas) + o Fix .lu, .la read regression in 13.0.0 [Bug# 1715076]. (robs) + o Fix uncompressed NIST/Sphere read regression in v13 [Bug #1736016]. + o Fix displayed times when playing a file and using trim. (robs) + o Fix CDDA sector duration display for non-CDDA sample rates. (robs) + o synth fixes: brown noise; inverted square wave; offset < 0. (robs) + o Fix crash when encoding Vorbis or FLAC: with no comment. (robs) + o Fix effect drain problems: chorus, echo(s), phaser. (robs) + o Fix rabbit responsiveness and memory problems. (Peter Samuelson) + o Fix broken stereo audio when recording using ALSA. (robs) + o Fix OSS driver on big endian machines that was introduced in + last release. + + Internal improvements: + + o Renamed libst to libsox for name recongition and to avoid + duplications with other existing libst libraries. (Reuben Thomas) + o Moved effects to libsfx. (Reuben Thomas) + o Got rid of several hundred compiler warnings. (robs, Reuben Thomas) + o Added basic performance testing of I/O. (Reuben Thomas) + o Effects chain processing now available in libSoX. (robs) + o Added effects-chain buffering for effects that use a window [FR# + 1621695]. (robs) + o Added cmake build files for Win32. (robs) + + +sox-13.0.0 2007-02-11 +---------- + + File formats: + + o Support for .caf, .paf, .fap, .nist, .w64, .nist, Matlab 4.2/5.0 + (Octave 2.0/2.1), .pvf, .sds, .sd2 and .xi file formats via libsndfile. + If available, libsndfile can also be used to handle all the other file + formats it understands. (Reuben Thomas) + o Add FLAC support (robs) + o Support Maxis's XA format. (Dwayne C. Litzenberger) + o Add support for 24-bit PCM raw, wav (WAVE_FORMAT_EXTENSIBLE) [FR# 801015], + au, aiff, & flac files. (robs) + o Add AIFF-C output support. (shashimoto) + o New .ima file format for raw IMA ADPCM. (robs) + o Allow the rate and number of channels of .au files to be overridden + by command-line arguments. (robs) + o Add seek support for GSM data in WAV files. Rafal Maszkowski + o Allow encoding quality to be specified (FLAC & Ogg, but not + MP3 yet). (robs) + o Rename -b to -1, -w to -2, -l to -4, -d to -8, and mask to dither. + (robs) + o New options for specifying endianness (and separate options for + nibble & bit reversal) [FR# 1621702]. (robs) + o Improved multi-channel file reading; fixes [1599990]. (robs) + + Effects: + + o Equalizer effect (Pascal Giard) + o bass and treble altering effects. (robs) + o New optional rabbit resample routine, using libsamplerate + (aka Secret Rabbit Code). (Reuben Thomas) + o Added allpass filter effect. (robs) + o Documented the butterworth filter effects; added variable Q. (robs) + o "rate" effect made an alias for "resample". + o Visualisation of various filters' frequency response via Octave. (robs) + o Can now specify width of many 2nd-order filters as: Hz, octaves, + or Q. (robs) + o Dither/mask amount now specifiable. (robs) + o Consistent (and hopefully complete) clipping detection and + reporting. (robs) + o Allow command-line time parameters of < 1 sec to omit the + leading 0. (robs) + o Improved synth usage and improved the synth entry in the man- + page. (robs) + o Higher quality audio speed adjustment; also fixes [1155364]. (robs) + o Replacement flanger effect; also fixes [1393245]. (robs) + o Added silence padding effect. (robs) + o Added ability for noiseprof to use stdout and noisered to use stdin + [FR# 1621694]. (Reuben Thomas) + o vibro effect name deprecated in favour of tremolo; this effect + reimplemented as a special case of synth. (robs) + + Other new features: + + o Remove soxmix. (Reuben Thomas) + o Preview mode now removed, as all it did was use rate rather than + resample, and rate has been removed. + o -V now gives only user-relevant messages, use -V -V to get + developer-relevant messages. (robs) + o -V output much improved and expanded; now includes display of + (auto-)selected effects. (robs) + o sox man-page overhaul, new soxexam man-page entries. (robs) + o Added command line options for specifying the output file + comment. (robs) + o Added ability to merge e.g. 2 mono files to 1 stereo file + [FR# 1297076]. (robs) + o Removed the restrictions whereby multiple input files had to have + the same data encoding & size, and in most situations where they + had to have the same # of channels, and for play where they had + to have the same sampling-rate. (robs) + o Options to apply replay-gain on input; enabled by default + with `play'. (robs) + o Can now use Ctrl-C to skip to next track when playing multiple + files (e.g. play *.mp3); Ctrl-C twice to exit. (robs) + o Added --interactive option to prompt to overwrite pre-existing + output file. (robs) + o Added large file support. (Reuben Thomas) + + Bug fixes: + + o Fix writing MP3 files on AMD64 processors. + o More fixes to MP3 tag reading. Sometimes tags were + detected as valid MP3 frames. + o Fix to stop, avoiding a crash, when starting of effects fails. + (Reuben Thomas) + o Fixed a bug introduced in 12.18.2 that stopped the draining + of effects from occuring. This had stopped the reverse effect, + among others, from working. (Reuben Thomas) + o Several effects are now optimised out in situations where they need + do nothing, e.g. changing rate from 8000 to 8000, or changing volume + by 0dB [Bug# 1395781]. (robs) + o Fix rounding error when reading command-line time + parameters. (robs) + o Fix nul file hander ignoring other format options if rate + option has not been given. (robs) + o Fix synth length accuracy. (robs) + o Fix broken audio when downmixing with any of the following + effects: synth, deemph, vibro. (robs) + o Fixed deemph & earwax effects to work with MP3, vorbis, + & FLAC. (robs) + o Fix wav file handler discarding the last PCM sample in certain + circumstances. (robs) + o Fix [1627972] AIFF read bug when MARK chunk present. (Richard Fuller) + o Fix [1160154] VOX to WAV conversion problem. (robs) + o Removed (for output file only) the potentially + problematic -v option. Use the vol effect instead. (robs) + o Improved the accuracy of integer and floating point PCM + conversions. (robs) + o Don't go into a loop on zero-padded WAVs. (Jorge Serna) + o Fix to AIFF writing to avoid writing invalid files in some situations. + (Reuben Thomas) + o Fix compander effect bugs: [1613030] Compand fails to compress + clipping, [1181423] compand with 0 sec attack/release. (robs) + + Internal improvements: + + o More and better self-tests. (robs) + o Build system overhaul to use the full set of GNU autotools. + (Reuben Thomas) + o Add new getopt1.c to win32 project file. + o Remove old, optional rate change and alaw/ulaw conversion code. + (Reuben Thomas) + o Removed the old internally invoked (but mentioned in the man page) + copy effect. (robs) + + +sox-12.18.2 2006-09-03 +----------- + + o Adding in Debian's disk full fix (#313206). + o Finally got rid of reference to cleanup() function in + library. Applications are now required to detect + all failures from return codes and cleanup as they + want. + o Changed how list of formats and effects are stored internally. + Effects libst users only. Dirk + o Store effects usage so that its accessable by applications. + Dirk + o Modify the synth effect to not use SIGINT to stop processing + and instead return ST_EOF. This allows exact acount of + samples to be written out instead of an approximate amount. + o Fix hangup when attempting to write stereo MP3 files. + (1512218) Kendrick Shaw + o Fix deemph effect would lose stereo separation. (1479249) robs + o Adding cross-platform support for getopt_long + o Make help screens print much more information and add + new --help-effect option. (Originally from Dirk). + o Add support for using an external gsm library instead of + just the internal one. Vladimir Nadvornik + o Updates to nul file handler to prevent crashes during output. + Martin Panter (1482869) + + +sox-12.18.1 2006-05-07 +------------ + + o The "filter" effect could go into infinite drain mode. Now + only drain 1 buffer. noisered as well. + o SoX was ignoring user aborts (ctrl-c) if it occured during + effect drain operations. This was bad if effects had + bugs and stuck in infinite loop. + o Stop SoX from crashing when file type could not be auto + determined (1417776). + o Output filenames with multiple '.' confused SoX. (1417776) + Christian Hammer + o Moved to a common set of CLIP routines. This fixed clipping + bugs in noisered and mcompand. + o Stop SoX from crashing on sphere files that contain large text + strings. (1430025) Ulf Hamhammar + o Fix some overflow crashes in aiff handler. (1430024) Ulf Hamhammar. + o Under windows, set piped input/output to binary mode (1417794). Martin + Panter + o Fixed broken internal version of strdup(). (1417790) Marty + o Stop infinite loop when reading MP3's with a tag size of + exactly 8192 bytes. (1417511) Hans Fugal + o Fix typo in stlib.dsp for loading in Visual Studio 6. + o Fixed problems in silence effect related to removing multiple + periods of silence from the middle of the sound file. + o Reduced the window size greatly on the silence effect to + prevent leaving in silence that looked like noise still based + on RMS values. + o Prevent infinite loop in pitch effect from uninitialize variable. + Frank Heckenbach + o Prevent crashes when printing error mesages (1447239) + o Added makefile and support files to compile using Open Watcom + compiler. (1417798) Marty + o Stop calling flow() on effects that returned EOF during drain(). Allows + two back-to-back reverse effects to work. + o Added support for multiple channels in .dat files. + (1366634) tomchristie + + +sox-12.17.9 2005-12-05 +----------- + + o Updates to compile under VC6. Jimen Ching + o Declare st_signalinfo_t to specifically be signed in case + platform does not default ot signed chars. This + is required for NetBSD/powerpc. + o When seek()ing in AIFF, SMP, and WAV handlers, remaining samples were + incorrectly computed based on bytes and not samples. Jukka + o Changed noisered effect to just warn during clipping instead + of aborting. Ian Turner + o Fixed bug were pieces of audio were lost every buffer read + when running both -c and -r options together on mono audio. + Users probably percieved it as shorter audio files that + played with a sped up tempo. + Bugfix will also apply to other times when multiple effects + are ran on the command line. + o Added support for -V option to play/rec scripts. + o Fix to silence effect to allow negative periods to be specified + (to remove silence from middle of sound file). + o Fix swap option handling so that special case of "swap 1 1" will + work. + o Track length of Ogg Vorbis files on read. + o Add support for displaying a status line that tracks progress + of read/write routines. Part of information requires read + file handlers to be able to determine file length. + o Converted alsa driver to use asoundlib instead of directly + talking to kernel driver. This also means that device names + are now the ALSA logical names instead of /dev type names. + o Added ALSA support to play/rec scripts. + o Added st_open*, st_read, st_write, st_seek, st_close routines + to help simplify developer interface to libst. See libst.3.. + o Removed st_initformat(), st_copyformat(), and + st_checkformat() from library. If your app used those + functions then copy them from 12.17.8 source code + directly into your application or update to use new + routines. + o Force word-alignment on AIFF SSND and APPL chunks on input. + Matthew Hodgson. + o Add fix to WAV handler to only return data in multiples + of sample_size*channels to better handle corrupt files. + o Fixed bug where "-4" option didn't work with avg + effect (Tom Christie). + o Fixed fade's fade-out-length to match man page + description as noted by Geoff Kuenning. This required + updates to the sample crossfade scripts. Also modified fade + effect to report when no more samples will be produced to + prevent unneeded reading of whole file. + o Allow aborting SoX with SIGTERM, along with previous SIGINT. + Norman Ramsey. + + +sox-12.17.8 2005-08-22 +----------- + + o noisered effect had compile problems with some compilers. + o "-x" option was being ignored since 12.17.7. + o Stuart Brady added support for reading and writing RIFX files (big + endian RIFF/WAV files). Also added support for auto detecting + DEC-style ".sd\0" files. + o Gene Mar found typo in polyphase nuttall calculation. + o SMP buffer overflow (detected by gcc 4.0). Reported by Marcus Meissner + and Matthias Saou. + o Fixed URL in manpage to resample overviews. + o Fixed WAV handler so that it didn't think WAV chunks with max size + were invalid chunks. This allows WAV's to be used in pipes since + they have to default to max size. + o WAV files with alaw or ulaw data don't need extended format chunks. + (Lars Immisch) + o In AIFF files, fixed problem were short comments should cause + AIFF handler to get confused and become misaligned. + + +sox-12.17.7 2004-12-20 +----------- + + o Christian Weisgerber sent patches to man page fixes + and patches for sunaudio driver on openbsd. + o Default volume for soxmix wrongly set to 0 instead + of 1/#_input_files (float rounding error). + o Update to ALSA driver to do a better job of detecting + unsupported sample rate/size/encoding and change to + a supported one. + o Fix bug in alsa writing were last last partial buffer + wasn't being flushed. + o Guentcho Skordev pointed out ogg vorbis files were using + the same value for serial numbers each time. + o Changed sox to only read the exact size of a WAV data chunk + if cooledit IFF LIST chunk is found at the end of the file. + Normally, this isn't done to allow reading > 2gig WAV files. + o Modified configure to detect cygwin compiler after detecting + gcc compiler (fixes some default CFLAGS options). + o Added explicit rule for compile *.o from *.c so that + CPPFLAGS is always referenced. Not all platform's default + rule includes CPPFLAGS (FreeBSD). + o Under linux, add include path to /lib/modules/* so that ALSA + include files can be auto detected. + o Ian Turner added an effect to remove noise from an audio + file by first profiling silent periods of the audio + to determine what the noise is (like background hiss on + cassette tapes). + + +sox-12.17.6 2004-10-13 +----------- + + o Changed comment code to always use copies of strings to + fix bug in WAV handlering freeing argv[] memory. + o Use calloc() to create ft_t structures so that all + memory is initialized before being referenced. + o Fixed VOC EOF bug were it thought there was an extra + block when there wasn't. + o Restructured directory layout so that source code is in + a seperate directory. + o Modified SoX to accept multiple input files. Concatenates + files together in this case. + o Removed map effect so that loops and instr could be removed + from effects structures. This makes effects engine stand + alone from the rest of the sox package. + o Benedikt Zeyen found a bug in synth effect when generating + brown noise that could cause clipping. + o David Leverton sent another patch to prevent crashes on + amd64's when resampling. + o Fixed a bug were MP3 files with large ID3v2 tags could + cause SoX to stick in a loop forever. Now, it will + abort on IDv3 tags larger then 100k. Could still be + improved to handle any size. + o Changed volume option (-v) so that it tracks the file + it was specified. This means that when specified with + the input file, it changes volume before effects engine + and when specified with output file, its done after effects + engine. + o Added crossfade_cat.sh script that will concatenate to + audio files and do a crossfade between them. + o Fixed bug in fade effect were it was impossible to do a + fadeout starting from the beginning of the audio file. + o Removed rounding error when changing volume of audio with + "-v" option. This error caused doing a "-v -1.0" twice + to not result in the original file. + o Fixed a possible overflow in lots of effects were MIN + value was treated as -MAX instead of -MAX-1. + o Modifed sox so its OK for effects to not process any + input or output bytes as long as they return ST_EOF. + o When effects output data and reported ST_EOF at the + same time, that buffer was discarded as well as + data from any chained effect. + o Added patch from Eric Benson that attempts to do a seek() + if the first effect is trim. This greatly speeds up + processing large files. + o Daniel Pouzzner implemented a multi-band compander (using + the butterworth filters to split the audio into bands). + o Donnie Smith updated the silence effect so that its possible + to remove silence from the middle of a sound file by + using a negative value for stop_periods. + o Changed float routines to only work with normalized values + from -1:1. + o Modifed .au handler to be able to read and write 32-bit + and 64-bit float data. Only tested reading so far. + o WAV with GSM data now always pads data to even number of bytes. + o Added support for writing 32-bit audio to AIFF. + + +sox-12.17.5 2004-08-15 +----------- + + o Thomas Klausner sent in patches to compile audio drivers under + NetBSD. + o Rahul Powar pointed out a memory leak in the WAV file handler. + It wasn't calling the correct close() function when closing + input files. + o Modified play.1 man page to not use multiple name lines. This + appears to confuse some conversion programs. Updated sox.1 + man page for typo in reverb option. + o Andrew Church fixed problem with header of stereo 8SVX files. + o Jimen Ching added support to scan over garbage data at the + beginning of MP3 files to find valid frames. This is useful + to play WAV and AIFF files that have MP3 data in them until + those handlers support it directly. To play those, force + sox to use the mp3 handler with the "-t mp3" option. + o Added patch from Ulf Harnhammar to wav handler to prevent + buffer overflows. + o Added patch from Redhat to allow resample to work on certain 64-bit + machines (Sam Varshavchik) + o Tony Seebregts added a file handler for headerless Dialogic/OKI ADPCM + files (VOX files). + o Jan Paul Schmidt added a repeat effect to do loops the brute force way. + This is also good for file format that don't support loops as well. + o Fix for OSS driver in rate tolerance calcs that were off because + of type conversion problems. Guenter Geiger. + o Allow reading sphere files with headers greater then 256 bytes. Jimen + Ching. + o Fix for vorbis were comments are displayed in KEY=value format always. + Stop printing some info to stdout in case output is a pipe. Guenter + Geiger. + o J Robert Ray submitted fix for AIFF handler to ignore lowercase + chunks that are unknown. + o Bugfix for 8-bit voc files. Jimen Ching + o General warning cleanups (cbagwell) + o Memory leaks in reading WAV files (Ufuk Kayserilioglu) + o Rearrange link order of ogg vorbis libraries so that they + can be compiled as static. (Christian Weisgerbr) + + +sox-12.17.4 2003-03-22 +----------- + + o Peter Nyhlen fixed a problem with reading Comments in Ogg Vorbis files. + o Added install target to allow installing libgsm from main Makefile. + Leigh Smith. + o Minor updates to sox.c to free unused memory and close all input + files during failures. + o Pieter Krul added a patch that makes play script look at AUDIODEV + environment variable if it exists to find which device to use. + This allows scripts to work with Solaris SunRays and is a good idea + in general. + o Updated config.sub to detect latest supported OS's. + o Fabrizio Gennari added support for reading and writing + MP3 files using the external libraries libmad and libmp3lame. + o Jens Henrik Goebbert sent in several bugfixes for integer overflows + in the compand effect. + o Dan Dickerman sent in patches for integer overflows in the resample + effect. + o Jimen Ching sent in a fix for multi-channel sound file processing + using the avg effect. + o Richards Bannister added patches to clean up prototypes and filter + private sizes being to small. + o Jimen Ching adds -d option to specify 64bit data size and changed + Ulaw/Alaw encoding to default to 8bit data size if not specified. + o David Singer pointed out that a MS program creates AIFF files + with an invalid length of 0 in its header. Changed SoX to warn the + user but continue instead of aborting since SoX can still read + the file just fine. + o Bert van Leeuwen added a file handler for Psion record.app used + for System/Alarms in some Psion devices. + o Richard Bannister sent in a patch to make writing vorbis files + work with Vorbis 1.0 libraries. + o Fixed configure scripts so that they can be ran with the + --with-oss-dsp, --with-alsa, and --with-sun-audio options. + Was causing compile time problems. Reported by Raul Coronado. + o Change Ogg Vorbis support to use VBR encoding to match defaults + of oggenc based on suggestion from Christian Weisgerber. + o Prints error message now when a channel value of -1 is given. + Reported by Pierre Fortin. + o Fixed bug were memory could be trashed if a input WAV file contained + a comment. Found by Rhys Chard. + o Change command line to compile soxmix.o slightly to try and make + Forte compiler happy. + o Added support for ALSA 0.9 driver. Jimen Ching + + +sox-12.17.3 2001-12-15 +----------- + + o Removed check that prevented pan from being invoked when the + input and output channels were the same. + o Ciaran Anscomb added a flush to sunaudio driver after changing + settings. This is because it can start buffering data as soon + as the device is open and the buffered data can be in a + wrong format. + o trim wasn't accounting for # of channels and was generally broken. + o Jeff Bonggren fixed trim bugs were it was failing when triming + data that equaled to BUFSIZ. Also, trim now immediately returns + ST_EOF when its done instead of requiring an extra call that + returns no data. + o auto effect wasn't rewinding the file if the file was less then + 132 bytes. Changed auto parsing of header to be incremental + instead of reading in a large buffer. + o William Plant pointed out a bad pointer access in fade effect's + parsing of options. + o Ken pointed out a problem were private data was not 8-byte aligned + and causing crashes on most RISC CPU's. Fixed by going back to + old style of declaring private data as type "double" which usually + forces strictest alignment. + o ima_rw was miscompiling on alpha's because of a header ordering + problem. + o Erik de Castro Lopo pointed out that when writing 16-bit VOC files + the headers did not contain the correct length or encoding type. + o Seperated st.h into 2 files. st.h for libst users and st_i.h for + internal use. + o Added new types used extensively by libst: st_sample_t & st_size_t. + This allows for more deterministic behavior on 64-bit machines and + also allows sox to possibly work with much larger file sizes. + o SoX was some times getting confused and thinking an EOF was an + error case when reading audio files. Removed unneeded aborts + when EOF was OK. + o Silence effect was broken on stereo files. Also, made thresholds + relative to original bit percision of audio data. When 16-bit audio + is scaled up to 32-bits, a little bit of noise starts to look like a + large amplitude of noise. Also, now using RMS values to smooth out + clicks. RMS rolling window size is 1/10 of sample rate. + o Changed Floats into a type of encoding instead of a size of audio data. + o Put a flush at the end of OSS driver so that no old data would be + left in internal buffers after changing audio format parameters. + o Fixed problem where play script wasn't installed correctly if you + build from another directory (pointed out by Mike Castle). + o Made GSM support internal to libst (no external library required). + o Change configure script to enable ulaw/alaw lookup tables and GSM + support by default. Also have Makefile's make use of more configure + prefix options to allow for customized installs. + o Reverted ulaw/alaw conversion routines back to Sun's versions. + o Modified raw file handler to write files in the same generic buffered + fashion that was added for reading in 12.17.2. Seems to have + speed up some types of writing. + o Reading Ogg Vorbis files could get confused of when EOF was reached. + o Added uninstall rules to Makefile. Added new ststdint.h to define + *int*_t typedefs. + o Added internal strcasecmp for OS/2. + o Added support for swapping "bit" order (MSB becomes LSB) for raw u-law + and A-law data. Some ISDN equipment prefers it this way. Use -x flag + or new .la or .lu file extensions. + o Annonymous patch submitted to fix types and spelling problems in + various files. Also, updated VOC files to have u-law and A-law + support as well as able to read in VOC files using a pipe. More + examples added to soxexam file. + + +sox-12.17.2 2001-09-15 +----------- + + o Daniel Culbert found and fixed a bug in the polyphase effect + that occurs on platforms that rand() can return large values. + The bug resulted in polyphase resampling an audio file to a + different rate then it said it was. + o Stan Seibert contributed a handler for Ogg Vorbis files. It + handles all input formats but can only save using default + settings. + o Darrick Servis has made major cleanups in the code in regards + to error conditions. Helps people using libst. + o Darrick Servis has added added optional seek functionality sox. + Several formats have been modified to make use of this. + o Geoff Kuenning rewrote the average effect into a general-purpose + parametric mapping from N channels to M channels. + o Geoff Kuenning added an optional delay-time parameter to the compander + effect to allow companding to effectively operate based on future + knowledge. + o Geoff Kuenning Added support to fade and trim effect for specifying time + in hh:mm:ss.frac format. + Fixed a bug that caused integer overflow when large start/stop times + were used. + o Geoff Kuenning updated play/rec/soxeffect scripts to handle all effects + added since 12.17. Spell-checked soxexam.1 file. + o Jimen Ching updated ALSA configure support to auto-detect 4.x or 5.x API + and compile correctly under those two. All other versions are unsupported. + o Merged in the NetBSD package changes into CVS finally. + o Removed broken support for non-ANSI compilers. + o Makefile now places the correct path to SoX in the play/rec scripts + based on configuration script values. + o Alexander Pevzner provided a fix for OSS driver for sound being + dropped under heavy CPU loads. Moved GETBLKSIZE operation + until after setting up the format (SBLive! was modify the block size + after changing formats). + o With help from David Blythe, updated OSS drivers to use newer format + interface. OSS driver will now attempt to detect a valid endian type + to use with sound card. + o Carsten Borchardt pointed out a bug in lowp filter. Added new + nul file handler that reads and writes from/to nothing. + Also added new synth effect that creates sounds using a simple + synthesizer. Created a testcd.sh that uses two new features + to create a test sound CD for testing audio equipment. + o Ben Last added a new program that uses libst and will merge two + seperate audio files into a single file with multiple channels. + This was merged into the standard sox.c file by cbagwell. + o Andreas Menke fixed some problems with the speed effect and + how effects were drained. Also improved the usage of printf()'s + to use stderr. + o Corrected AU header length value when comments were less than + 4 bytes. + o Added support for reading non-standard bit size data from AIFF files. + o Ignore unmatched MARK/INSTR chunks in AIFF files now instead of quiting. + o Fixed ALAW encoding bug in .au files as pointed out by Bruce Forsberg. + o Unified the raw reading functions. Probably slightly faster for + most datatypes but was done to fix recording from the OSS driver. + Control-C stopped working somewhere during the 12.17 series. + o Ford Prefect added a dcshift which can shift the midline amplitude + towards the true center. This will allow for a greater range + of volume adjustments without clipping audio data. + o Heikki Leinonen submitted a silence effect that will trim off + silence from the beginning of a file. cbagwell made some modifications + to trim off front and back as well as some other tweaks. + o Made the "auto" effect the default file handler for input files. + Also have auto handler now use file extensions if it can't figure + it out. + + +sox-12.17.1 2000-11-19 +----------- + + o Andreas Kies fixed a bug were we were not detecting correctly + if an output file was seekable. + o Fixed a bug in the mask effect introduced in 12.17. If the libc + version of rand() returned more then 15-bit values then it would + trash your data. Reported by Friedhel Mehnert. + o Added a new fade in/out effect from Ari Moisio. + o AIFF files now ignore a MARK chunk if the loop type is NoLoop (0). + o Fixed bug were it was impossible to output ADPCM data in wav files. + o Fixed bug were rate had to be specified for sphere files (fix from + Antti Honkela). + o Added small work around to let compile with cygwin's gcc 95.2 + which also now allows to compile with GSM support under windows. + o Removed accessing of sound devices in tests for sound support and + instead just look for needed header files. This allows the sound + support to be detected even if the device is currently busy or when + compiled on a box that doesn't have a sound card but the OS supports + it (which is the enviornment of most distributions creating new + binaries). + o Added support to partially handle AIFC files but only uncompressed + versions. This should allow people to work with raw CD audio data + on Mac OSX and also gives a basis for adding future support for + things like ADPCM processing. + o Added new "earwax" effect from Edward Beingessner. It is meant to + be used for CD audio played through headphones. It will move the + sound stage from left/right to in front of you. + o Trim effect did not compute locations as was documented in the + man pages. Changed effect so that it computed the time the + same way that the fade effect does. + + +sox-12.17 2000-09-08 +--------- + + o Sox can now read and write w98 compatible gsm .wav files, + if compiled properly with libgsm. Thanks go to Stuart + Daines for the gsm-wav patches. + This is new, and relatively untested. See -g format option. + o Sox can now write IMA_ADPCM and ADPCM compressed .wav, + this is new, and relatively untested. See -i and -a format + options in manpage. + o General changes to wav.c for writing additional wav formats. + Reading wave headers: more consistency checks. + Writing wave headers: fixes for w98. + o Speedups to adpcm read routines, new codex versions are + now in ima_rw.c and adpcm.c. + o Speedups for raw.c, especially for gcc with glibc. + o Fixed a segfault problem with ulaw/alaw conversion, where + an out-of-range index into the tables could occur. + o More detailed output from the stat effect. + o Continued rewrite of resample.c, now it is almost as + fast with floating arithmetic as the old (buggy) version + was with 16-bit integer arithmetic. The older version + in sox-12.16 shifted frequencies slightly and was less + accurate. (Stan Brooks) + o Extensive rewrite of polyphas.c, should be faster and use less memory + now. The sox-12.16 polyphase code had some bugs. (Stan Brooks) + o New effect 'filter' which is a high-quality DSP lowpass/ + highpass/bandpass filter using windowed sinc function + methods, like polyphase and resample. (Stan Brooks) + o Jan Paul Schmidt added new low/high/bandpass and bandlimit + filters to sox. They have much better results then the old + versions of low/high/bandpass. The new effects are all + Butterworth filters. + o New data file type supported, -sl or extension .sl for + signed 32-bit integers. Some simplification of the raw.c + source. + o Some test programs and scripts in the test directory, for + making gnuplot plots of frequency response, error-levels + of rate-conversion and filter effects. + o Removed sbdsp code. All modern unixes are support via OSS, + ALSA, or sun audio device interfaces. + o Added AVR handler from Jan Paul Schmidt. + o SoX now waits until the last possible moment before opening + the output file. This will allow all input and effect options + to be parsed for errors and abort before overwriting any file. + o SoX will no longer write to files that exists. This will keep + it from deleting files when a user mistakenly types "sox *.wav". + o Added new compander effect from Nick Bailey. Nice general purpose + filter. + o Under Solaris, SoX now checks hardware ability to play stereo/PCM + and forces output data to match. Sorry, no SunOS support. I don't + have access to one any more. + o Fixed array overrun bug in rate effect as pointed out by Ian + Donaldson. + o Fixed clip24() range as pointed out by Ted Powell. + o Fixed possible segfault in echos effect, as pointed out by Zinx + Verituse. + o Moved most documentation to new "soxexam.1" manual page so that + all users on a unix system will have access to important information. + This means no more TIPS, CHEATS, or CHEATS.eft files. + o Richard Kent fixed a byte alignment problem in aiff comment code. + o Loring Holden added support to create missing directories on install + and support for installs from outside the source directory. + o Fabien COELHO added a pan and volume effect. + o Fabien COELHO added a speed effect to sox (like speeding up a tape + machine). Also added pitch which changes pitch without effecting + duration and stretch which stretch time without effecting pitch. + o Leigh Smith updated aiff support to use the COMT check when writing + comments instead of the ANNO. It is the prefered method from Apple + and newer programs are starting to require it. Also fixed some bugs + in how we compute the length of various chunks in output files. + o Changed the default block alignement for IMA ADPCM WAV files to use + 256 which is what windows programs use. Badly written readers expect + 256. + o Matthias Nutt helped add support for specifying multiple effects + to SoX on the command line. + o Curt Zirzow added a trim effect to trim off audio data. + o Updated ALSA driver to support new interface. Jimen Ching + + +sox-12.16 1999-07-13 +--------- + + o Changed raw data functions to perform I/O operations using block reads. + Should improve speeds greatly, especially when filesize is in megs. + Got code ready to tweak speed more which also forced me to clean up + Endian test code. + o Fixed a bug in .au's handling of G.723. It wasn't using the correct + number of bits. Added A-law support to .au. + o Quoted $filename in play/rec scripts so that files with spaces in + their names can be given. + o Old OS/2 support didn't work. Replaced with known working EMX + GCC compatible code. + o ADPCM WAV files were defaulting to 8-bit outputs and thus losing + some persision. Now defaults to 16-bit signed uncompressed data. + o Fixed a couple cross-platform compiler issues. + o Jimen Ching has added support for "configure" in to SOX. Finally, + a good solution to cross-platform compiling! + o Jimen Ching has added native support for the ALSA driver to play + and record audio from. (jching@flex.com) + o Minor correction for -r example in manual page. + o Renamed sox.sh to soxeffect and rewrote. Symbolic links can be made + from this file to the name of a sox effect. It will then run that + effect on STDIN and output the results to STDOUT. + o Fixed up some makefiles and 16-bit support from patches sent by + Mark Morgan Lloyd (markMLl.in@telemetry.co.uk). Also added some + nice DOS test bat files from him as well. + o Cleaned up some more cross-platform compile problems. In the process + got it working with Turbo C again, kinda. It still locks DOS up at times. + o Made AIFF handler work with invalid headers that some programs generate. + Also fix an Endian bug thats been there for quite a long time (when + ran on Intel machines). Made comment lengths even length to make + most MacOS programs happy. cbagwell + o Resample function was updated by Andreas Wilde + (andreas@eakaw2.et.tu-dresden.de) to fix problem were freqs. were + off by a factor of 2. + o Added an effect that swaps stereo channels. cbagwell + o Combined play and rec scripts to a single program to ease mantaince. + Also added GNU style long-options (--help). Careful, some options have + change (but more logical). + o Fixed a very old silly bug were low/high/bandpass filters would + add some trash data to the end of the sound file. + o "avg" effect wouldn't give error message when you tried to average + x number of channels in to the same number of channels. + o Fixed core dump when writting AIFF files with no comments. + (Olaf Pueschel) + + +sox-12.15 1998-10-01 +--------- + + o Juergen Mueller moved Sox forward quite a bit by adding all the + most commonly known "Guitar Effects". He enhanced echo support, + added chorus, flanger, and reverb effects. He also wrote a very + handy CHEAT.eft file for using various effects. + o Incorporated Yamaha TX-16W sampler file support provided by + Rob Talley (rob@aii.com) and Mark Lakata (lakata@physics.berkeley.edu). + o Fixed a small bug in hcom compression, dependent on sign + extension. Leigh Smith (leigh@psychokiller.dialix.oz.au). + o sox -h now prints out the file formats and effects supported. + Leigh Smith and Chris Bagwell. + o smp transfers comments more completely. Leigh Smith. + o aiff manages markers and loops correctly and produces more + verbose output. Leigh Smith. + o Added polyphase resampler (kb@ece.cmu.edu). This adds a slightly + different resampling algorithm to the mix. + o Michael Brown (mjb@pootle.demon.co.uk) sent a patch to stop crashes + from happening when reading mono MS ADPCM files. + o Fabrice Bellard has added a less buggy 'rate' conversion. I've left + the old rate code included but if all goes well this will become + the new 'rate'. Please test and let me know how it works. Resample + effect needs to be reworked now. + o Heiko Eissfeldt: Implemented a simple deemphasis effect for + certain audio cd samples. + o Matija Nalis (mnalis@public.srce.hr) sent a patch to fix volume adjustment + (-v) option of sox. + o Fixed typo in optimazation flag in unix makefile, as pointed out by + Manoj Kasichainula (manojk@io.com). + o Fixed missing ';;' in play script. cbagwell + o Fixed bug in determining length of IMA and MS ADPCM WAVE files. cbagwell + o Fixed bug in how stereo effects were drained which fixed the + "reverse" effect from only saving half of stereo files. cbagwell + o Can use "-e" without an effect again. + o Added -g and -a options for new style support of GSM and ADPCM. Added + error checking to various formats to avoid allowing these types. + + +sox-12.14 1998-05-15 +--------- + + o Bumped major version number up and shortened name. The shorter name + should help the various distributions using this package. + o Added support for MS ADPCM and IMA (or DVI) ADPCM for .wav files. + Thanks to Mark Podlipec's xanim for this code (podlipec@ici.net). + o Change Lance Norskog's email address to thinman@meer.net. The old + one was bouncing. + o Added path string to play and rec strings so that it could be run by + users without complete paths setup (i.e. Ran by "rc" files during bootup + or shutdown) + o Fixed -e option from Richard Guenther + (richard.guenther@student.uni-tuebingen.de) and fixed a small bug + in stat. + o Fixed a bug in the mask effect for ULAW/ALAW files. + o Fixed a bug in cdr output files that appended trash to end of file. + o Guenter Geiger (geiger@iem.mhsg.ac.at) made a rather large patch to + allow sox to work on 64-bit alphas. It was done the easiest meathod + by changing all long declarations to use a macro that knows to + make it 32-bits. Want to port to another 64-bit-but-not-alpha + machine? Grep for "alpha" to see changes. There are most likely + several bugs left for alphas. Guenter is also supporting this + package for the Debian distribution. + o Did some major code cleanups to clear out some warning messages + during compile. This is to clear up problems I'm finding under + both alpha and dos. Some warning messages are actually useful + now (pointing out possible data loss). Hopefully, I didn't + break anything. + o Code clean up allows me to finally compile code under Turbo C + again. Too bad the EXE gets a currupted stack somewhere and locks + up the system. Anyone want to try it with Borland C for me? + If you get a working EXE I would like to start distributing a DOS + package like there used to be. + o Speaking of cleanups, anyone want to help cleanup the makefiles for + various platforms? They are quite outdated right now and it is + very obvious that Sox hasn't been able to compile under all the + platforms it once did for several releases. Please send in + the cleaned-up makefile versions along with what programs you + used to compile it with. + o There is a known bug in hcom's compress() function. It is allocating + memory that can't be free'd under some OS's. It causes a core dump. + + +sox-11gamma-cb3 1997-03-28 +--------------- + +This release of sox is mainly a bugfix release. The following things +have changed: + + o Documentation has been updated when it was obviously wrong. + Much more work could be done. Man pages were updated to + work correctly on Solaris and add some missing info. + o Several people sent me patches to fix compiling on Solaris + as well as fix a few bugs. + o Change USS driver's name to OSS. Man, does that driver + like to change names! This could cause problems if you + have made your own custom play and rec scripts. + o Updated my email address. Sorry if I haven't responded to + any emails as I no longer have access to my old address. + Please use cbagwell@sprynet.com. + o Fixed unix test scripts so that they worked again. + o Fixed endian bug in psion .wve code. + o Replaced outdated voc info file with detailed format info + inside voc code. + o Added new sound format, cvsd (Continuously Variable Slope Delta) + from Thomas Sailer (sailer@ife.ee.ethz.ch). + + +sox-11gamma-cb2 1996-10-04 +--------------- + +This release of sox is based on the latest gamma version released +plus some patches I've made to support the following new features: + +I would like to thank everyone that wrote me about the long +standing bug in Sox that could DELETE your /dev/* file if the +program was aborted for reason such as invalid audio file. Special +thanks for Bryan Franklin for sending in a patch when I was +to busy to even look for it. + + o Better play support for 8-bit stereo voc files. New support + for outputing both 8-bit and 16-bit stereo voc files. + o Built-in support for playing and recording from Linux /dev/dsp. + This is a re-write and seperate module from the previous + support included inside the sbdsp module. Also fixes a buffer + size bug that showed up when using newer versions of OSS. + This driver will work with OSS (and older versions called USS, TASD + and Voxware). + o Support for audio playing and recording with SunOS /dev/audio. + o Fixes a bug were /dev/audio or /dev/dsp could be deleted + when playing an invalid format audio file. + o Expanded options for play and rec scripts. You can now specify + sox effects after the filename and hear them in real time. + Please be sure that an older version of sox is not in your path + because these script will possibly find it first and + incorrectly use it. + o Setting play/record volume still requires an external program. + If you have one a command line program to do this (such as + "mixer" for Linux) then you will want to edit the play and rec + to use this. The current support for it is only in example + form of how it can be done. + + +List of earlier SoX Contributors +-------------------------------- +Covering the time from its creation (Jul '91) until sox-11gamma (Feb '95): + + o Lance Norskog thinman at netcom.com + Creator & maintenance + o Guido Van Rossum guido at cwi.nl + AU, AIFF, AUTO, HCOM, reverse, many bug fixes + o Jef Poskanzer jef at well.sf.ca.us + original code for u-law and delay line + o Bill Neisius bill%solaria at hac2arpa.hac.com + DOS port, 8SVX, Sounder, Soundtool formats + Apollo fixes, stat with auto-picker + o Rick Richardson rick at digibd.com + WAV and SB driver handlers, fixes + o David Champion dgc3 at midway.uchicago.edu + Amiga port + o Pace Willisson pace at blitz.com + Fixes for ESIX + o Leigh Smith leigh at psychok.dialix.oz.au + SMP and comment movement support. + o David Sanderson dws at ssec.wisc.edu + AIX3.1 fixes + o Glenn Lewis glewis at pcocd2.intel.com + AIFF chunking fixes + o Brian Campbell brianc at quantum.qnx.com + QNX port and 16-bit fixes + o Chris Adams gt8741 at prism.gatech.edu + DOS port fixes + o John Kohl jtkohl at kolvir.elcr.ca.us + BSD386 port, VOC stereo support + o Ken Kubo ken at hmcvax.claremont.edu + VMS port, VOC stereo support + o Frank Gadegast phade at cs.tu-berlin.de + Microsoft C 7.0 & C Borland 3.0 ports + o David Elliot dce at scmc.sony.com + CD-R format support + o David Sears dns at essnj3.essnjay.com + Linux support + o Tom Littlejohn tlit at seq1.loc.gov + Raw textual data + o Boisy G. Pitre boisy at microware.com + OS9 port + o Sun Microsystems, Guido Van Rossum + CCITT G.711, G.721, G.723 implementation + o Graeme Gill graeme at labtam.labtam.oz.au + A-LAW format, Good .WAV handling, avg channel expansion + o Allen Grider grider at hfsi.hfsi.com + VOC stereo mode, WAV file handling + o Michel Fingerhut Michel.Fingerhut at ircam.fr + Upgrade 'sf' format to current IRCAM format. Float file support. + o Chris Knight + Achimedes Acorn support + o Richard Caley R.Caley at ed.ac.uk + Psion WVE handler + o Lutz Vieweg lkv at mania.RoBIN.de + MAUD (Amiga) file handler + o Tim Gardner timg at tpi.com + Windows NT port for V7 + o Jimen Ching jiching at wiliki.eng.hawaii.edu + Libst porting bugs + o Lauren Weinstein lauren at vortex.com + DOS porting, scripts, professional use diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/ChangeLog.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/ChangeLog.meta new file mode 100644 index 0000000..d9b0376 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/ChangeLog.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fef962de3940c7f4b8d4b6caa0d84f5c +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/LICENSE.GPL.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/LICENSE.GPL.txt new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/LICENSE.GPL.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/LICENSE.GPL.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/LICENSE.GPL.txt.meta new file mode 100644 index 0000000..fdc4fe4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/LICENSE.GPL.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 90f6482a8e67e2141ae4ab217ae68af0 +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README new file mode 100644 index 0000000..d50f332 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README @@ -0,0 +1,196 @@ + SoX: Sound eXchange + =================== + +SoX (Sound eXchange) is the Swiss Army knife of sound processing tools: it +can convert sound files between many different file formats & audio devices, +and can apply many sound effects & transformations, as well as doing basic +analysis and providing input to more capable analysis and plotting tools. + +SoX is licensed under the GNU GPL and GNU LGPL. To be precise, the 'sox' +and 'soxi' programs are distributed under the GPL, while the library +'libsox' (in which most of SoX's functionality resides) is dual-licensed. +Note that some optional components of libsox are GPL only: if you use these, +you must use libsox under the GPL. See INSTALL for the list of optional +components and their licences. + +If this distribution is of source code (as opposed to pre-built binaries), +then you will need to compile and install SoX as described in the 'INSTALL' +file. + +Changes between this release and previous releases of SoX can be found in +the 'ChangeLog' file; a summary of the file formats and effects supported in +this release can be found below. Detailed documentation for using SoX can +be found in the distributed 'man' pages: + + o sox(1) + o soxi(1) + o soxformat(7) + o libsox(3) + +or in plain text or PDF files for those systems without man. + +The majority of SoX features and fixes are contributed by SoX users - thank +you very much for making SoX a success! There are several new features +wanted for SoX, listed on the feature request tracker at the SoX project +home-page: + + http://sourceforge.net/projects/sox + +users are encouraged to implement them! + +Please submit bug reports, new feature requests, and patches to the relevant +tracker at the above address, or by email: + + mailto:sox-devel@lists.sourceforge.net + +Also accessible via the project home-page is the SoX users' discussion +mailing list which you can join to discuss all matters SoX with other SoX +users; the mail address for this list is: + + mailto:sox-users@lists.sourceforge.net + +The current release handles the following audio file formats: + + + o Raw files in various binary formats + o Raw textual data + o Amiga 8svx files + o Apple/SGI AIFF files + o SUN .au files + o PCM, u-law, A-law + o G7xx ADPCM files (read only) + o mutant DEC .au files + o NeXT .snd files + o AVR files + o CDDA (Compact Disc Digital Audio format) + o CVS and VMS files (continuous variable slope) + o Grandstream ring-tone files + o GSM files + o HTK files + o LPC-10 files + o Macintosh HCOM files + o Amiga MAUD files + o AMR-WB & AMR-NB (with optional libamrwb & libamrnb libraries) + o MP2/MP3 (with optional libmad, libtwolame and libmp3lame libraries) + o Opus files (read only; with optional Opus libraries) + + o Ogg Vorbis files (with optional Ogg Vorbis libraries) + o FLAC files (with optional libFLAC) + o IRCAM SoundFile files + o NIST SPHERE files + o Turtle beach SampleVision files + o Sounder & Soundtool (DOS) files + o Yamaha TX-16W sampler files + o SoundBlaster .VOC files + o Dialogic/OKI ADPCM files (.VOX) + o Microsoft .WAV files + o PCM, floating point + o u-law, A-law, MS ADPCM, IMA (DMI) ADPCM + o GSM + o RIFX (big endian) + o WavPack files (with optional libwavpack library) + o Psion (palmtop) A-law WVE files and Record voice notes + o Maxis XA Audio files + o EA ADPCM (read support only, for now) + o Pseudo formats that allow direct playing/recording from most audio devices + o The "null" pseudo-file that reads and writes from/to nowhere + + +The audio effects/tools included in this release are as follows: + + o Tone/filter effects + o allpass: RBJ all-pass biquad IIR filter + o bandpass: RBJ band-pass biquad IIR filter + o bandreject: RBJ band-reject biquad IIR filter + o band: SPKit resonator band-pass IIR filter + o bass: Tone control: RBJ shelving biquad IIR filter + o equalizer: RBJ peaking equalisation biquad IIR filter + o firfit+: FFT convolution FIR filter using given freq. response (W.I.P.) + o highpass: High-pass filter: Single pole or RBJ biquad IIR + o hilbert: Hilbert transform filter (90 degrees phase shift) + o lowpass: Low-pass filter: single pole or RBJ biquad IIR + o sinc: Sinc-windowed low/high-pass/band-pass/reject FIR + o treble: Tone control: RBJ shelving biquad IIR filter + + o Production effects + o chorus: Make a single instrument sound like many + o delay: Delay one or more channels + o echo: Add an echo + o echos: Add a sequence of echos + o flanger: Stereo flanger + o overdrive: Non-linear distortion + o phaser: Phase shifter + o repeat: Loop the audio a number of times + o reverb: Add reverberation + o reverse: Reverse the audio (to search for Satanic messages ;-) + o tremolo: Sinusoidal volume modulation + + o Volume/level effects + o compand: Signal level compression/expansion/limiting + o contrast: Phase contrast volume enhancement + o dcshift: Apply or remove DC offset + o fade: Apply a fade-in and/or fade-out to the audio + o gain: Apply gain or attenuation; normalise/equalise/balance/headroom + o loudness: Gain control with ISO 226 loudness compensation + o mcompand: Multi-band compression/expansion/limiting + o norm: Normalise to 0dB (or other) + o vol: Adjust audio volume + + o Editing effects + o pad: Pad (usually) the ends of the audio with silence + o silence: Remove portions of silence from the audio + o splice: Perform the equivalent of a cross-faded tape splice + o trim: Cuts portions out of the audio + o vad: Voice activity detector + + o Mixing effects + o channels: Auto mix or duplicate to change number of channels + o divide+: Divide sample values by those in the 1st channel (W.I.P.) + o remix: Produce arbitrarily mixed output channels + o swap: Swap pairs of channels + + o Pitch/tempo effects + o bend: Bend pitch at given times without changing tempo + o pitch: Adjust pitch (= key) without changing tempo + o speed: Adjust pitch & tempo together + o stretch: Adjust tempo without changing pitch (simple alg.) + o tempo: Adjust tempo without changing pitch (WSOLA alg.) + + o Mastering effects + o dither: Add dither noise to increase quantisation SNR + o rate: Change audio sampling rate + + o Specialised filters/mixers + o deemph: ISO 908 CD de-emphasis (shelving) IIR filter + o earwax: Process CD audio to best effect for headphone use + o noisered: Filter out noise from the audio + o oops: Out Of Phase Stereo (or `Karaoke') effect + o riaa: RIAA vinyl playback equalisation + + o Analysis `effects' + o noiseprof: Produce a DFT profile of the audio (use with noisered) + o spectrogram: graph signal level vs. frequency & time (needs `libpng') + o stat: Enumerate audio peak & RMS levels, approx. freq., etc. + o stats: Multichannel aware `stat' + + o Miscellaneous effects + o ladspa: Apply LADSPA plug-in effects e.g. CMT (Computer Music Toolkit) + o synth: Synthesise/modulate audio tones or noise signals + o newfile: Create a new output file when an effects chain ends. + o restart: Restart 1st effects chain when multiple chains exist. + + o Low-level signal processing effects + o biquad: 2nd-order IIR filter using externally provided coefficients + o downsample: Reduce sample rate by discarding samples + o fir: FFT convolution FIR filter using externally provided coefficients + o upsample: Increase sample rate by zero stuffing + + + Experimental or incomplete effect; may change in future. + +Multiple audio files can be combined (and then further processed with +effects) using any one of the following combiner methods: + + o concatenate + o mix + o merge: E.g. two mono files to one stereo file + o sequence: For playing multiple audio files/streams diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.meta new file mode 100644 index 0000000..2cc4eb1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 40cf255b0f5e02b4fb6fef5eea993e01 +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.osx.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.osx.txt new file mode 100644 index 0000000..35789e3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.osx.txt @@ -0,0 +1,129 @@ +SoX +--- + +This file contains information specific to the MacOS X version of SoX. +Please refer to the README file for general information. + +The sox executable can be installed anywhere you desire. It is a +self-contained statically linked executable. + +If the sox executable is invoked with an executable name of soxi, play, +or rec it will perform the functions of those applications as defined +in included documents. Symlinks are included with this package +but you can also make your own. + +Acknowledgements +---------------- + +The sox exectables included in this package makes use of the following projects: + + SoX - http://sox.sourceforge.net + + FLAC - http://flac.sourceforge.net + + LADSPA - http://www.ladspa.org + + libid3tag - http://www.underbit.com/products/mad + + libltdl - http://www.gnu.org/software/libtool + + libsndfile - http://www.mega-nerd.com/libsndfile + + Ogg Vorbis - http://www.vorbis.com + + PNG - http://www.libpng.org/pub/png + + WavPack - http://www.wavpack.com + +Enjoy, +The SoX Development Team + +Appendix - wget Support +----------------------- + +SoX can make use of the wget command line utility to load files over +the internet or listen to shoutcast streams. It only needs to be +somewhere in your path to be used by SoX. + +Please consult wget's homepage for access to source code as well +as further instructions on configuring and installing. + +http://www.gnu.org/software/wget + +Appendix - MP3 Support +---------------------- + +SoX contains support for reading and writing MP3 files but does not ship +with the dylib's that perform decoding and encoding of MP3 data because +of patent restrictions. For further details, refer to: + +http://en.wikipedia.org/wiki/MP3#Licensing_and_patent_issues + +MP3 support can be enabled by placing Lame encoding library and/or +MAD decoding library into a standard library search location such +as /usr/lib or set LTDL_LIBRARY_PATH to location. + +These can be compiled yourself, they may turn up on searches of the internet +or may be included with other MP3 applications already installed +on your system. Try searching for libmp3lame.dylib and libmad.dylib. + +Obtain the latest Lame and MAD source code from approprate locations. + +Lame MP3 encoder http://lame.sourceforge.net +MAD MP3 decoder http://www.underbit.com/products/mad + +If your system is setup to compile software, then the following commands +can be used. Note: since SoX is distributed as a 32-bit i386 binary, +the library must match that format as well: + +cd lame-398-2 +./configure CFLAGS="-arch i386 -m32" LDFALGS="-arch i386" +make +sudo make install + +cd libmad-0.15.1b +./configure CFLAGS="-arch i386 -m32" LDFALGS="-arch i386" +make +sudo make install + +Appendix - AMR-NB/AMR-WB Support +-------------------------------- + +SoX contains support for reading and writing AMR-NB and AMR-WB files but +does not ship with the DLL's that perform decoding and encoding of AMR +data because of patent restrictions. + +AMR-NB/AMR-WB support can be enabled by placing required libraries +into a standard library search location such as /usr/lib +or set LTDL_LIBRARY_PATH to search path. + +These can be compiled yourself, they may turn up on searches of the internet +or may be included with other AMR applications already installed +on your system. Try searching for libopencore-amrnb.dylib and +libopencore-amrwb.dylib. + +Obtain the latest amrnb and amrwb source code from +http://sourceforge.net/projects/opencore-amr + +cd opencore-amr-0.1.2 +./configure CFLAGS="-arch i386 -m32" LDFALGS="-arch i386" +make +sudo make install + +If that does not work, then try this: + +cd opencore-amr-0.1.2 +./build_osx.sh + +Appendix - LADSPA Plugins +------------------------- + +SoX has built in support for LADSPA Plugins. These plugins are +mostly built for Linux but some are available for OS X. +The Audacity GUI application has a page that points to a collection +of OS X LADSPA plugins. + +http://audacity.sourceforge.net/download/plugins + +SoX will search for these plugins based on LADSPA_PATH +enviornment variable. See sox.txt for further information. diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.osx.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.osx.txt.meta new file mode 100644 index 0000000..f082c1d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/README.osx.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e0613a813a7e5ee4481a0e00c661ac06 +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/libsox.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/libsox.txt new file mode 100644 index 0000000..c934ff1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/libsox.txt @@ -0,0 +1,335 @@ +SoX(3) Sound eXchange SoX(3) + + + +NAME + libsox − SoX, an audio file‐format and effect library + +SYNOPSIS + #include + + int sox_format_init(void); + + void sox_format_quit(void); + + sox_format_t sox_open_read(const char *path, const sox_signalinfo_t *info, const char *filetype); + + sox_format_t sox_open_write(sox_bool (*overwrite_permitted)(const char *filename), const char *path, const sox_signalinfo_t *info, const char *filetype, const char *comment, sox_size_t length, const sox_instrinfo_t *instr, const sox_loopinfo_t *loops); + + sox_size_t sox_read(sox_format_t ft, sox_ssample_t *buf, sox_size_t len); + + sox_size_t sox_write(sox_format_t ft, sox_ssample_t *buf, sox_size_t len); + + int sox_close(sox_format_t ft); + + int sox_seek(sox_format_t ft, sox_size_t offset, int whence); + + sox_effect_handler_t const *sox_find_effect(char const *name); + + sox_effect_t *sox_create_effect(sox_effect_handler_t const *eh); + + int sox_effect_options(sox_effect_t *effp, int argc, char * const argv[]); + + sox_effects_chain_t *sox_create_effects_chain(sox_encodinginfo_t const *in_enc, sox_encodinginfo_t const *out_enc); + + void sox_delete_effects_chain(sox_effects_chain_t *ecp); + + int sox_add_effect(sox_effects_chaint_t *chain, sox_effect_t*effp, sox_signalinfo_t *in, sox_signalinfo_t const *out); + + cc file.c ‐o file ‐lsox + +DESCRIPTION + libsox is a library of sound sample file format readers/writers and + sound effects processors. It is mainly developed for use by SoX but is + useful for any sound application. + + sox_format_init function performs some required initialization related + to all file format handlers. If compiled with dynamic library support + then this will detect and initialize all external libraries. This + should be called before any other file operations are performed. + + sox_format_quit function performs some required cleanup related to all + file format handlers. + + sox_open_input function opens the file for reading whose name is the + string pointed to by path and associates an sox_format_t with it. If + info is non‐NULL then it will be used to specify the data format of the + input file. This is normally only needed for headerless audio files + since the information is not stored in the file. If filetype is non‐ + NULL then it will be used to specify the file type. If this is not + specified then the file type is attempted to be derived by looking at + the file header and/or the filename extension. A special name of "‐" + can be used to read data from stdin. + + sox_open_output function opens the file for writing whose name is the + string pointed to by path and associates an sox_format_t with it. If + info is non‐NULL then it will be used to specify the data format of the + output file. Since most file formats can write data in different data + formats, this generally has to be specified. The info structure from + the input format handler can be specified to copy data over in the same + format. If comment is non‐NULL, it will be written in the file header + for formats that support comments. If filetype is non‐NULL then it will + be used to specify the file type. If this is not specified then the + file type is attempted to be derived by looking at the filename exten‐ + sion. A special name of "‐" can be used to write data to stdout. + + The function sox_read reads len samples in to buf using the format han‐ + dler specified by ft. All data read is converted to 32‐bit signed sam‐ + ples before being placed in to buf. The value of len is specified in + total samples. If its value is not evenly divisable by the number of + channels, undefined behavior will occur. + + The function sox_write writes len samples from buf using the format + handler specified by ft. Data in buf must be 32‐bit signed samples and + will be converted during the write process. The value of len is speci‐ + fied in total samples. If its value is not evenly divisable by the num‐ + ber of channels, undefined behavior will occur. + + The sox_close function dissociates the named sox_format_t from its + underlying file or set of functions. If the format handler was being + used for output, any buffered data is written first. + + The function sox_find_effect finds effect name, returning a pointer to + its sox_effect_handler_t if it exists, and NULL otherwise. + + The function sox_create_effect instantiates an effect into a + sox_effect_t given a sox_effect_handler_t *. Any missing methods are + automatically set to the corresponding nothing method. + + The function sox_effect_options allows passing options into the effect + to control its behavior. It will return SOX_EOF if there were any + invalid options passed in. On success, the effp‐>in_signal will + optional contain the rate and channel count it requires input data from + and effp‐>out_signal will optionally contain the rate and channel count + it outputs in. When present, this information should be used to make + sure appropriate effects are placed in the effects chain to handle any + needed conversions. + + Passing in options is currently only supported when they are passed in + before the effect is ever started. The behavior is undefined if its + called once the effect is started. + + sox_create_effects_chain will instantiate an effects chain that effects + can be added to. in_enc and out_enc are the signal encoding of the + input and output of the chain respectively. The pointers to in_enc and + out_enc are stored internally and so their memory should not be freed. + Also, it is OK if their values change over time to reflect new input or + output encodings as they are referenced only as effects start up or are + restarted. + + sox_delete_effects_chain will release any resources reserved during the + creation of the chain. This will also call sox_delete_effects if any + effects are still in the chain. + + sox_add_effect adds an effect to the chain. in specifies the input + signal info for this effect. out is a suggestion as to what the output + signal should be but depending on the effects given options and on in + the effect can choose to do differently. Whatever output rate and + channels the effect does produce are written back to in. It is meant + that in be stored and passed to each new call to sox_add_effect so that + changes will be propagated to each new effect. + + SoX includes skeleton C files to assist you in writing new formats + (skelform.c) and effects (skeleff.c). Note that new formats can often + just deal with the header and then use raw.c’s routines for reading and + writing. + + example0.c and example1.c are a good starting point to see how to write + applications using libsox. sox.c itself is also a good reference. + + +RETURN VALUE + Upon successful completion sox_open_input and sox_open_output return an + sox_format_t (which is a pointer). Otherwise, NULL is returned. TODO: + Need a way to return reason for failures. Currently, relies on sox_warn + to print information. + + sox_read and sox_write return the number of samples successfully read + or written. If an error occurs, or the end‐of‐file is reached, the + return value is a short item count or SOX_EOF. TODO: sox_read does not + distiguish between end‐of‐file and error. Need an feof() and ferror() + concept to determine which occured. + + Upon successful completion sox_close returns 0. Otherwise, SOX_EOF is + returned. In either case, any further access (including another call to + sox_close()) to the handler results in undefined behavior. TODO: Need a + way to return reason for failures. Currently, relies on sox_warn to + print information. + + Upon successful completion sox_seek returns 0. Otherwise, SOX_EOF is + returned. TODO Need to set a global error and implement sox_tell. + +ERRORS + TODO + +INTERNALS + SoX’s formats and effects operate with an internal sample format of + signed 32‐bit integer. The data processing routines are called with + buffers of these samples, and buffer sizes which refer to the number of + samples processed, not the number of bytes. File readers translate the + input samples to signed 32‐bit integers and return the number of sam‐ + ples read. For example, data in linear signed byte format is left‐ + shifted 24 bits. + + Representing samples as integers can cause problems when processing the + audio. For example, if an effect to mix down left and right channels + into one monophonic channel were to use the line + + *obuf++ = (*ibuf++ + *ibuf++)/2; + + distortion might occur since the intermediate addition can overflow 32 + bits. The line + + *obuf++ = *ibuf++/2 + *ibuf++/2; + + would get round the overflow problem (at the expense of the least sig‐ + nificant bit). + + Stereo data is stored with the left and right speaker data in succes‐ + sive samples. Quadraphonic data is stored in this order: left front, + right front, left rear, right rear. + +FORMATS + A format is responsible for translating between sound sample files and + an internal buffer. The internal buffer is store in signed longs with + a fixed sampling rate. The format operates from two data structures: a + format structure, and a private structure. + + The format structure contains a list of control parameters for the sam‐ + ple: sampling rate, data size (8, 16, or 32 bits), encoding (unsigned, + signed, floating point, etc.), number of sound channels. It also con‐ + tains other state information: whether the sample file needs to be + byte‐swapped, whether sox_seek() will work, its suffix, its file stream + pointer, its format pointer, and the private structure for the format . + + The private area is just a preallocated data array for the format to + use however it wishes. It should have a defined data structure and + cast the array to that structure. See voc.c for the use of a private + data area. Voc.c has to track the number of samples it writes and when + finishing, seek back to the beginning of the file and write it out. + The private area is not very large. The ‘‘echo’’ effect has to mal‐ + loc() a much larger area for its delay line buffers. + + A format has 6 routines: + + startread Set up the format parameters, or read in a data + header, or do what needs to be done. + + read Given a buffer and a length: read up to that many + samples, transform them into signed long integers, + and copy them into the buffer. Return the number + of samples actually read. + + stopread Do what needs to be done. + + startwrite Set up the format parameters, or write out a data + header, or do what needs to be done. + + write Given a buffer and a length: copy that many samples + out of the buffer, convert them from signed longs + to the appropriate data, and write them to the + file. If it can’t write out all the samples, fail. + + stopwrite Fix up any file header, or do what needs to be + done. + +EFFECTS + Each effect runs with one input and one output stream. An effect’s + implementation comprises six functions that may be called to the follow + flow diagram: + + LOOP (invocations with different parameters) + getopts + LOOP (invocations with the same parameters) + LOOP (channels) + start + LOOP (whilst there is input audio to process) + LOOP (channels) + flow + LOOP (whilst there is output audio to generate) + LOOP (channels) + drain + LOOP (channels) + stop + kill + + Notes: For some effects, some of the functions may not be needed and + can be NULL. An effect that is marked ‘MCHAN’ does not use the LOOP + (channels) lines and must therefore perform multiple channel processing + inside the affected functions. Multiple effect instances may be pro‐ + cessed (according to the above flow diagram) in parallel. + + getopts is called with a character string argument list for + the effect. + + start is called with the signal parameters for the input + and output streams. + + flow is called with input and output data buffers, and + (by reference) the input and output data buffer + sizes. It processes the input buffer into the out‐ + put buffer, and sets the size variables to the num‐ + bers of samples actually processed. It is under no + obligation to read from the input buffer or write + to the output buffer during the same call. If the + call returns SOX_EOF then this should be used as an + indication that this effect will no longer read any + data and can be used to switch to drain mode + sooner. + + drain is called after there are no more input data sam‐ + ples. If the effect wishes to generate more data + samples it copies the generated data into a given + buffer and returns the number of samples generated. + If it fills the buffer, it will be called again, + etc. The echo effect uses this to fade away. + + stop is called when there are no more input samples and + no more output samples to process. It is typically + used to release or close resources (e.g. allocated + memory or temporary files) that were set‐up in + start. See echo.c for an example. + + kill is called to allow resources allocated by getopts + to be released. See pad.c for an example. + +LINKING + The method of linking against libsox depends on how SoX was built on + your system. For a static build, just link against the libraries as + normal. For a dynamic build, you should use libtool to link with the + correct linker flags. See the libtool manual for details; basically, + you use it as: + + libtool −−mode=link gcc −o prog /path/to/libsox.la + + +BUGS + This manual page is both incomplete and out of date. + +SEE ALSO + sox(1), soxformat(7) + + example*.c in the SoX source distribution. + +LICENSE + Copyright 1998−2011 by Chris Bagwell and SoX Contributors. + Copyright 1991 Lance Norskog and Sundry Contributors. + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MER‐ + CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + General Public License for more details. + +AUTHORS + Chris Bagwell (cbagwell@users.sourceforge.net). Other authors and con‐ + tributors are listed in the ChangeLog file that is distributed with the + source code. + + + +libsox February 19, 2011 SoX(3) diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/libsox.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/libsox.txt.meta new file mode 100644 index 0000000..369d8d4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/libsox.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 83bcfc8ca3f43d343b1db971c0dc3fe2 +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/play b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/play new file mode 100644 index 0000000..9ca83ec --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/play @@ -0,0 +1 @@ +sox \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/play.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/play.meta new file mode 100644 index 0000000..5197e25 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/play.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 47b211d67b6bc94488b257e824060eea +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/rec b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/rec new file mode 100644 index 0000000..9ca83ec --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/rec @@ -0,0 +1 @@ +sox \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/rec.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/rec.meta new file mode 100644 index 0000000..20768b4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/rec.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e77d3598d68b334a958f984c2e7f57b +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox new file mode 100644 index 0000000..1d060ba Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.meta new file mode 100644 index 0000000..585ffd5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 938f313efd058be4a961d8d923b9faf4 +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.txt new file mode 100644 index 0000000..3f9599c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.txt @@ -0,0 +1,3525 @@ +SoX(1) Sound eXchange SoX(1) + + + +NAME + SoX − Sound eXchange, the Swiss Army knife of audio manipulation + +SYNOPSIS + sox [global‐options] [format‐options] infile1 + [[format‐options] infile2] ... [format‐options] outfile + [effect [effect‐options]] ... + + play [global‐options] [format‐options] infile1 + [[format‐options] infile2] ... [format‐options] + [effect [effect‐options]] ... + + rec [global‐options] [format‐options] outfile + [effect [effect‐options]] ... + +DESCRIPTION + Introduction + SoX reads and writes audio files in most popular formats and can + optionally apply effects to them. It can combine multiple input + sources, synthesise audio, and, on many systems, act as a general pur‐ + pose audio player or a multi‐track audio recorder. It also has limited + ability to split the input into multiple output files. + + All SoX functionality is available using just the sox command. To sim‐ + plify playing and recording audio, if SoX is invoked as play, the out‐ + put file is automatically set to be the default sound device, and if + invoked as rec, the default sound device is used as an input source. + Additionally, the soxi(1) command provides a convenient way to just + query audio file header information. + + The heart of SoX is a library called libSoX. Those interested in + extending SoX or using it in other programs should refer to the libSoX + manual page: libsox(3). + + SoX is a command‐line audio processing tool, particularly suited to + making quick, simple edits and to batch processing. If you need an + interactive, graphical audio editor, use audacity(1). + + * * * + + The overall SoX processing chain can be summarised as follows: + + Input(s) → Combiner → Effects → Output(s) + + Note however, that on the SoX command line, the positions of the Out‐ + put(s) and the Effects are swapped w.r.t. the logical flow just shown. + Note also that whilst options pertaining to files are placed before + their respective file name, the opposite is true for effects. To show + how this works in practice, here is a selection of examples of how SoX + might be used. The simple + + sox recital.au recital.wav + + translates an audio file in Sun AU format to a Microsoft WAV file, + whilst + + sox recital.au −b 16 recital.wav channels 1 rate 16k fade 3 norm + + performs the same format translation, but also applies four effects + (down‐mix to one channel, sample rate change, fade‐in, nomalize), and + stores the result at a bit‐depth of 16. + + sox −r 16k −e signed −b 8 −c 1 voice‐memo.raw voice‐memo.wav + + converts ‘raw’ (a.k.a. ‘headerless’) audio to a self‐describing file + format, + + sox slow.aiff fixed.aiff speed 1.027 + + adjusts audio speed, + + sox short.wav long.wav longer.wav + + concatenates two audio files, and + + sox −m music.mp3 voice.wav mixed.flac + + mixes together two audio files. + + play "The Moonbeams/Greatest/*.ogg" bass +3 + + plays a collection of audio files whilst applying a bass boosting + effect, + + play −n −c1 synth sin %−12 sin %−9 sin %−5 sin %−2 fade h 0.1 1 0.1 + + plays a synthesised ‘A minor seventh’ chord with a pipe‐organ sound, + + rec −c 2 radio.aiff trim 0 30:00 + + records half an hour of stereo audio, and + + play −q take1.aiff & rec −M take1.aiff take1−dub.aiff + + (with POSIX shell and where supported by hardware) records a new track + in a multi‐track recording. Finally, + + rec −r 44100 −b 16 −e signed‐integer −p \ + silence 1 0.50 0.1% 1 10:00 0.1% | \ + sox −p song.ogg silence 1 0.50 0.1% 1 2.0 0.1% : \ + newfile : restart + + records a stream of audio such as LP/cassette and splits in to multiple + audio files at points with 2 seconds of silence. Also, it does not + start recording until it detects audio is playing and stops after it + sees 10 minutes of silence. + + N.B. The above is just an overview of SoX’s capabilities; detailed + explanations of how to use all SoX parameters, file formats, and + effects can be found below in this manual, in soxformat(7), and in + soxi(1). + + File Format Types + SoX can work with ‘self‐describing’ and ‘raw’ audio files. ‘self‐ + describing’ formats (e.g. WAV, FLAC, MP3) have a header that completely + describes the signal and encoding attributes of the audio data that + follows. ‘raw’ or ‘headerless’ formats do not contain this information, + so the audio characteristics of these must be described on the SoX com‐ + mand line or inferred from those of the input file. + + The following four characteristics are used to describe the format of + audio data such that it can be processed with SoX: + + sample rate + The sample rate in samples per second (‘Hertz’ or ‘Hz’). Digi‐ + tal telephony traditionally uses a sample rate of 8000 Hz + (8 kHz), though these days, 16 and even 32 kHz are becoming more + common. Audio Compact Discs use 44100 Hz (44.1 kHz). Digital + Audio Tape and many computer systems use 48 kHz. Professional + audio systems often use 96 kHz. + + sample size + The number of bits used to store each sample. Today, 16‐bit is + commonly used. 8‐bit was popular in the early days of computer + audio. 24‐bit is used in the professional audio arena. Other + sizes are also used. + + data encoding + The way in which each audio sample is represented (or + ‘encoded’). Some encodings have variants with different byte‐ + orderings or bit‐orderings. Some compress the audio data so + that the stored audio data takes up less space (i.e. disk space + or transmission bandwidth) than the other format parameters and + the number of samples would imply. Commonly‐used encoding types + include floating‐point, μ‐law, ADPCM, signed‐integer PCM, MP3, + and FLAC. + + channels + The number of audio channels contained in the file. One + (‘mono’) and two (‘stereo’) are widely used. ‘Surround sound’ + audio typically contains six or more channels. + + The term ‘bit‐rate’ is a measure of the amount of storage occupied by + an encoded audio signal over a unit of time. It can depend on all of + the above and is typically denoted as a number of kilo‐bits per second + (kbps). An A‐law telephony signal has a bit‐rate of 64 kbps. + MP3‐encoded stereo music typically has a bit‐rate of 128−196 kbps. + FLAC‐encoded stereo music typically has a bit‐rate of 550−760 kbps. + + Most self‐describing formats also allow textual ‘comments’ to be embed‐ + ded in the file that can be used to describe the audio in some way, + e.g. for music, the title, the author, etc. + + One important use of audio file comments is to convey ‘Replay Gain’ + information. SoX supports applying Replay Gain information (for cer‐ + tain input file formats only; currently, at least FLAC and Ogg Vorbis), + but not generating it. Note that by default, SoX copies input file + comments to output files that support comments, so output files may + contain Replay Gain information if some was present in the input file. + In this case, if anything other than a simple format conversion was + performed then the output file Replay Gain information is likely to be + incorrect and so should be recalculated using a tool that supports this + (not SoX). + + The soxi(1) command can be used to display information from audio file + headers. + + Determining & Setting The File Format + There are several mechanisms available for SoX to use to determine or + set the format characteristics of an audio file. Depending on the cir‐ + cumstances, individual characteristics may be determined or set using + different mechanisms. + + To determine the format of an input file, SoX will use, in order of + precedence and as given or available: + + 1. Command‐line format options. + + 2. The contents of the file header. + + 3. The filename extension. + + To set the output file format, SoX will use, in order of precedence and + as given or available: + + 1. Command‐line format options. + + 2. The filename extension. + + 3. The input file format characteristics, or the closest that is sup‐ + ported by the output file type. + + For all files, SoX will exit with an error if the file type cannot be + determined. Command‐line format options may need to be added or changed + to resolve the problem. + + Playing & Recording Audio + The play and rec commands are provided so that basic playing and + recording is as simple as + + play existing‐file.wav + + and + + rec new‐file.wav + + These two commands are functionally equivalent to + + sox existing‐file.wav −d + + and + + sox −d new‐file.wav + + Of course, further options and effects (as described below) can be + added to the commands in either form. + + * * * + + Some systems provide more than one type of (SoX‐compatible) audio + driver, e.g. ALSA & OSS, or SUNAU & AO. Systems can also have more + than one audio device (a.k.a. ‘sound card’). If more than one audio + driver has been built‐in to SoX, and the default selected by SoX when + recording or playing is not the one that is wanted, then the AUDIO‐ + DRIVER environment variable can be used to override the default. For + example (on many systems): + + set AUDIODRIVER=oss + play ... + + The AUDIODEV environment variable can be used to override the default + audio device, e.g. + + set AUDIODEV=/dev/dsp2 + play ... + sox ... −t oss + + or + + set AUDIODEV=hw:soundwave,1,2 + play ... + sox ... −t alsa + + Note that the way of setting environment variables varies from system + to system ‐ for some specific examples, see ‘SOX_OPTS’ below. + + When playing a file with a sample rate that is not supported by the + audio output device, SoX will automatically invoke the rate effect to + perform the necessary sample rate conversion. For compatibility with + old hardware, the default rate quality level is set to ‘low’. This can + be changed by explicitly specifying the rate effect with a different + quality level, e.g. + + play ... rate −m + + or by using the −−play−rate−arg option (see below). + + * * * + + On some systems, SoX allows audio playback volume to be adjusted whilst + using play. Where supported, this is achieved by tapping the ‘v’ & ‘V’ + keys during playback. + + To help with setting a suitable recording level, SoX includes a peak‐ + level meter which can be invoked (before making the actual recording) + as follows: + + rec −n + + The recording level should be adjusted (using the system‐provided mixer + program, not SoX) so that the meter is at most occasionally full scale, + and never ‘in the red’ (an exclamation mark is shown). See also −S + below. + + Accuracy + Many file formats that compress audio discard some of the audio signal + information whilst doing so. Converting to such a format and then con‐ + verting back again will not produce an exact copy of the original + audio. This is the case for many formats used in telephony (e.g. A‐ + law, GSM) where low signal bandwidth is more important than high audio + fidelity, and for many formats used in portable music players (e.g. + MP3, Vorbis) where adequate fidelity can be retained even with the + large compression ratios that are needed to make portable players prac‐ + tical. + + Formats that discard audio signal information are called ‘lossy’. For‐ + mats that do not are called ‘lossless’. The term ‘quality’ is used as + a measure of how closely the original audio signal can be reproduced + when using a lossy format. + + Audio file conversion with SoX is lossless when it can be, i.e. when + not using lossy compression, when not reducing the sampling rate or + number of channels, and when the number of bits used in the destination + format is not less than in the source format. E.g. converting from an + 8‐bit PCM format to a 16‐bit PCM format is lossless but converting from + an 8‐bit PCM format to (8‐bit) A‐law isn’t. + + N.B. SoX converts all audio files to an internal uncompressed format + before performing any audio processing. This means that manipulating a + file that is stored in a lossy format can cause further losses in audio + fidelity. E.g. with + + sox long.mp3 short.mp3 trim 10 + + SoX first decompresses the input MP3 file, then applies the trim + effect, and finally creates the output MP3 file by re‐compressing the + audio ‐ with a possible reduction in fidelity above that which occurred + when the input file was created. Hence, if what is ultimately desired + is lossily compressed audio, it is highly recommended to perform all + audio processing using lossless file formats and then convert to the + lossy format only at the final stage. + + N.B. Applying multiple effects with a single SoX invocation will, in + general, produce more accurate results than those produced using multi‐ + ple SoX invocations. + + Dithering + Dithering is a technique used to maximise the dynamic range of audio + stored at a particular bit‐depth. Any distortion introduced by quanti‐ + sation is decorrelated by adding a small amount of white noise to the + signal. In most cases, SoX can determine whether the selected process‐ + ing requires dither and will add it during output formatting if appro‐ + priate. + + Specifically, by default, SoX automatically adds TPDF dither when the + output bit‐depth is less than 24 and any of the following are true: + + · bit‐depth reduction has been specified explicitly using a command‐ + line option + + · the output file format supports only bit‐depths lower than that of + the input file format + + · an effect has increased effective bit‐depth within the internal + processing chain + + For example, adjusting volume with vol 0.25 requires two additional + bits in which to losslessly store its results (since 0.25 decimal + equals 0.01 binary). So if the input file bit‐depth is 16, then SoX’s + internal representation will utilise 18 bits after processing this vol‐ + ume change. In order to store the output at the same depth as the + input, dithering is used to remove the additional bits. + + Use the −V option to see what processing SoX has automatically added. + The −D option may be given to override automatic dithering. To invoke + dithering manually (e.g. to select a noise‐shaping curve), see the + dither effect. + + Clipping + Clipping is distortion that occurs when an audio signal level (or ‘vol‐ + ume’) exceeds the range of the chosen representation. In most cases, + clipping is undesirable and so should be corrected by adjusting the + level prior to the point (in the processing chain) at which it occurs. + + In SoX, clipping could occur, as you might expect, when using the vol + or gain effects to increase the audio volume. Clipping could also occur + with many other effects, when converting one format to another, and + even when simply playing the audio. + + Playing an audio file often involves resampling, and processing by ana‐ + logue components can introduce a small DC offset and/or amplification, + all of which can produce distortion if the audio signal level was ini‐ + tially too close to the clipping point. + + For these reasons, it is usual to make sure that an audio file’s signal + level has some ‘headroom’, i.e. it does not exceed a particular level + below the maximum possible level for the given representation. Some + standards bodies recommend as much as 9dB headroom, but in most cases, + 3dB (≈ 70% linear) is enough. Note that this wisdom seems to have been + lost in modern music production; in fact, many CDs, MP3s, etc. are now + mastered at levels above 0dBFS i.e. the audio is clipped as delivered. + + SoX’s stat and stats effects can assist in determining the signal level + in an audio file. The gain or vol effect can be used to prevent clip‐ + ping, e.g. + + sox dull.wav bright.wav gain −6 treble +6 + + guarantees that the treble boost will not clip. + + If clipping occurs at any point during processing, SoX will display a + warning message to that effect. + + See also −G and the gain and norm effects. + + Input File Combining + SoX’s input combiner can be configured (see OPTIONS below) to combine + multiple files using any of the following methods: ‘concatenate’, + ‘sequence’, ‘mix’, ‘mix‐power’, ‘merge’, or ‘multiply’. The default + method is ‘sequence’ for play, and ‘concatenate’ for rec and sox. + + For all methods other than ‘sequence’, multiple input files must have + the same sampling rate. If necessary, separate SoX invocations can be + used to make sampling rate adjustments prior to combining. + + If the ‘concatenate’ combining method is selected (usually, this will + be by default) then the input files must also have the same number of + channels. The audio from each input will be concatenated in the order + given to form the output file. + + The ‘sequence’ combining method is selected automatically for play. It + is similar to ‘concatenate’ in that the audio from each input file is + sent serially to the output file. However, here the output file may be + closed and reopened at the corresponding transition between input + files. This may be just what is needed when sending different types of + audio to an output device, but is not generally useful when the output + is a normal file. + + If either the ‘mix’ or ‘mix‐power’ combining method is selected then + two or more input files must be given and will be mixed together to + form the output file. The number of channels in each input file need + not be the same, but SoX will issue a warning if they are not and some + channels in the output file will not contain audio from every input + file. A mixed audio file cannot be un‐mixed without reference to the + original input files. + + If the ‘merge’ combining method is selected then two or more input + files must be given and will be merged together to form the output + file. The number of channels in each input file need not be the same. + A merged audio file comprises all of the channels from all of the input + files. Un‐merging is possible using multiple invocations of SoX with + the remix effect. For example, two mono files could be merged to form + one stereo file. The first and second mono files would become the left + and right channels of the stereo file. + + The ‘multiply’ combining method multiplies the sample values of corre‐ + sponding channels (treated as numbers in the interval −1 to +1). If + the number of channels in the input files is not the same, the missing + channels are considered to contain all zero. + + When combining input files, SoX applies any specified effects (includ‐ + ing, for example, the vol volume adjustment effect) after the audio has + been combined. However, it is often useful to be able to set the volume + of (i.e. ‘balance’) the inputs individually, before combining takes + place. + + For all combining methods, input file volume adjustments can be made + manually using the −v option (below) which can be given for one or more + input files. If it is given for only some of the input files then the + others receive no volume adjustment. In some circumstances, automatic + volume adjustments may be applied (see below). + + The −V option (below) can be used to show the input file volume adjust‐ + ments that have been selected (either manually or automatically). + + There are some special considerations that need to made when mixing + input files: + + Unlike the other methods, ‘mix’ combining has the potential to cause + clipping in the combiner if no balancing is performed. In this case, + if manual volume adjustments are not given, SoX will try to ensure that + clipping does not occur by automatically adjusting the volume (ampli‐ + tude) of each input signal by a factor of ¹/n, where n is the number of + input files. If this results in audio that is too quiet or otherwise + unbalanced then the input file volumes can be set manually as described + above. Using the norm effect on the mix is another alternative. + + If mixed audio seems loud enough at some points but too quiet in others + then dynamic range compression should be applied to correct this ‐ see + the compand effect. + + With the ‘mix‐power’ combine method, the mixed volume is approximately + equal to that of one of the input signals. This is achieved by balanc‐ + ing using a factor of ¹/√n instead of ¹/n. Note that this balancing + factor does not guarantee that clipping will not occur, but the number + of clips will usually be low and the resultant distortion is generally + imperceptible. + + Output Files + SoX’s default behaviour is to take one or more input files and write + them to a single output file. + + This behaviour can be changed by specifying the pseudo‐effect ‘newfile’ + within the effects list. SoX will then enter multiple output mode. + + In multiple output mode, a new file is created when the effects prior + to the ‘newfile’ indicate they are done. The effects chain listed + after ‘newfile’ is then started up and its output is saved to the new + file. + + In multiple output mode, a unique number will automatically be appended + to the end of all filenames. If the filename has an extension then the + number is inserted before the extension. This behaviour can be cus‐ + tomized by placing a %n anywhere in the filename where the number + should be substituted. An optional number can be placed after the % to + indicate a minimum fixed width for the number. + + Multiple output mode is not very useful unless an effect that will stop + the effects chain early is specified before the ‘newfile’. If end of + file is reached before the effects chain stops itself then no new file + will be created as it would be empty. + + The following is an example of splitting the first 60 seconds of an + input file into two 30 second files and ignoring the rest. + + sox song.wav ringtone%1n.wav trim 0 30 : newfile : trim 0 30 + + Stopping SoX + Usually SoX will complete its processing and exit automatically once it + has read all available audio data from the input files. + + If desired, it can be terminated earlier by sending an interrupt signal + to the process (usually by pressing the keyboard interrupt key which is + normally Ctrl‐C). This is a natural requirement in some circumstances, + e.g. when using SoX to make a recording. Note that when using SoX to + play multiple files, Ctrl‐C behaves slightly differently: pressing it + once causes SoX to skip to the next file; pressing it twice in quick + succession causes SoX to exit. + + Another option to stop processing early is to use an effect that has a + time period or sample count to determine the stopping point. The trim + effect is an example of this. Once all effects chains have stopped + then SoX will also stop. + +FILENAMES + Filenames can be simple file names, absolute or relative path names, or + URLs (input files only). Note that URL support requires that wget(1) + is available. + + Note: Giving SoX an input or output filename that is the same as a SoX + effect‐name will not work since SoX will treat it as an effect specifi‐ + cation. The only work‐around to this is to avoid such filenames. This + is generally not difficult since most audio filenames have a filename + ‘extension’, whilst effect‐names do not. + + Special Filenames + The following special filenames may be used in certain circumstances in + place of a normal filename on the command line: + + − SoX can be used in simple pipeline operations by using the spe‐ + cial filename ‘−’ which, if used as an input filename, will + cause SoX will read audio data from ‘standard input’ (stdin), + and which, if used as the output filename, will cause SoX will + send audio data to ‘standard output’ (stdout). Note that when + using this option for the output file, and sometimes when using + it for an input file, the file‐type (see −t below) must also be + given. + + "|program [options] ..." + This can be used in place of an input filename to specify the + the given program’s standard output (stdout) be used as an input + file. Unlike − (above), this can be used for several inputs to + one SoX command. For example, if ‘genw’ generates mono WAV for‐ + matted signals to its standard output, then the following com‐ + mand makes a stereo file from two generated signals: + + sox −M "|genw −−imd −" "|genw −−thd −" out.wav + + For headerless (raw) audio, −t (and perhaps other format + options) will need to be given, preceding the input command. + + "wildcard‐filename" + Specifies that filename ‘globbing’ (wild‐card matching) should + be performed by SoX instead of by the shell. This allows a sin‐ + gle set of file options to be applied to a group of files. For + example, if the current directory contains three ‘vox’ files, + file1.vox, file2.vox, and file3.vox, then + + play −−rate 6k *.vox + + will be expanded by the ‘shell’ (in most environments) to + + play −−rate 6k file1.vox file2.vox file3.vox + + which will treat only the first vox file as having a sample rate + of 6k. With + + play −−rate 6k "*.vox" + + the given sample rate option will be applied to all three vox + files. + + −p, −−sox−pipe + This can be used in place of an output filename to specify that + the SoX command should be used as in input pipe to another SoX + command. For example, the command: + + play "|sox −n −p synth 2" "|sox −n −p synth 2 tremolo 10" stat + + plays two ‘files’ in succession, each with different effects. + + −p is in fact an alias for ‘−t sox −’. + + −d, −−default−device + This can be used in place of an input or output filename to + specify that the default audio device (if one has been built + into SoX) is to be used. This is akin to invoking rec or play + (as described above). + + −n, −−null + This can be used in place of an input or output filename to + specify that a ‘null file’ is to be used. Note that here, ‘null + file’ refers to a SoX‐specific mechanism and is not related to + any operating‐system mechanism with a similar name. + + Using a null file to input audio is equivalent to using a normal + audio file that contains an infinite amount of silence, and as + such is not generally useful unless used with an effect that + specifies a finite time length (such as trim or synth). + + Using a null file to output audio amounts to discarding the + audio and is useful mainly with effects that produce information + about the audio instead of affecting it (such as noiseprof or + stat). + + The sampling rate associated with a null file is by default + 48 kHz, but, as with a normal file, this can be overridden if + desired using command‐line format options (see below). + + Supported File & Audio Device Types + See soxformat(7) for a list and description of the supported file for‐ + mats and audio device drivers. + +OPTIONS + Global Options + These options can be specified on the command line at any point before + the first effect name. + + The SOX_OPTS environment variable can be used to provide alternative + default values for SoX’s global options. For example: + + SOX_OPTS="−−buffer 20000 −−play−rate−arg −hs −−temp /mnt/temp" + + Note that setting SOX_OPTS can potentially create unwanted changes in + the behaviour of scripts or other programs that invoke SoX. SOX_OPTS + might best be used for things (such as in the given example) that + reflect the environment in which SoX is being run. Enabling options + such as −−no−clobber as default might be handled better using a shell + alias since a shell alias will not affect operation in scripts etc. + + One way to ensure that a script cannot be affected by SOX_OPTS is to + clear SOX_OPTS at the start of the script, but this of course loses the + benefit of SOX_OPTS carrying some system‐wide default options. An + alternative approach is to explicitly invoke SoX with default option + values, e.g. + + SOX_OPTS="−V −−no‐clobber" + ... + sox −V2 −−clobber $input $output ... + + Note that the way to set environment variables varies from system to + system. Here are some examples: + + Unix bash: + + export SOX_OPTS="−V −−no‐clobber" + + Unix csh: + + setenv SOX_OPTS "−V −−no‐clobber" + + MS‐DOS/MS‐Windows: + + set SOX_OPTS=−V −−no‐clobber + + MS‐Windows GUI: via Control Panel : System : Advanced : Environment + Variables + + Mac OS X GUI: Refer to Apple’s Technical Q&A QA1067 document. + + −−buffer BYTES, −−input−buffer BYTES + Set the size in bytes of the buffers used for processing audio + (default 8192). −−buffer applies to input, effects, and output + processing; −−input−buffer applies only to input processing (for + which it overrides −−buffer if both are given). + + Be aware that large values for −−buffer will cause SoX to be + become slow to respond to requests to terminate or to skip the + current input file. + + −−clobber + Don’t prompt before overwriting an existing file with the same + name as that given for the output file. This is the default be‐ + haviour. + + −−combine concatenate|merge|mix|mix−power|multiply|sequence + Select the input file combining method; for some of these, short + options are available: −m selects ‘mix’, −M selects ‘merge’, and + −T selects ‘multiply’. + + See Input File Combining above for a description of the differ‐ + ent combining methods. + + −D, −−no−dither + Disable automatic dither ‐ see ‘Dithering’ above. An example of + why this might occasionally be useful is if a file has been con‐ + verted from 16 to 24 bit with the intention of doing some pro‐ + cessing on it, but in fact no processing is needed after all and + the original 16 bit file has been lost, then, strictly speaking, + no dither is needed if converting the file back to 16 bit. See + also the stats effect for how to determine the actual bit depth + of the audio within a file. + + −−effects−file FILENAME + Use FILENAME to obtain all effects and their arguments. The + file is parsed as if the values were specified on the command + line. A new line can be used in place of the special : marker + to separate effect chains. For convenience, such markers at the + end of the file are normally ignored; if you want to specify an + empty last effects chain, use an explicit : by itself on the + last line of the file. This option causes any effects specified + on the command line to be discarded. + + −G, −−guard + Automatically invoke the gain effect to guard against clipping. + E.g. + + sox −G infile −b 16 outfile rate 44100 dither −s + + is shorthand for + + sox infile −b 16 outfile gain −h rate 44100 gain −rh dither −s + + See also −V, −−norm, and the gain effect. + + −h, −−help + Show version number and usage information. + + −−help−effect NAME + Show usage information on the specified effect. The name all + can be used to show usage on all effects. + + −−help−format NAME + Show information about the specified file format. The name all + can be used to show information on all formats. + + −−i, −−info + Only if given as the first parameter to sox, behave as soxi(1). + + −m|−M Equivalent to −−combine mix and −−combine merge, respectively. + + −−magic + If SoX has been built with the optional ‘libmagic’ library then + this option can be given to enable its use in helping to detect + audio file types. + + −−multi−threaded | −−single−threaded + By default, SoX is ‘single threaded’. If the −−multi−threaded + option is given however then SoX will process audio channels for + most multi‐channel effects in parallel on hyper‐threading/multi‐ + core architectures. This may reduce processing time, though + sometimes it may be necessary to use this option in conjunction + with a larger buffer size than is the default to gain any bene‐ + fit from multi‐threaded processing (e.g. 131072; see −−buffer + above). + + −−no−clobber + Prompt before overwriting an existing file with the same name as + that given for the output file. + + N.B. Unintentionally overwriting a file is easier than you + might think, for example, if you accidentally enter + + sox file1 file2 effect1 effect2 ... + + when what you really meant was + + play file1 file2 effect1 effect2 ... + + then, without this option, file2 will be overwritten. Hence, + using this option is recommended. SOX_OPTS (above), a ‘shell’ + alias, script, or batch file may be an appropriate way of perma‐ + nently enabling it. + + −−norm[=dB‐level] + Automatically invoke the gain effect to guard against clipping + and to normalise the audio. E.g. + + sox −−norm infile −b 16 outfile rate 44100 dither −s + + is shorthand for + + sox infile −b 16 outfile gain −h rate 44100 gain −nh dither −s + + Optionally, the audio can be normalized to a given level (usu‐ + ally) below 0 dBFS: + + sox −−norm=−3 infile outfile + + + See also −V, −G, and the gain effect. + + −−play−rate−arg ARG + Selects a quality option to be used when the ‘rate’ effect is + automatically invoked whilst playing audio. This option is typ‐ + ically set via the SOX_OPTS environment variable (see above). + + −−plot gnuplot|octave|off + If not set to off (the default if −−plot is not given), run in a + mode that can be used, in conjunction with the gnuplot program + or the GNU Octave program, to assist with the selection and con‐ + figuration of many of the transfer‐function based effects. For + the first given effect that supports the selected plotting pro‐ + gram, SoX will output commands to plot the effect’s transfer + function, and then exit without actually processing any audio. + E.g. + + sox −−plot octave input‐file −n highpass 1320 > highpass.plt + octave highpass.plt + + + −q, −−no−show−progress + Run in quiet mode when SoX wouldn’t otherwise do so. This is + the opposite of the −S option. + + −R Run in ‘repeatable’ mode. When this option is given, where + applicable, SoX will embed a fixed time‐stamp in the output file + (e.g. AIFF) and will ‘seed’ pseudo random number generators + (e.g. dither) with a fixed number, thus ensuring that succes‐ + sive SoX invocations with the same inputs and the same parame‐ + ters yield the same output. + + −−replay−gain track|album|off + Select whether or not to apply replay‐gain adjustment to input + files. The default is off for sox and rec, album for play where + (at least) the first two input files are tagged with the same + Artist and Album names, and track for play otherwise. + + −S, −−show−progress + Display input file format/header information, and processing + progress as input file(s) percentage complete, elapsed time, and + remaining time (if known; shown in brackets), and the number of + samples written to the output file. Also shown is a peak‐level + meter, and an indication if clipping has occurred. The peak‐ + level meter shows up to two channels and is calibrated for digi‐ + tal audio as follows (right channel shown): + + dB FSD Display dB FSD Display + −25 − −11 ==== + −23 = −9 ====− + −21 =− −7 ===== + −19 == −5 =====− + −17 ==− −3 ====== + −15 === −1 =====! + −13 ===− + + A three‐second peak‐held value of headroom in dBs will be shown + to the right of the meter if this is below 6dB. + + This option is enabled by default when using SoX to play or + record audio. + + −T Equivalent to −−combine multiply. + + −−temp DIRECTORY + Specify that any temporary files should be created in the given + DIRECTORY. This can be useful if there are permission or free‐ + space problems with the default location. In this case, using + ‘−−temp .’ (to use the current directory) is often a good solu‐ + tion. + + −−version + Show SoX’s version number and exit. + + −V[level] + Set verbosity. This is particularly useful for seeing how any + automatic effects have been invoked by SoX. + + SoX displays messages on the console (stderr) according to the + following verbosity levels: + + + 0 No messages are shown at all; use the exit status to + determine if an error has occurred. + + 1 Only error messages are shown. These are generated if + SoX cannot complete the requested commands. + + 2 Warning messages are also shown. These are generated if + SoX can complete the requested commands, but not exactly + according to the requested command parameters, or if + clipping occurs. + + 3 Descriptions of SoX’s processing phases are also shown. + Useful for seeing exactly how SoX is processing your + audio. + + 4 and above + Messages to help with debugging SoX are also shown. + + By default, the verbosity level is set to 2 (shows errors and + warnings). Each occurrence of the −V option increases the ver‐ + bosity level by 1. Alternatively, the verbosity level can be + set to an absolute number by specifying it immediately after the + −V, e.g. −V0 sets it to 0. + + + Input File Options + These options apply only to input files and may precede only input + filenames on the command line. + + −−ignore−length + Override an (incorrect) audio length given in an audio file’s + header. If this option is given then SoX will keep reading audio + until it reaches the end of the input file. + + −v, −−volume FACTOR + Intended for use when combining multiple input files, this + option adjusts the volume of the file that follows it on the + command line by a factor of FACTOR. This allows it to be ‘bal‐ + anced’ w.r.t. the other input files. This is a linear (ampli‐ + tude) adjustment, so a number less than 1 decreases the volume + and a number greater than 1 increases it. If a negative number + is given then in addition to the volume adjustment, the audio + signal will be inverted. + + See also the norm, vol, and gain effects, and see Input File + Balancing above. + + Input & Output File Format Options + These options apply to the input or output file whose name they immedi‐ + ately precede on the command line and are used mainly when working with + headerless file formats or when specifying a format for the output file + that is different to that of the input file. + + −b BITS, −−bits BITS + The number of bits (a.k.a. bit‐depth or sometimes word‐length) + in each encoded sample. Not applicable to complex encodings + such as MP3 or GSM. Not necessary with encodings that have a + fixed number of bits, e.g. A/μ‐law, ADPCM. + + For an input file, the most common use for this option is to + inform SoX of the number of bits per sample in a ‘raw’ (‘header‐ + less’) audio file. For example + + sox −r 16k −e signed −b 8 input.raw output.wav + + converts a particular ‘raw’ file to a self‐describing ‘WAV’ + file. + + For an output file, this option can be used (perhaps along with + −e) to set the output encoding size. By default (i.e. if this + option is not given), the output encoding size will (providing + it is supported by the output file type) be set to the input + encoding size. For example + + sox input.cdda −b 24 output.wav + + converts raw CD digital audio (16‐bit, signed‐integer) to a + 24‐bit (signed‐integer) ‘WAV’ file. + + −c CHANNELS, −−channels CHANNELS + The number of audio channels in the audio file. This can be any + number greater than zero. + + For an input file, the most common use for this option is to + inform SoX of the number of channels in a ‘raw’ (‘headerless’) + audio file. Occasionally, it may be useful to use this option + with a ‘headered’ file, in order to override the (presumably + incorrect) value in the header ‐ note that this is only sup‐ + ported with certain file types. Examples: + + sox −r 48k −e float −b 32 −c 2 input.raw output.wav + + converts a particular ‘raw’ file to a self‐describing ‘WAV’ + file. + + play −c 1 music.wav + + interprets the file data as belonging to a single channel + regardless of what is indicated in the file header. Note that + if the file does in fact have two channels, this will result in + the file playing at half speed. + + For an output file, this option provides a shorthand for speci‐ + fying that the channels effect should be invoked in order to + change (if necessary) the number of channels in the audio signal + to the number given. For example, the following two commands + are equivalent: + + sox input.wav −c 1 output.wav bass −b 24 + sox input.wav output.wav bass −b 24 channels 1 + + though the second form is more flexible as it allows the effects + to be ordered arbitrarily. + + −e ENCODING, −−encoding ENCODING + The audio encoding type. Sometimes needed with file‐types that + support more than one encoding type. For example, with raw, WAV, + or AU (but not, for example, with MP3 or FLAC). The available + encoding types are as follows: + + signed‐integer + PCM data stored as signed (‘two’s complement’) integers. + Commonly used with a 16 or 24 −bit encoding size. A + value of 0 represents minimum signal power. + + unsigned‐integer + PCM data stored as unsigned integers. Commonly used with + an 8‐bit encoding size. A value of 0 represents maximum + signal power. + + floating‐point + PCM data stored as IEEE 753 single precision (32‐bit) or + double precision (64‐bit) floating‐point (‘real’) num‐ + bers. A value of 0 represents minimum signal power. + + a‐law International telephony standard for logarithmic encoding + to 8 bits per sample. It has a precision equivalent to + roughly 13‐bit PCM and is sometimes encoded with reversed + bit‐ordering (see the −X option). + + u‐law, mu‐law + North American telephony standard for logarithmic encod‐ + ing to 8 bits per sample. A.k.a. μ‐law. It has a preci‐ + sion equivalent to roughly 14‐bit PCM and is sometimes + encoded with reversed bit‐ordering (see the −X option). + + oki‐adpcm + OKI (a.k.a. VOX, Dialogic, or Intel) 4‐bit ADPCM; it has + a precision equivalent to roughly 12‐bit PCM. ADPCM is a + form of audio compression that has a good compromise + between audio quality and encoding/decoding speed. + + ima‐adpcm + IMA (a.k.a. DVI) 4‐bit ADPCM; it has a precision equiva‐ + lent to roughly 13‐bit PCM. + + ms‐adpcm + Microsoft 4‐bit ADPCM; it has a precision equivalent to + roughly 14‐bit PCM. + + gsm‐full‐rate + GSM is currently used for the vast majority of the + world’s digital wireless telephone calls. It utilises + several audio formats with different bit‐rates and asso‐ + ciated speech quality. SoX has support for GSM’s origi‐ + nal 13kbps ‘Full Rate’ audio format. It is usually CPU‐ + intensive to work with GSM audio. + + Encoding names can be abbreviated where this would not be + ambiguous; e.g. ‘unsigned‐integer’ can be given as ‘un’, but not + ‘u’ (ambiguous with ‘u‐law’). + + For an input file, the most common use for this option is to + inform SoX of the encoding of a ‘raw’ (‘headerless’) audio file + (see the examples in −b and −c above). + + For an output file, this option can be used (perhaps along with + −b) to set the output encoding type For example + + sox input.cdda −e float output1.wav + + sox input.cdda −b 64 −e float output2.wav + + convert raw CD digital audio (16‐bit, signed‐integer) to float‐ + ing‐point ‘WAV’ files (single & double precision respectively). + + By default (i.e. if this option is not given), the output encod‐ + ing type will (providing it is supported by the output file + type) be set to the input encoding type. + + −−no−glob + Specifies that filename ‘globbing’ (wild‐card matching) should + not be performed by SoX on the following filename. For example, + if the current directory contains the two files ‘five‐sec‐ + onds.wav’ and ‘five*.wav’, then + + play −−no−glob "five*.wav" + + can be used to play just the single file ‘five*.wav’. + + −r, −−rate RATE[k] + Gives the sample rate in Hz (or kHz if appended with ‘k’) of the + file. + + For an input file, the most common use for this option is to + inform SoX of the sample rate of a ‘raw’ (‘headerless’) audio + file (see the examples in −b and −c above). Occasionally it may + be useful to use this option with a ‘headered’ file, in order to + override the (presumably incorrect) value in the header ‐ note + that this is only supported with certain file types. For exam‐ + ple, if audio was recorded with a sample‐rate of say 48k from a + source that played back a little, say 1.5%, too slowly, then + + sox −r 48720 input.wav output.wav + + effectively corrects the speed by changing only the file header + (but see also the speed effect for the more usual solution to + this problem). + + For an output file, this option provides a shorthand for speci‐ + fying that the rate effect should be invoked in order to change + (if necessary) the sample rate of the audio signal to the given + value. For example, the following two commands are equivalent: + + sox input.wav −r 48k output.wav bass −b 24 + sox input.wav output.wav bass −b 24 rate 48k + + though the second form is more flexible as it allows rate + options to be given, and allows the effects to be ordered arbi‐ + trarily. + + −t, −−type FILE‐TYPE + Gives the type of the audio file. For both input and output + files, this option is commonly used to inform SoX of the type a + ‘headerless’ audio file (e.g. raw, mp3) where the actual/desired + type cannot be determined from a given filename extension. For + example: + + another‐command | sox −t mp3 − output.wav + + sox input.wav −t raw output.bin + + It can also be used to override the type implied by an input + filename extension, but if overriding with a type that has a + header, SoX will exit with an appropriate error message if such + a header is not actually present. + + See soxformat(7) for a list of supported file types. + + −L, −−endian little + −B, −−endian big + −x, −−endian swap + These options specify whether the byte‐order of the audio data + is, respectively, ‘little endian’, ‘big endian’, or the opposite + to that of the system on which SoX is being used. Endianness + applies only to data encoded as floating‐point, or as signed or + unsigned integers of 16 or more bits. It is often necessary to + specify one of these options for headerless files, and sometimes + necessary for (otherwise) self‐describing files. A given + endian‐setting option may be ignored for an input file whose + header contains a specific endianness identifier, or for an out‐ + put file that is actually an audio device. + + N.B. Unlike other format characteristics, the endianness (byte, + nibble, & bit ordering) of the input file is not automatically + used for the output file; so, for example, when the following is + run on a little‐endian system: + + sox −B audio.s16 trimmed.s16 trim 2 + + trimmed.s16 will be created as little‐endian; + + sox −B audio.s16 −B trimmed.s16 trim 2 + + must be used to preserve big‐endianness in the output file. + + The −V option can be used to check the selected orderings. + + −N, −−reverse−nibbles + Specifies that the nibble ordering (i.e. the 2 halves of a byte) + of the samples should be reversed; sometimes useful with ADPCM‐ + based formats. + + N.B. See also N.B. in section on −x above. + + −X, −−reverse−bits + Specifies that the bit ordering of the samples should be + reversed; sometimes useful with a few (mostly headerless) for‐ + mats. + + N.B. See also N.B. in section on −x above. + + Output File Format Options + These options apply only to the output file and may precede only the + output filename on the command line. + + −−add−comment TEXT + Append a comment in the output file header (where applicable). + + −−comment TEXT + Specify the comment text to store in the output file header + (where applicable). + + SoX will provide a default comment if this option (or −−com‐ + ment−file) is not given. To specify that no comment should be + stored in the output file, use −−comment "" . + + −−comment−file FILENAME + Specify a file containing the comment text to store in the out‐ + put file header (where applicable). + + −C, −−compression FACTOR + The compression factor for variably compressing output file for‐ + mats. If this option is not given then a default compression + factor will apply. The compression factor is interpreted dif‐ + ferently for different compressing file formats. See the + description of the file formats that use this option in soxfor‐ + mat(7) for more information. + +EFFECTS + In addition to converting, playing and recording audio files, SoX can + be used to invoke a number of audio ‘effects’. Multiple effects may be + applied by specifying them one after another at the end of the SoX com‐ + mand line, forming an ‘effects chain’. Note that applying multiple + effects in real‐time (i.e. when playing audio) is likely to require a + high performance computer. Stopping other applications may alleviate + performance issues should they occur. + + Some of the SoX effects are primarily intended to be applied to a sin‐ + gle instrument or ‘voice’. To facilitate this, the remix effect and + the global SoX option −M can be used to isolate then recombine tracks + from a multi‐track recording. + + Multiple Effects Chains + A single effects chain is made up of one or more effects. Audio from + the input runs through the chain until either the end of the input file + is reached or an effect in the chain requests to terminate the chain. + + SoX supports running multiple effects chains over the input audio. In + this case, when one chain indicates it is done processing audio, the + audio data is then sent through the next effects chain. This continues + until either no more effects chains exist or the input has reached the + end of the file. + + An effects chain is terminated by placing a : (colon) after an effect. + Any following effects are a part of a new effects chain. + + It is important to place the effect that will stop the chain as the + first effect in the chain. This is because any samples that are + buffered by effects to the left of the terminating effect will be dis‐ + carded. The amount of samples discarded is related to the −−buffer + option and it should be kept small, relative to the sample rate, if the + terminating effect cannot be first. Further information on stopping + effects can be found in the Stopping SoX section. + + There are a few pseudo‐effects that aid using multiple effects chains. + These include newfile which will start writing to a new output file + before moving to the next effects chain and restart which will move + back to the first effects chain. Pseudo‐effects must be specified as + the first effect in a chain and as the only effect in a chain (they + must have a : before and after they are specified). + + The following is an example of multiple effects chains. It will split + the input file into multiple files of 30 seconds in length. Each out‐ + put filename will have unique number in its name as documented in the + Output Files section. + + sox infile.wav output.wav trim 0 30 : newfile : restart + + + Common Notation And Parameters + In the descriptions that follow, brackets [ ] are used to denote param‐ + eters that are optional, braces { } to denote those that are both + optional and repeatable, and angle brackets < > to denote those that + are repeatable but not optional. Where applicable, default values for + optional parameters are shown in parenthesis ( ). + + The following parameters are used with, and have the same meaning for, + several effects: + + center[k] + See frequency. + + frequency[k] + A frequency in Hz, or, if appended with ‘k’, kHz. + + gain A power gain in dB. Zero gives no gain; less than zero gives an + attenuation. + + position + A position within the audio stream; the syntax is [=|+|−]time‐ + spec, where timespec is a time specification (see below). The + optional first character indicates whether the timespec is to be + interpreted relative to the start (=) or end (−) of audio, or to + the previous position if the effect accepts multiple position + arguments (+). The audio length must be known for end‐relative + locations to work; some effects do accept −0 for end‐of‐audio, + though, even if the length is unknown. Which of =, +, − is the + default depends on the effect and is shown in its syntax as, + e.g., position(+). + + Examples: =2:00 (two minutes into the audio stream), −100s (one + hundred samples before the end of audio), +0:12+10s (twelve sec‐ + onds and ten samples after the previous position), −0.5+1s (one + sample less than half a second before the end of audio). + + width[h|k|o|q] + Used to specify the band‐width of a filter. A number of differ‐ + ent methods to specify the width are available (though not all + for every effect). One of the characters shown may be appended + to select the desired method as follows: + + Method Notes + h Hz + k kHz + o Octaves + q Q‐factor See [2] + + For each effect that uses this parameter, the default method + (i.e. if no character is appended) is the one that it listed + first in the first line of the effect’s description. + + Most effects that expect an audio position or duration in a parameter, + i.e. a time specification, accept either of the following two forms: + + [[hours:]minutes:]seconds[.frac][t] + A specification of ‘1:30.5’ corresponds to one minute, thirty + and ½ seconds. The t suffix is entirely optional (however, see + the silence effect for an exception). Note that the component + values do not have to be normalized; e.g., ‘1:23:45’, ‘83:45’, + ‘79:0285’, ‘1:0:1425’, ‘1::1425’ and ‘5025’ all are legal and + equivalent to each other. + + sampless + Specifies the number of samples directly, as in ‘8000s’. For + large sample counts, e notation is supported: ‘1.7e6s’ is the + same as ‘1700000s’. + + Time specifications can also be chained with + or − into a new time + specification where the right part is added to or subtracted from the + left, respectively: ‘3:00−200s’ means two hundred samples less than + three minutes. + + To see if SoX has support for an optional effect, enter sox −h and look + for its name under the list: ‘EFFECTS’. + + Supported Effects + Note: a categorised list of the effects can be found in the accompany‐ + ing ‘README’ file. + + allpass frequency[k] width[h|k|o|q] + Apply a two‐pole all‐pass filter with central frequency (in Hz) + frequency, and filter‐width width. An all‐pass filter changes + the audio’s frequency to phase relationship without changing its + frequency to amplitude relationship. The filter is described in + detail in [1]. + + This effect supports the −−plot global option. + + band [−n] center[k] [width[h|k|o|q]] + Apply a band‐pass filter. The frequency response drops loga‐ + rithmically around the center frequency. The width parameter + gives the slope of the drop. The frequencies at center + width + and center − width will be half of their original amplitudes. + band defaults to a mode oriented to pitched audio, i.e. voice, + singing, or instrumental music. The −n (for noise) option uses + the alternate mode for un‐pitched audio (e.g. percussion). + Warning: −n introduces a power‐gain of about 11dB in the filter, + so beware of output clipping. band introduces noise in the + shape of the filter, i.e. peaking at the center frequency and + settling around it. + + This effect supports the −−plot global option. + + See also sinc for a bandpass filter with steeper shoulders. + + bandpass|bandreject [−c] frequency[k] width[h|k|o|q] + Apply a two‐pole Butterworth band‐pass or band‐reject filter + with central frequency frequency, and (3dB‐point) band‐width + width. The −c option applies only to bandpass and selects a + constant skirt gain (peak gain = Q) instead of the default: con‐ + stant 0dB peak gain. The filters roll off at 6dB per octave + (20dB per decade) and are described in detail in [1]. + + These effects support the −−plot global option. + + See also sinc for a bandpass filter with steeper shoulders. + + bandreject frequency[k] width[h|k|o|q] + Apply a band‐reject filter. See the description of the bandpass + effect for details. + + bass|treble gain [frequency[k] [width[s|h|k|o|q]]] + Boost or cut the bass (lower) or treble (upper) frequencies of + the audio using a two‐pole shelving filter with a response simi‐ + lar to that of a standard hi‐fi’s tone‐controls. This is also + known as shelving equalisation (EQ). + + gain gives the gain at 0 Hz (for bass), or whichever is the + lower of ∼22 kHz and the Nyquist frequency (for treble). Its + useful range is about −20 (for a large cut) to +20 (for a large + boost). Beware of Clipping when using a positive gain. + + If desired, the filter can be fine‐tuned using the following + optional parameters: + + frequency sets the filter’s central frequency and so can be used + to extend or reduce the frequency range to be boosted or cut. + The default value is 100 Hz (for bass) or 3 kHz (for treble). + + width determines how steep is the filter’s shelf transition. In + addition to the common width specification methods described + above, ‘slope’ (the default, or if appended with ‘s’) may be + used. The useful range of ‘slope’ is about 0.3, for a gentle + slope, to 1 (the maximum), for a steep slope; the default value + is 0.5. + + The filters are described in detail in [1]. + + These effects support the −−plot global option. + + See also equalizer for a peaking equalisation effect. + + bend [−f frame‐rate(25)] [−o over‐sample(16)] { start‐posi‐ + tion(+),cents,end‐position(+) } + Changes pitch by specified amounts at specified times. Each + given triple: start‐position,cents,end‐position specifies one + bend. cents is the number of cents (100 cents = 1 semitone) by + which to bend the pitch. The other values specify the points in + time at which to start and end bending the pitch, respectively. + + The pitch‐bending algorithm utilises the Discrete Fourier Trans‐ + form (DFT) at a particular frame rate and over‐sampling rate. + The −f and −o parameters may be used to adjust these parameters + and thus control the smoothness of the changes in pitch. + + For example, an initial tone is generated, then bent three + times, yielding four different notes in total: + + play −n synth 2.5 sin 667 gain 1 \ + bend .35,180,.25 .15,740,.53 0,−520,.3 + + Here, the first bend runs from 0.35 to 0.6, and the second one + from 0.75 to 1.28 seconds. Note that the clipping that is pro‐ + duced in this example is deliberate; to remove it, use gain −5 + in place of gain 1. + + See also pitch. + + biquad b0 b1 b2 a0 a1 a2 + Apply a biquad IIR filter with the given coefficients. Where b* + and a* are the numerator and denominator coefficients respec‐ + tively. + + See http://en.wikipedia.org/wiki/Digital_biquad_filter (where a0 + = 1). + + This effect supports the −−plot global option. + + channels CHANNELS + Invoke a simple algorithm to change the number of channels in + the audio signal to the given number CHANNELS: mixing if + decreasing the number of channels or duplicating if increasing + the number of channels. + + The channels effect is invoked automatically if SoX’s −c option + specifies a number of channels that is different to that of the + input file(s). Alternatively, if this effect is given explic‐ + itly, then SoX’s −c option need not be given. For example, the + following two commands are equivalent: + + sox input.wav −c 1 output.wav bass −b 24 + sox input.wav output.wav bass −b 24 channels 1 + + though the second form is more flexible as it allows the effects + to be ordered arbitrarily. + + See also remix for an effect that allows channels to be + mixed/selected arbitrarily. + + chorus gain‐in gain‐out + Add a chorus effect to the audio. This can make a single vocal + sound like a chorus, but can also be applied to instrumentation. + + Chorus resembles an echo effect with a short delay, but whereas + with echo the delay is constant, with chorus, it is varied using + sinusoidal or triangular modulation. The modulation depth + defines the range the modulated delay is played before or after + the delay. Hence the delayed sound will sound slower or faster, + that is the delayed sound tuned around the original one, like in + a chorus where some vocals are slightly off key. See [3] for + more discussion of the chorus effect. + + Each four‐tuple parameter delay/decay/speed/depth gives the + delay in milliseconds and the decay (relative to gain‐in) with a + modulation speed in Hz using depth in milliseconds. The modula‐ + tion is either sinusoidal (−s) or triangular (−t). Gain‐out is + the volume of the output. + + A typical delay is around 40ms to 60ms; the modulation speed is + best near 0.25Hz and the modulation depth around 2ms. For exam‐ + ple, a single delay: + + play guitar1.wav chorus 0.7 0.9 55 0.4 0.25 2 −t + + Two delays of the original samples: + + play guitar1.wav chorus 0.6 0.9 50 0.4 0.25 2 −t \ + 60 0.32 0.4 1.3 −s + + A fuller sounding chorus (with three additional delays): + + play guitar1.wav chorus 0.5 0.9 50 0.4 0.25 2 −t \ + 60 0.32 0.4 2.3 −t 40 0.3 0.3 1.3 −s + + + compand attack1,decay1{,attack2,decay2} + [soft‐knee‐dB:]in‐dB1[,out‐dB1]{,in‐dB2,out‐dB2} + [gain [initial‐volume‐dB [delay]]] + + Compand (compress or expand) the dynamic range of the audio. + + The attack and decay parameters (in seconds) determine the time + over which the instantaneous level of the input signal is aver‐ + aged to determine its volume; attacks refer to increases in vol‐ + ume and decays refer to decreases. For most situations, the + attack time (response to the music getting louder) should be + shorter than the decay time because the human ear is more sensi‐ + tive to sudden loud music than sudden soft music. Where more + than one pair of attack/decay parameters are specified, each + input channel is companded separately and the number of pairs + must agree with the number of input channels. Typical values + are 0.3,0.8 seconds. + + The second parameter is a list of points on the compander’s + transfer function specified in dB relative to the maximum possi‐ + ble signal amplitude. The input values must be in a strictly + increasing order but the transfer function does not have to be + monotonically rising. If omitted, the value of out‐dB1 defaults + to the same value as in‐dB1; levels below in‐dB1 are not com‐ + panded (but may have gain applied to them). The point 0,0 is + assumed but may be overridden (by 0,out‐dBn). If the list is + preceded by a soft‐knee‐dB value, then the points at where adja‐ + cent line segments on the transfer function meet will be rounded + by the amount given. Typical values for the transfer function + are 6:−70,−60,−20. + + The third (optional) parameter is an additional gain in dB to be + applied at all points on the transfer function and allows easy + adjustment of the overall gain. + + The fourth (optional) parameter is an initial level to be + assumed for each channel when companding starts. This permits + the user to supply a nominal level initially, so that, for exam‐ + ple, a very large gain is not applied to initial signal levels + before the companding action has begun to operate: it is quite + probable that in such an event, the output would be severely + clipped while the compander gain properly adjusts itself. A + typical value (for audio which is initially quiet) is −90 dB. + + The fifth (optional) parameter is a delay in seconds. The input + signal is analysed immediately to control the compander, but it + is delayed before being fed to the volume adjuster. Specifying + a delay approximately equal to the attack/decay times allows the + compander to effectively operate in a ‘predictive’ rather than a + reactive mode. A typical value is 0.2 seconds. + + * * * + + The following example might be used to make a piece of music + with both quiet and loud passages suitable for listening to in a + noisy environment such as a moving vehicle: + + sox asz.wav asz‐car.wav compand 0.3,1 6:−70,−60,−20 −5 −90 0.2 + + The transfer function (‘6:−70,...’) says that very soft sounds + (below −70dB) will remain unchanged. This will stop the compan‐ + der from boosting the volume on ‘silent’ passages such as + between movements. However, sounds in the range −60dB to 0dB + (maximum volume) will be boosted so that the 60dB dynamic range + of the original music will be compressed 3‐to‐1 into a 20dB + range, which is wide enough to enjoy the music but narrow enough + to get around the road noise. The ‘6:’ selects 6dB soft‐knee + companding. The −5 (dB) output gain is needed to avoid clipping + (the number is inexact, and was derived by experimentation). + The −90 (dB) for the initial volume will work fine for a clip + that starts with near silence, and the delay of 0.2 (seconds) + has the effect of causing the compander to react a bit more + quickly to sudden volume changes. + + In the next example, compand is being used as a noise‐gate for + when the noise is at a lower level than the signal: + + play infile compand .1,.2 −inf,−50.1,−inf,−50,−50 0 −90 .1 + + Here is another noise‐gate, this time for when the noise is at a + higher level than the signal (making it, in some ways, similar + to squelch): + + play infile compand .1,.1 −45.1,−45,−inf,0,−inf 45 −90 .1 + + This effect supports the −−plot global option (for the transfer + function). + + See also mcompand for a multiple‐band companding effect. + + contrast [enhancement‐amount(75)] + Comparable with compression, this effect modifies an audio sig‐ + nal to make it sound louder. enhancement‐amount controls the + amount of the enhancement and is a number in the range 0−100. + Note that enhancement‐amount = 0 still gives a significant con‐ + trast enhancement. + + See also the compand and mcompand effects. + + dcshift shift [limitergain] + Apply a DC shift to the audio. This can be useful to remove a + DC offset (caused perhaps by a hardware problem in the recording + chain) from the audio. The effect of a DC offset is reduced + headroom and hence volume. The stat or stats effect can be used + to determine if a signal has a DC offset. + + The given dcshift value is a floating point number in the range + of ±2 that indicates the amount to shift the audio (which is in + the range of ±1). + + An optional limitergain can be specified as well. It should + have a value much less than 1 (e.g. 0.05 or 0.02) and is used + only on peaks to prevent clipping. + + * * * + + An alternative approach to removing a DC offset (albeit with a + short delay) is to use the highpass filter effect at a frequency + of say 10Hz, as illustrated in the following example: + + sox −n dc.wav synth 5 sin %0 50 + sox dc.wav fixed.wav highpass 10 + + + deemph Apply Compact Disc (IEC 60908) de‐emphasis (a treble attenuation + shelving filter). + + Pre‐emphasis was applied in the mastering of some CDs issued in + the early 1980s. These included many classical music albums, as + well as now sought‐after issues of albums by The Beatles, Pink + Floyd and others. Pre‐emphasis should be removed at playback + time by a de‐emphasis filter in the playback device. However, + not all modern CD players have this filter, and very few PC CD + drives have it; playing pre‐emphasised audio without the correct + de‐emphasis filter results in audio that sounds harsh and is far + from what its creators intended. + + With the deemph effect, it is possible to apply the necessary + de‐emphasis to audio that has been extracted from a pre‐empha‐ + sised CD, and then either burn the de‐emphasised audio to a new + CD (which will then play correctly on any CD player), or simply + play the correctly de‐emphasised audio files on the PC. For + example: + + sox track1.wav track1−deemph.wav deemph + + and then burn track1‐deemph.wav to CD, or + + play track1−deemph.wav + + or simply + + play track1.wav deemph + + The de‐emphasis filter is implemented as a biquad and requires + the input audio sample rate to be either 44.1kHz or 48kHz. Max‐ + imum deviation from the ideal response is only 0.06dB (up to + 20kHz). + + This effect supports the −−plot global option. + + See also the bass and treble shelving equalisation effects. + + delay {position(=)} + Delay one or more audio channels such that they start at the + given position. For example, delay 1.5 +1 3000s delays the + first channel by 1.5 seconds, the second channel by 2.5 seconds + (one second more than the previous channel), the third channel + by 3000 samples, and leaves any other channels that may be + present un‐delayed. The following (one long) command plays a + chime sound: + + play −n synth −j 3 sin %3 sin %−2 sin %−5 sin %−9 \ + sin %−14 sin %−21 fade h .01 2 1.5 delay \ + 1.3 1 .76 .54 .27 remix − fade h 0 2.7 2.5 norm −1 + + and this plays a guitar chord: + + play −n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \ + delay 0 .05 .1 .15 .2 .25 remix − fade 0 4 .1 norm −1 + + + dither [−S|−s|−f filter] [−a] [−p precision] + Apply dithering to the audio. Dithering deliberately adds a + small amount of noise to the signal in order to mask audible + quantization effects that can occur if the output sample size is + less than 24 bits. With no options, this effect will add trian‐ + gular (TPDF) white noise. Noise‐shaping (only for certain sam‐ + ple rates) can be selected with −s. With the −f option, it is + possible to select a particular noise‐shaping filter from the + following list: lipshitz, f‐weighted, modified‐e‐weighted, + improved‐e‐weighted, gesemann, shibata, low‐shibata, high‐shi‐ + bata. Note that most filter types are available only with + 44100Hz sample rate. The filter types are distinguished by the + following properties: audibility of noise, level of (inaudible, + but in some circumstances, otherwise problematic) shaped high + frequency noise, and processing speed. + See http://sox.sourceforge.net/SoX/NoiseShaping for graphs of + the different noise‐shaping curves. + + The −S option selects a slightly ‘sloped’ TPDF, biased towards + higher frequencies. It can be used at any sampling rate but + below ≈22k, plain TPDF is probably better, and above ≈ 37k, + noise‐shaping (if available) is probably better. + + The −a option enables a mode where dithering (and noise‐shaping + if applicable) are automatically enabled only when needed. The + most likely use for this is when applying fade in or out to an + already dithered file, so that the redithering applies only to + the faded portions. However, auto dithering is not fool‐proof, + so the fades should be carefully checked for any noise modula‐ + tion; if this occurs, then either re‐dither the whole file, or + use trim, fade, and concatencate. + + The −p option allows overriding the target precision. + + If the SoX global option −R option is not given, then the + pseudo‐random number generator used to generate the white noise + will be ‘reseeded’, i.e. the generated noise will be different + between invocations. + + This effect should not be followed by any other effect that + affects the audio. + + See also the ‘Dithering’ section above. + + downsample [factor(2)] + Downsample the signal by an integer factor: Only the first out + of each factor samples is retained, the others are discarded. + + No decimation filter is applied. If the input is not a properly + bandlimited baseband signal, aliasing will occur. This may be + desirable, e.g., for frequency translation. + + For a general resampling effect with anti‐aliasing, see rate. + See also upsample. + + earwax Makes audio easier to listen to on headphones. Adds ‘cues’ to + 44.1kHz stereo (i.e. audio CD format) audio so that when lis‐ + tened to on headphones the stereo image is moved from inside + your head (standard for headphones) to outside and in front of + the listener (standard for speakers). + + echo gain‐in gain‐out + Add echoing to the audio. Echoes are reflected sound and can + occur naturally amongst mountains (and sometimes large build‐ + ings) when talking or shouting; digital echo effects emulate + this behaviour and are often used to help fill out the sound of + a single instrument or vocal. The time difference between the + original signal and the reflection is the ‘delay’ (time), and + the loudness of the reflected signal is the ‘decay’. Multiple + echoes can have different delays and decays. + + Each given delay decay pair gives the delay in milliseconds and + the decay (relative to gain‐in) of that echo. Gain‐out is the + volume of the output. For example: This will make it sound as + if there are twice as many instruments as are actually playing: + + play lead.aiff echo 0.8 0.88 60 0.4 + + If the delay is very short, then it sound like a (metallic) ro‐ + bot playing music: + + play lead.aiff echo 0.8 0.88 6 0.4 + + A longer delay will sound like an open air concert in the moun‐ + tains: + + play lead.aiff echo 0.8 0.9 1000 0.3 + + One mountain more, and: + + play lead.aiff echo 0.8 0.9 1000 0.3 1800 0.25 + + + echos gain‐in gain‐out + Add a sequence of echoes to the audio. Each delay decay pair + gives the delay in milliseconds and the decay (relative to gain‐ + in) of that echo. Gain‐out is the volume of the output. + + Like the echo effect, echos stand for ‘ECHO in Sequel’, that is + the first echos takes the input, the second the input and the + first echos, the third the input and the first and the second + echos, ... and so on. Care should be taken using many echos; a + single echos has the same effect as a single echo. + + The sample will be bounced twice in symmetric echos: + + play lead.aiff echos 0.8 0.7 700 0.25 700 0.3 + + The sample will be bounced twice in asymmetric echos: + + play lead.aiff echos 0.8 0.7 700 0.25 900 0.3 + + The sample will sound as if played in a garage: + + play lead.aiff echos 0.8 0.7 40 0.25 63 0.3 + + + equalizer frequency[k] width[q|o|h|k] gain + Apply a two‐pole peaking equalisation (EQ) filter. With this + filter, the signal‐level at and around a selected frequency can + be increased or decreased, whilst (unlike band‐pass and band‐ + reject filters) that at all other frequencies is unchanged. + + frequency gives the filter’s central frequency in Hz, width, the + band‐width, and gain the required gain or attenuation in dB. + Beware of Clipping when using a positive gain. + + In order to produce complex equalisation curves, this effect can + be given several times, each with a different central frequency. + + The filter is described in detail in [1]. + + This effect supports the −−plot global option. + + See also bass and treble for shelving equalisation effects. + + fade [type] fade‐in‐length [stop‐position(=) [fade‐out‐length]] + Apply a fade effect to the beginning, end, or both of the audio. + + An optional type can be specified to select the shape of the + fade curve: q for quarter of a sine wave, h for half a sine + wave, t for linear (‘triangular’) slope, l for logarithmic, and + p for inverted parabola. The default is logarithmic. + + A fade‐in starts from the first sample and ramps the signal + level from 0 to full volume over the time given as fade‐in‐ + length. Specify 0 if no fade‐in is wanted. + + For fade‐outs, the audio will be truncated at stop‐position and + the signal level will be ramped from full volume down to 0 over + an interval of fade‐out‐length before the stop‐position. If + fade‐out‐length is not specified, it defaults to the same value + as fade‐in‐length. No fade‐out is performed if stop‐position is + not specified. If the audio length can be determined from the + input file header and any previous effects, then −0 (or, for + historical reasons, 0) may be specified for stop‐position to + indicate the usual case of a fade‐out that ends at the end of + the input audio stream. + + Any time specification may be used for fade‐in‐length and fade‐ + out‐length. + + See also the splice effect. + + fir [coefs‐file|coefs] + Use SoX’s FFT convolution engine with given FIR filter coeffi‐ + cients. If a single argument is given then this is treated as + the name of a file containing the filter coefficients (white‐ + space separated; may contain ‘#’ comments). If the given file‐ + name is ‘−’, or if no argument is given, then the coefficients + are read from the ‘standard input’ (stdin); otherwise, coeffi‐ + cients may be given on the command line. Examples: + + sox infile outfile fir 0.0195 −0.082 0.234 0.891 −0.145 0.043 + + + sox infile outfile fir coefs.txt + + with coefs.txt containing + + # HP filter + # freq=10000 + 1.2311233052619888e−01 + −4.4777096106211783e−01 + 5.1031563346705155e−01 + −6.6502926320995331e−02 + ... + + + This effect supports the −−plot global option. + + flanger [delay depth regen width speed shape phase interp] + Apply a flanging effect to the audio. See [3] for a detailed + description of flanging. + + All parameters are optional (right to left). + + Range Default Description + delay 0 − 30 0 Base delay in milliseconds. + depth 0 − 10 2 Added swept delay in milliseconds. + regen −95 − 95 0 Percentage regeneration (delayed + signal feedback). + width 0 − 100 71 Percentage of delayed signal mixed + with original. + speed 0.1 − 10 0.5 Sweeps per second (Hz). + shape sin Swept wave shape: sine|triangle. + phase 0 − 100 25 Swept wave percentage phase‐shift + for multi‐channel (e.g. stereo) + flange; 0 = 100 = same phase on + each channel. + interp lin Digital delay‐line interpolation: + linear|quadratic. + + gain [−e|−B|−b|−r] [−n] [−l|−h] [gain‐dB] + Apply amplification or attenuation to the audio signal, or, in + some cases, to some of its channels. Note that use of any of + −e, −B, −b, −r, or −n requires temporary file space to store the + audio to be processed, so may be unsuitable for use with + ‘streamed’ audio. + + Without other options, gain‐dB is used to adjust the signal + power level by the given number of dB: positive amplifies + (beware of Clipping), negative attenuates. With other options, + the gain‐dB amplification or attenuation is (logically) applied + after the processing due to those options. + + Given the −e option, the levels of the audio channels of a + multi‐channel file are ‘equalised’, i.e. gain is applied to all + channels other than that with the highest peak level, such that + all channels attain the same peak level (but, without also giv‐ + ing −n, the audio is not ‘normalised’). + + The −B (balance) option is similar to −e, but with −B, the RMS + level is used instead of the peak level. −B might be used to + correct stereo imbalance caused by an imperfect record turntable + cartridge. Note that unlike −e, −B might cause some clipping. + + −b is similar to −B but has clipping protection, i.e. if neces‐ + sary to prevent clipping whilst balancing, attenuation is + applied to all channels. Note, however, that in conjunction + with −n, −B and −b are synonymous. + + The −r option is used in conjunction with a prior invocation of + gain with the −h option ‐ see below for details. + + The −n option normalises the audio to 0dB FSD; it is often used + in conjunction with a negative gain‐dB to the effect that the + audio is normalised to a given level below 0dB. For example, + + sox infile outfile gain −n + + normalises to 0dB, and + + sox infile outfile gain −n −3 + + normalises to −3dB. + + The −l option invokes a simple limiter, e.g. + + sox infile outfile gain −l 6 + + will apply 6dB of gain but never clip. Note that limiting more + than a few dBs more than occasionally (in a piece of audio) is + not recommended as it can cause audible distortion. See the + compand effect for a more capable limiter. + + The −h option is used to apply gain to provide head‐room for + subsequent processing. For example, with + + sox infile outfile gain −h bass +6 + + 6dB of attenuation will be applied prior to the bass boosting + effect thus ensuring that it will not clip. Of course, with + bass, it is obvious how much headroom will be needed, but with + other effects (e.g. rate, dither) it is not always as clear. + Another advantage of using gain −h rather than an explicit + attenuation, is that if the headroom is not used by subsequent + effects, it can be reclaimed with gain −r, for example: + + sox infile outfile gain −h bass +6 rate 44100 gain −r + + The above effects chain guarantees never to clip nor amplify; it + attenuates if necessary to prevent clipping, but by only as much + as is needed to do so. + + Output formatting (dithering and bit‐depth reduction) also + requires headroom (which cannot be ‘reclaimed’), e.g. + + sox infile outfile gain −h bass +6 rate 44100 gain −rh dither + + Here, the second gain invocation, reclaims as much of the head‐ + room as it can from the preceding effects, but retains as much + headroom as is needed for subsequent processing. The SoX global + option −G can be given to automatically invoke gain −h and gain + −r. + + See also the norm and vol effects. + + highpass|lowpass [−1|−2] frequency[k] [width[q|o|h|k]] + Apply a high‐pass or low‐pass filter with 3dB point frequency. + The filter can be either single‐pole (with −1), or double‐pole + (the default, or with −2). width applies only to double‐pole + filters; the default is Q = 0.707 and gives a Butterworth + response. The filters roll off at 6dB per pole per octave (20dB + per pole per decade). The double‐pole filters are described in + detail in [1]. + + These effects support the −−plot global option. + + See also sinc for filters with a steeper roll‐off. + + hilbert [−n taps] + Apply an odd‐tap Hilbert transform filter, phase‐shifting the + signal by 90 degrees. + + This is used in many matrix coding schemes and for analytic sig‐ + nal generation. The process is often written as a multiplica‐ + tion by i (or j), the imaginary unit. + + An odd‐tap Hilbert transform filter has a bandpass characteris‐ + tic, attenuating the lowest and highest frequencies. Its band‐ + width can be controlled by the number of filter taps, which can + be specified with −n. By default, the number of taps is chosen + for a cutoff frequency of about 75 Hz. + + This effect supports the −−plot global option. + + ladspa [‐l|‐r] module [plugin] [argument ...] + Apply a LADSPA [5] (Linux Audio Developer’s Simple Plugin API) + plugin. Despite the name, LADSPA is not Linux‐specific, and a + wide range of effects is available as LADSPA plugins, such as + cmt [6] (the Computer Music Toolkit) and Steve Harris’s plugin + collection [7]. The first argument is the plugin module, the + second the name of the plugin (a module can contain more than + one plugin), and any other arguments are for the control ports + of the plugin. Missing arguments are supplied by default values + if possible. + + Normally, the number of input ports of the plugin must match the + number of input channels, and the number of output ports deter‐ + mines the output channel count. However, the −r (replicate) + option allows cloning a mono plugin to handle multi‐channel + input. + + Some plugins introduce latency which SoX may optionally compen‐ + sate for. The −l (latency compensation) option automatically + compensates for latency as reported by the plugin via an output + control port named "latency". + + If found, the environment variable LADSPA_PATH will be used as + search path for plugins. + + loudness [gain [reference]] + Loudness control ‐ similar to the gain effect, but provides + equalisation for the human auditory system. See + http://en.wikipedia.org/wiki/Loudness for a detailed description + of loudness. The gain is adjusted by the given gain parameter + (usually negative) and the signal equalised according to ISO 226 + w.r.t. a reference level of 65dB, though an alternative refer‐ + ence level may be given if the original audio has been equalised + for some other optimal level. A default gain of −10dB is used + if a gain value is not given. + + See also the gain effect. + + lowpass [−1|−2] frequency[k] [width[q|o|h|k]] + Apply a low‐pass filter. See the description of the highpass + effect for details. + + mcompand "attack1,decay1{,attack2,decay2} + [soft‐knee‐dB:]in‐dB1[,out‐dB1]{,in‐dB2,out‐dB2} + [gain [initial‐volume‐dB [delay]]]" {crossover‐freq[k] + "attack1,..."} + + The multi‐band compander is similar to the single‐band compander + but the audio is first divided into bands using Linkwitz‐Riley + cross‐over filters and a separately specifiable compander run on + each band. See the compand effect for the definition of its + parameters. Compand parameters are specified between double + quotes and the crossover frequency for that band is given by + crossover‐freq; these can be repeated to create multiple bands. + + For example, the following (one long) command shows how multi‐ + band companding is typically used in FM radio: + + play track1.wav gain −3 sinc 8000− 29 100 mcompand \ + "0.005,0.1 −47,−40,−34,−34,−17,−33" 100 \ + "0.003,0.05 −47,−40,−34,−34,−17,−33" 400 \ + "0.000625,0.0125 −47,−40,−34,−34,−15,−33" 1600 \ + "0.0001,0.025 −47,−40,−34,−34,−31,−31,−0,−30" 6400 \ + "0,0.025 −38,−31,−28,−28,−0,−25" \ + gain 15 highpass 22 highpass 22 sinc −n 255 −b 16 −17500 \ + gain 9 lowpass −1 17801 + + The audio file is played with a simulated FM radio sound (or + broadcast signal condition if the lowpass filter at the end is + skipped). Note that the pipeline is set up with US‐style 75us + pre‐emphasis. + + See also compand for a single‐band companding effect. + + noiseprof [profile‐file] + Calculate a profile of the audio for use in noise reduction. + See the description of the noisered effect for details. + + noisered [profile‐file [amount]] + Reduce noise in the audio signal by profiling and filtering. + This effect is moderately effective at removing consistent back‐ + ground noise such as hiss or hum. To use it, first run SoX with + the noiseprof effect on a section of audio that ideally would + contain silence but in fact contains noise ‐ such sections are + typically found at the beginning or the end of a recording. + noiseprof will write out a noise profile to profile‐file, or to + stdout if no profile‐file or if ‘−’ is given. E.g. + + sox speech.wav −n trim 0 1.5 noiseprof speech.noise‐profile + + To actually remove the noise, run SoX again, this time with the + noisered effect; noisered will reduce noise according to a noise + profile (which was generated by noiseprof), from profile‐file, + or from stdin if no profile‐file or if ‘−’ is given. E.g. + + sox speech.wav cleaned.wav noisered speech.noise‐profile 0.3 + + How much noise should be removed is specified by amount‐a number + between 0 and 1 with a default of 0.5. Higher numbers will + remove more noise but present a greater likelihood of removing + wanted components of the audio signal. Before replacing an + original recording with a noise‐reduced version, experiment with + different amount values to find the optimal one for your audio; + use headphones to check that you are happy with the results, + paying particular attention to quieter sections of the audio. + + On most systems, the two stages ‐ profiling and reduction ‐ can + be combined using a pipe, e.g. + + sox noisy.wav −n trim 0 1 noiseprof | play noisy.wav noisered + + + norm [dB‐level] + Normalise the audio. norm is just an alias for gain −n; see the + gain effect for details. + + oops Out Of Phase Stereo effect. Mixes stereo to twin‐mono where + each mono channel contains the difference between the left and + right stereo channels. This is sometimes known as the ‘karaoke’ + effect as it often has the effect of removing most or all of the + vocals from a recording. It is equivalent to remix 1,2i 1,2i. + + overdrive [gain(20) [colour(20)]] + Non linear distortion. The colour parameter controls the amount + of even harmonic content in the over‐driven output. + + pad { length[@position(=)] } + Pad the audio with silence, at the beginning, the end, or any + specified points through the audio. length is the amount of + silence to insert and position the position in the input audio + stream at which to insert it. Any number of lengths and posi‐ + tions may be specified, provided that a specified position is + not less that the previous one, and any time specification may + be used for them. position is optional for the first and last + lengths specified and if omitted correspond to the beginning and + the end of the audio respectively. For example, pad 1.5 1.5 + adds 1.5 seconds of silence padding at each end of the audio, + whilst pad 4000s@3:00 inserts 4000 samples of silence 3 minutes + into the audio. If silence is wanted only at the end of the + audio, specify either the end position or specify a zero‐length + pad at the start. + + See also delay for an effect that can add silence at the begin‐ + ning of the audio on a channel‐by‐channel basis. + + phaser gain‐in gain‐out delay decay speed [−s|−t] + Add a phasing effect to the audio. See [3] for a detailed + description of phasing. + + delay/decay/speed gives the delay in milliseconds and the decay + (relative to gain‐in) with a modulation speed in Hz. The modu‐ + lation is either sinusoidal (−s) ‐ preferable for multiple + instruments, or triangular (−t) ‐ gives single instruments a + sharper phasing effect. The decay should be less than 0.5 to + avoid feedback, and usually no less than 0.1. Gain‐out is the + volume of the output. + + For example: + + play snare.flac phaser 0.8 0.74 3 0.4 0.5 −t + + Gentler: + + play snare.flac phaser 0.9 0.85 4 0.23 1.3 −s + + A popular sound: + + play snare.flac phaser 0.89 0.85 1 0.24 2 −t + + More severe: + + play snare.flac phaser 0.6 0.66 3 0.6 2 −t + + + pitch [−q] shift [segment [search [overlap]]] + Change the audio pitch (but not tempo). + + shift gives the pitch shift as positive or negative ‘cents’ + (i.e. 100ths of a semitone). See the tempo effect for a + description of the other parameters. + + See also the bend, speed, and tempo effects. + + rate [−q|−l|−m|−h|−v] [override‐options] RATE[k] + Change the audio sampling rate (i.e. resample the audio) to any + given RATE (even non‐integer if this is supported by the output + file format) using a quality level defined as follows: + + Quality Band‐ Rej dB Typical Use + width + −q quick n/a ≈30 @ playback on + Fs/4 ancient hardware + −l low 80% 100 playback on old + hardware + −m medium 95% 100 audio playback + −h high 95% 125 16‐bit mastering + (use with dither) + −v very high 95% 175 24‐bit mastering + + where Band‐width is the percentage of the audio frequency band + that is preserved and Rej dB is the level of noise rejection. + Increasing levels of resampling quality come at the expense of + increasing amounts of time to process the audio. If no quality + option is given, the quality level used is ‘high’ (but see + ‘Playing & Recording Audio’ above regarding playback). + + The ‘quick’ algorithm uses cubic interpolation; all others use + band‐limited interpolation. By default, all algorithms have a + ‘linear’ phase response; for ‘medium’, ‘high’ and ‘very high’, + the phase response is configurable (see below). + + The rate effect is invoked automatically if SoX’s −r option + specifies a rate that is different to that of the input file(s). + Alternatively, if this effect is given explicitly, then SoX’s −r + option need not be given. For example, the following two com‐ + mands are equivalent: + + sox input.wav −r 48k output.wav bass −b 24 + sox input.wav output.wav bass −b 24 rate 48k + + though the second command is more flexible as it allows rate + options to be given, and allows the effects to be ordered arbi‐ + trarily. + + * * * + + Warning: technically detailed discussion follows. + + The simple quality selection described above provides settings + that satisfy the needs of the vast majority of resampling tasks. + Occasionally, however, it may be desirable to fine‐tune the + resampler’s filter response; this can be achieved using over‐ + ride options, as detailed in the following table: + + −M/−I/−L Phase response = minimum/intermediate/linear + −s Steep filter (band‐width = 99%) + −a Allow aliasing/imaging above the pass‐band + −b 74−99.7 Any band‐width % + −p 0−100 Any phase response (0 = minimum, 25 = intermediate, + 50 = linear, 100 = maximum) + + N.B. Override options cannot be used with the ‘quick’ or ‘low’ + quality algorithms. + + All resamplers use filters that can sometimes create ‘echo’ + (a.k.a. ‘ringing’) artefacts with transient signals such as + those that occur with ‘finger snaps’ or other highly percussive + sounds. Such artefacts are much more noticeable to the human + ear if they occur before the transient (‘pre‐echo’) than if they + occur after it (‘post‐echo’). Note that frequency of any such + artefacts is related to the smaller of the original and new sam‐ + pling rates but that if this is at least 44.1kHz, then the arte‐ + facts will lie outside the range of human hearing. + + A phase response setting may be used to control the distribution + of any transient echo between ‘pre’ and ‘post’: with minimum + phase, there is no pre‐echo but the longest post‐echo; with lin‐ + ear phase, pre and post echo are in equal amounts (in signal + terms, but not audibility terms); the intermediate phase setting + attempts to find the best compromise by selecting a small length + (and level) of pre‐echo and a medium lengthed post‐echo. + + Minimum, intermediate, or linear phase response is selected + using the −M, −I, or −L option; a custom phase response can be + created with the −p option. Note that phase responses between + ‘linear’ and ‘maximum’ (greater than 50) are rarely useful. + + A resampler’s band‐width setting determines how much of the fre‐ + quency content of the original signal (w.r.t. the original sam‐ + ple rate when up‐sampling, or the new sample rate when down‐sam‐ + pling) is preserved during conversion. The term ‘pass‐band’ is + used to refer to all frequencies up to the band‐width point + (e.g. for 44.1kHz sampling rate, and a resampling band‐width of + 95%, the pass‐band represents frequencies from 0Hz (D.C.) to + circa 21kHz). Increasing the resampler’s band‐width results in + a slower conversion and can increase transient echo artefacts + (and vice versa). + + The −s ‘steep filter’ option changes resampling band‐width from + the default 95% (based on the 3dB point), to 99%. The −b option + allows the band‐width to be set to any value in the range + 74−99.7 %, but note that band‐width values greater than 99% are + not recommended for normal use as they can cause excessive tran‐ + sient echo. + + If the −a option is given, then aliasing/imaging above the pass‐ + band is allowed. For example, with 44.1kHz sampling rate, and a + resampling band‐width of 95%, this means that frequency content + above 21kHz can be distorted; however, since this is above the + pass‐band (i.e. above the highest frequency of interest/audi‐ + bility), this may not be a problem. The benefits of allowing + aliasing/imaging are reduced processing time, and reduced (by + almost half) transient echo artefacts. Note that if this option + is given, then the minimum band‐width allowable with −b + increases to 85%. + + Examples: + + sox input.wav −b 16 output.wav rate −s −a 44100 dither −s + + default (high) quality resampling; overrides: steep filter, + allow aliasing; to 44.1kHz sample rate; noise‐shaped dither to + 16‐bit WAV file. + + sox input.wav −b 24 output.aiff rate −v −I −b 90 48k + + very high quality resampling; overrides: intermediate phase, + band‐width 90%; to 48k sample rate; store output to 24‐bit AIFF + file. + + * * * + + The pitch and speed effects use the rate effect at their core. + + remix [−a|−m|−p] + out‐spec = in‐spec{,in‐spec} | 0 + in‐spec = [in‐chan][−[in‐chan2]][vol‐spec] + vol‐spec = p|i|v[volume] + + Select and mix input audio channels into output audio channels. + Each output channel is specified, in turn, by a given out‐spec: + a list of contributing input channels and volume specifications. + + Note that this effect operates on the audio channels within the + SoX effects processing chain; it should not be confused with the + −m global option (where multiple files are mix‐combined before + entering the effects chain). + + An out‐spec contains comma‐separated input channel‐numbers and + hyphen‐delimited channel‐number ranges; alternatively, 0 may be + given to create a silent output channel. For example, + + sox input.wav output.wav remix 6 7 8 0 + + creates an output file with four channels, where channels 1, 2, + and 3 are copies of channels 6, 7, and 8 in the input file, and + channel 4 is silent. Whereas + + sox input.wav output.wav remix 1−3,7 3 + + creates a (somewhat bizarre) stereo output file where the left + channel is a mix‐down of input channels 1, 2, 3, and 7, and the + right channel is a copy of input channel 3. + + Where a range of channels is specified, the channel numbers to + the left and right of the hyphen are optional and default to 1 + and to the number of input channels respectively. Thus + + sox input.wav output.wav remix − + + performs a mix‐down of all input channels to mono. + + By default, where an output channel is mixed from multiple (n) + input channels, each input channel will be scaled by a factor of + ¹/n. Custom mixing volumes can be set by following a given + input channel or range of input channels with a vol‐spec (volume + specification). This is one of the letters p, i, or v, followed + by a volume number, the meaning of which depends on the given + letter and is defined as follows: + + Letter Volume number Notes + p power adjust in dB 0 = no change + i power adjust in dB As ‘p’, but invert + the audio + v voltage multiplier 1 = no change, 0.5 + ≈ 6dB attenuation, + 2 ≈ 6dB gain, −1 = + invert + + If an out‐spec includes at least one vol‐spec then, by default, + ¹/n scaling is not applied to any other channels in the same + out‐spec (though may be in other out‐specs). The −a (automatic) + option however, can be given to retain the automatic scaling in + this case. For example, + + sox input.wav output.wav remix 1,2 3,4v0.8 + + results in channel level multipliers of 0.5,0.5 1,0.8, whereas + + sox input.wav output.wav remix −a 1,2 3,4v0.8 + + results in channel level multipliers of 0.5,0.5 0.5,0.8. + + The −m (manual) option disables all automatic volume adjust‐ + ments, so + + sox input.wav output.wav remix −m 1,2 3,4v0.8 + + results in channel level multipliers of 1,1 1,0.8. + + The volume number is optional and omitting it corresponds to no + volume change; however, the only case in which this is useful is + in conjunction with i. For example, if input.wav is stereo, + then + + sox input.wav output.wav remix 1,2i + + is a mono equivalent of the oops effect. + + If the −p option is given, then any automatic ¹/n scaling is + replaced by ¹/√n (‘power’) scaling; this gives a louder mix but + one that might occasionally clip. + + * * * + + One use of the remix effect is to split an audio file into a set + of files, each containing one of the constituent channels (in + order to perform subsequent processing on individual audio chan‐ + nels). Where more than a few channels are involved, a script + such as the following (Bourne shell script) is useful: + + #!/bin/sh + chans=`soxi −c "$1"` + while [ $chans −ge 1 ]; do + chans0=`printf %02i $chans` # 2 digits hence up to 99 chans + out=`echo "$1"|sed "s/\(.*\)\.\(.*\)/\1−$chans0.\2/"` + sox "$1" "$out" remix $chans + chans=`expr $chans − 1` + done + + If a file input.wav containing six audio channels were given, + the script would produce six output files: input‐01.wav, + input‐02.wav, ..., input‐06.wav. + + See also the swap effect. + + repeat [count(1)|−] + Repeat the entire audio count times, or once if count is not + given. The special value − requests infinite repetition. + Requires temporary file space to store the audio to be repeated. + Note that repeating once yields two copies: the original audio + and the repeated audio. + + reverb [−w|−−wet‐only] [reverberance (50%) [HF‐damping (50%) + [room‐scale (100%) [stereo‐depth (100%) + [pre‐delay (0ms) [wet‐gain (0dB)]]]]]] + + Add reverberation to the audio using the ‘freeverb’ algorithm. + A reverberation effect is sometimes desirable for concert halls + that are too small or contain so many people that the hall’s + natural reverberance is diminished. Applying a small amount of + stereo reverb to a (dry) mono signal will usually make it sound + more natural. See [3] for a detailed description of reverbera‐ + tion. + + Note that this effect increases both the volume and the length + of the audio, so to prevent clipping in these domains, a typical + invocation might be: + + play dry.wav gain −3 pad 0 3 reverb + + The −w option can be given to select only the ‘wet’ signal, thus + allowing it to be processed further, independently of the ‘dry’ + signal. E.g. + + play −m voice.wav "|sox voice.wav −p reverse reverb −w reverse" + + for a reverse reverb effect. + + reverse + Reverse the audio completely. Requires temporary file space to + store the audio to be reversed. + + riaa Apply RIAA vinyl playback equalisation. The sampling rate must + be one of: 44.1, 48, 88.2, 96 kHz. + + This effect supports the −−plot global option. + + silence [−l] above‐periods [duration threshold[d|%] + [below‐periods duration threshold[d|%]] + + Removes silence from the beginning, middle, or end of the audio. + ‘Silence’ is determined by a specified threshold. + + The above‐periods value is used to indicate if audio should be + trimmed at the beginning of the audio. A value of zero indicates + no silence should be trimmed from the beginning. When specifying + a non‐zero above‐periods, it trims audio up until it finds non‐ + silence. Normally, when trimming silence from beginning of audio + the above‐periods will be 1 but it can be increased to higher + values to trim all audio up to a specific count of non‐silence + periods. For example, if you had an audio file with two songs + that each contained 2 seconds of silence before the song, you + could specify an above‐period of 2 to strip out both silence + periods and the first song. + + When above‐periods is non‐zero, you must also specify a duration + and threshold. duration indicates the amount of time that non‐ + silence must be detected before it stops trimming audio. By + increasing the duration, burst of noise can be treated as + silence and trimmed off. + + threshold is used to indicate what sample value you should treat + as silence. For digital audio, a value of 0 may be fine but for + audio recorded from analog, you may wish to increase the value + to account for background noise. + + When optionally trimming silence from the end of the audio, you + specify a below‐periods count. In this case, below‐period means + to remove all audio after silence is detected. Normally, this + will be a value 1 of but it can be increased to skip over peri‐ + ods of silence that are wanted. For example, if you have a song + with 2 seconds of silence in the middle and 2 second at the end, + you could set below‐period to a value of 2 to skip over the + silence in the middle of the audio. + + For below‐periods, duration specifies a period of silence that + must exist before audio is not copied any more. By specifying a + higher duration, silence that is wanted can be left in the + audio. For example, if you have a song with an expected 1 sec‐ + ond of silence in the middle and 2 seconds of silence at the + end, a duration of 2 seconds could be used to skip over the mid‐ + dle silence. + + Unfortunately, you must know the length of the silence at the + end of your audio file to trim off silence reliably. A work‐ + around is to use the silence effect in combination with the + reverse effect. By first reversing the audio, you can use the + above‐periods to reliably trim all audio from what looks like + the front of the file. Then reverse the file again to get back + to normal. + + To remove silence from the middle of a file, specify a below‐ + periods that is negative. This value is then treated as a posi‐ + tive value and is also used to indicate that the effect should + restart processing as specified by the above‐periods, making it + suitable for removing periods of silence in the middle of the + audio. + + The option −l indicates that below‐periods duration length of + audio should be left intact at the beginning of each period of + silence. For example, if you want to remove long pauses between + words but do not want to remove the pauses completely. + + duration is a time specification with the peculiarity that a + bare number is interpreted as a sample count, not as a number of + seconds. For specifying seconds, either use the t suffix (as in + ‘2t’) or specify minutes, too (as in ‘0:02’). + + threshold numbers may be suffixed with d to indicate the value + is in decibels, or % to indicate a percentage of maximum value + of the sample value (0% specifies pure digital silence). + + The following example shows how this effect can be used to start + a recording that does not contain the delay at the start which + usually occurs between ‘pressing the record button’ and the + start of the performance: + + rec parameters filename other‐effects silence 1 5 2% + + + sinc [−a att|−b beta] [−p phase|−M|−I|−L] [−t tbw|−n taps] [freqHP] + [−freqLP [−t tbw|−n taps]] + Apply a sinc kaiser‐windowed low‐pass, high‐pass, band‐pass, or + band‐reject filter to the signal. The freqHP and freqLP parame‐ + ters give the frequencies of the 6dB points of a high‐pass and + low‐pass filter that may be invoked individually, or together. + If both are given, then freqHP less than freqLP creates a band‐ + pass filter, freqHP greater than freqLP creates a band‐reject + filter. For example, the invocations + + sinc 3k + sinc ‐4k + sinc 3k‐4k + sinc 4k‐3k + + create a high‐pass, low‐pass, band‐pass, and band‐reject filter + respectively. + + The default stop‐band attenuation of 120dB can be overridden + with −a; alternatively, the kaiser‐window ‘beta’ parameter can + be given directly with −b. + + The default transition band‐width of 5% of the total band can be + overridden with −t (and tbw in Hertz); alternatively, the number + of filter taps can be given directly with −n. + + If both freqHP and freqLP are given, then a −t or −n option + given to the left of the frequencies applies to both frequen‐ + cies; one of these options given to the right of the frequencies + applies only to freqLP. + + The −p, −M, −I, and −L options control the filter’s phase + response; see the rate effect for details. + + This effect supports the −−plot global option. + + spectrogram [options] + Create a spectrogram of the audio; the audio is passed unmodi‐ + fied through the SoX processing chain. This effect is optional + ‐ type sox −−help and check the list of supported effects to see + if it has been included. + + The spectrogram is rendered in a Portable Network Graphic (PNG) + file, and shows time in the X‐axis, frequency in the Y‐axis, and + audio signal magnitude in the Z‐axis. Z‐axis values are repre‐ + sented by the colour (or optionally the intensity) of the pixels + in the X‐Y plane. If the audio signal contains multiple chan‐ + nels then these are shown from top to bottom starting from chan‐ + nel 1 (which is the left channel for stereo audio). + + For example, if ‘my.wav’ is a stereo file, then with + + sox my.wav −n spectrogram + + a spectrogram of the entire file will be created in the file + ‘spectrogram.png’. More often though, analysis of a smaller + portion of the audio is required; e.g. with + + sox my.wav −n remix 2 trim 20 30 spectrogram + + the spectrogram shows information only from the second (right) + channel, and of thirty seconds of audio starting from twenty + seconds in. To analyse a small portion of the frequency domain, + the rate effect may be used, e.g. + + sox my.wav −n rate 6k spectrogram + + allows detailed analysis of frequencies up to 3kHz (half the + sampling rate) i.e. where the human auditory system is most sen‐ + sitive. With + + sox my.wav −n trim 0 10 spectrogram −x 600 −y 200 −z 100 + + the given options control the size of the spectrogram’s X, Y & Z + axes (in this case, the spectrogram area of the produced image + will be 600 by 200 pixels in size and the Z‐axis range will be + 100 dB). Note that the produced image includes axes legends + etc. and so will be a little larger than the specified spectro‐ + gram size. In this example: + + sox −n −n synth 6 tri 10k:14k spectrogram −z 100 −w kaiser + + an analysis ‘window’ with high dynamic range is selected to best + display the spectrogram of a swept triangular wave. For a smi‐ + lar example, append the following to the ‘chime’ command in the + description of the delay effect (above): + + rate 2k spectrogram −X 200 −Z −10 −w kaiser + + Options are also available to control the appearance (colour‐ + set, brightness, contrast, etc.) and filename of the spectro‐ + gram; e.g. with + + sox my.wav −n spectrogram −m −l −o print.png + + a spectrogram is created suitable for printing on a ‘black and + white’ printer. + + Options: + + −x num Change the (maximum) width (X‐axis) of the spectrogram + from its default value of 800 pixels to a given number + between 100 and 200000. See also −X and −d. + + −X num X‐axis pixels/second; the default is auto‐calculated to + fit the given or known audio duration to the X‐axis size, + or 100 otherwise. If given in conjunction with −d, this + option affects the width of the spectrogram; otherwise, + it affects the duration of the spectrogram. num can be + from 1 (low time resolution) to 5000 (high time resolu‐ + tion) and need not be an integer. SoX may make a slight + adjustment to the given number for processing quantisa‐ + tion reasons; if so, SoX will report the actual number + used (viewable when the SoX global option −V is in + effect). See also −x and −d. + + −y num Sets the Y‐axis size in pixels (per channel); this is the + number of frequency ‘bins’ used in the Fourier analysis + that produces the spectrogram. N.B. it can be slow to + produce the spectrogram if this number is not one more + than a power of two (e.g. 129). By default the Y‐axis + size is chosen automatically (depending on the number of + channels). See −Y for alternative way of setting spec‐ + trogram height. + + −Y num Sets the target total height of the spectrogram(s). The + default value is 550 pixels. Using this option (and by + default), SoX will choose a height for individual spec‐ + trogram channels that is one more than a power of two, so + the actual total height may fall short of the given num‐ + ber. However, there is also a minimum height per channel + so if there are many channels, the number may be + exceeded. See −y for alternative way of setting spectro‐ + gram height. + + −z num Z‐axis (colour) range in dB, default 120. This sets the + dynamic‐range of the spectrogram to be −num dBFS to + 0 dBFS. Num may range from 20 to 180. Decreasing + dynamic‐range effectively increases the ‘contrast’ of the + spectrogram display, and vice versa. + + −Z num Sets the upper limit of the Z‐axis in dBFS. A negative + num effectively increases the ‘brightness’ of the spec‐ + trogram display, and vice versa. + + −q num Sets the Z‐axis quantisation, i.e. the number of differ‐ + ent colours (or intensities) in which to render Z‐axis + values. A small number (e.g. 4) will give a + ‘poster’‐like effect making it easier to discern magni‐ + tude bands of similar level. Small numbers also usually + result in small PNG files. The number given specifies + the number of colours to use inside the Z‐axis range; two + colours are reserved to represent out‐of‐range values. + + −w name + Window: Hann (default), Hamming, Bartlett, Rectangular, + Kaiser or Dolph. The spectrogram is produced using the + Discrete Fourier Transform (DFT) algorithm. A signifi‐ + cant parameter to this algorithm is the choice of ‘window + function’. By default, SoX uses the Hann window which + has good all‐round frequency‐resolution and dynamic‐range + properties. For better frequency resolution (but lower + dynamic‐range), select a Hamming window; for higher + dynamic‐range (but poorer frequency‐resolution), select a + Dolph window. Kaiser, Bartlett and Rectangular windows + are also available. + + −W num Window adjustment parameter. This can be used to make + small adjustments to the Kaiser or Dolph window shape. A + positive number (up to ten) increases its dynamic range, + a negative number decreases it. + + −s Allow slack overlapping of DFT windows. This can, in + some cases, increase image sharpness and give greater + adherence to the −x value, but at the expense of a little + spectral loss. + + −m Creates a monochrome spectrogram (the default is colour). + + −h Selects a high‐colour palette ‐ less visually pleasing + than the default colour palette, but it may make it eas‐ + ier to differentiate different levels. If this option is + used in conjunction with −m, the result will be a hybrid + monochrome/colour palette. + + −p num Permute the colours in a colour or hybrid palette. The + num parameter, from 1 (the default) to 6, selects the + permutation. + + −l Creates a ‘printer friendly’ spectrogram with a light + background (the default has a dark background). + + −a Suppress the display of the axis lines. This is some‐ + times useful in helping to discern artefacts at the spec‐ + trogram edges. + + −r Raw spectrogram: suppress the display of axes and leg‐ + ends. + + −A Selects an alternative, fixed colour‐set. This is pro‐ + vided only for compatibility with spectrograms produced + by another package. It should not normally be used as it + has some problems, not least, a lack of differentiation + at the bottom end which results in masking of low‐level + artefacts. + + −t text + Set the image title ‐ text to display above the spectro‐ + gram. + + −c text + Set (or clear) the image comment ‐ text to display below + and to the left of the spectrogram. + + −o file + Name of the spectrogram output PNG file, default ‘spec‐ + trogram.png’. If ‘‐’ is given, the spectrogram will be + sent to standard output (stdout). + + Advanced Options: + In order to process a smaller section of audio without affecting + other effects or the output signal (unlike when the trim effect + is used), the following options may be used. + + −d duration + This option sets the X‐axis resolution such that audio + with the given duration (a time specification) fits the + selected (or default) X‐axis width. For example, + + sox input.mp3 output.wav −n spectrogram −d 1:00 stats + + creates a spectrogram showing the first minute of the + audio, whilst + + the stats effect is applied to the entire audio signal. + + See also −X for an alternative way of setting the X‐axis + resolution. + + −S position(=) + Start the spectrogram at the given point in the audio + stream. For example + + sox input.aiff output.wav spectrogram −S 1:00 + + creates a spectrogram showing all but the first minute of + the audio (the output file, however, receives the entire + audio stream). + + For the ability to perform off‐line processing of spectral data, + see the stat effect. + + speed factor[c] + Adjust the audio speed (pitch and tempo together). factor is + either the ratio of the new speed to the old speed: greater than + 1 speeds up, less than 1 slows down, or, if appended with the + letter ‘c’, the number of cents (i.e. 100ths of a semitone) by + which the pitch (and tempo) should be adjusted: greater than 0 + increases, less than 0 decreases. + + Technically, the speed effect only changes the sample rate + information, leaving the samples themselves untouched. The rate + effect is invoked automatically to resample to the output sample + rate, using its default quality/speed. For higher quality or + higher speed resampling, in addition to the speed effect, spec‐ + ify the rate effect with the desired quality option. + + See also the bend, pitch, and tempo effects. + + splice [−h|−t|−q] { position(=)[,excess[,leeway]] } + Splice together audio sections. This effect provides two things + over simple audio concatenation: a (usually short) cross‐fade is + applied at the join, and a wave similarity comparison is made to + help determine the best place at which to make the join. + + One of the options −h, −t, or −q may be given to select the fade + envelope as half‐cosine wave (the default), triangular (a.k.a. + linear), or quarter‐cosine wave respectively. + + Type Audio Fade level Transitions + t correlated constant gain abrupt + h correlated constant gain smooth + q uncorrelated constant power smooth + + To perform a splice, first use the trim effect to select the + audio sections to be joined together. As when performing a tape + splice, the end of the section to be spliced onto should be + trimmed with a small excess (default 0.005 seconds) of audio + after the ideal joining point. The beginning of the audio sec‐ + tion to splice on should be trimmed with the same excess (before + the ideal joining point), plus an additional leeway (default + 0.005 seconds). Any time specification may be used for these + parameters. SoX should then be invoked with the two audio sec‐ + tions as input files and the splice effect given with the posi‐ + tion at which to perform the splice ‐ this is length of the + first audio section (including the excess). + + The following diagram uses the tape analogy to illustrate the + splice operation. The effect simulates the diagonal cuts and + joins the two pieces: + + + length1 excess + ‐‐‐‐‐‐‐‐‐‐‐><‐‐‐> + _________ : : _________________ + \ : : :\ ‘ + \ : : : \ ‘ + \: : : \ ‘ + * : : * ‐ ‐ * + \ : : :\ ‘ + \ : : : \ ‘ + _______________\: : : \_____‘____ + : : : : + <‐‐‐> <‐‐‐‐‐> + excess leeway + + + where * indicates the joining points. + + For example, a long song begins with two verses which start (as + determined e.g. by using the play command with the trim (start) + effect) at times 0:30.125 and 1:03.432. The following commands + cut out the first verse: + + sox too‐long.wav part1.wav trim 0 30.130 + + (5 ms excess, after the first verse starts) + + sox too‐long.wav part2.wav trim 1:03.422 + + (5 ms excess plus 5 ms leeway, before the second verse starts) + + sox part1.wav part2.wav just‐right.wav splice 30.130 + + For another example, the SoX command + + play "|sox −n −p synth 1 sin %1" "|sox −n −p synth 1 sin %3" + + generates and plays two notes, but there is a nasty click at the + transition; the click can be removed by splicing instead of con‐ + catenating the audio, i.e. by appending splice 1 to the command. + (Clicks at the beginning and end of the audio can be removed by + preceding the splice effect with fade q .01 2 .01). + + Provided your arithmetic is good enough, multiple splices can be + performed with a single splice invocation. For example: + + #!/bin/sh + # Audio Copy and Paste Over + # acpo infile copy‐start copy‐stop paste‐over‐start outfile + # No chained time specifications allowed for the parameters + # (i.e. such that contain +/−). + e=0.005 # Using default excess + l=$e # and leeway. + sox "$1" piece.wav trim $2−$e−$l =$3+$e + sox "$1" part1.wav trim 0 $4+$e + sox "$1" part2.wav trim $4+$3−$2−$e−$l + sox part1.wav piece.wav part2.wav "$5" \ + splice $4+$e +$3−$2+$e+$l+$e + + In the above Bourne shell script, two splices are used to ‘copy + and paste’ audio. + + * * * + + It is also possible to use this effect to perform general cross‐ + fades, e.g. to join two songs. In this case, excess would typi‐ + cally be an number of seconds, the −q option would typically be + given (to select an ‘equal power’ cross‐fade), and leeway should + be zero (which is the default if −q is given). For example, if + f1.wav and f2.wav are audio files to be cross‐faded, then + + sox f1.wav f2.wav out.wav splice −q $(soxi −D f1.wav),3 + + cross‐fades the files where the point of equal loudness is 3 + seconds before the end of f1.wav, i.e. the total length of the + cross‐fade is 2 × 3 = 6 seconds (Note: the $(...) notation is + POSIX shell). + + stat [−s scale] [−rms] [−freq] [−v] [−d] + Display time and frequency domain statistical information about + the audio. Audio is passed unmodified through the SoX process‐ + ing chain. + + The information is output to the ‘standard error’ (stderr) + stream and is calculated, where n is the duration of the audio + in samples, c is the number of audio channels, r is the audio + sample rate, and xk represents the PCM value (in the range −1 to + +1 by default) of each successive sample in the audio, as fol‐ + lows: + + Samples read n×c + Length (seconds) n÷r + Scaled by See −s below. + Maximum amplitude max(xk) The maximum sample + value in the audio; + usually this will + be a positive num‐ + ber. + + Minimum amplitude min(xk) The minimum sample + value in the audio; + usually this will + be a negative num‐ + ber. + Midline amplitude ½min(xk)+½max(xk) + Mean norm ¹/nΣ│xk│ The average of the + absolute value of + each sample in the + audio. + Mean amplitude ¹/nΣxk The average of each + sample in the + audio. If this + figure is non‐zero, + then it indicates + the presence of a + D.C. offset (which + could be removed + using the dcshift + effect). + RMS amplitude √(¹/nΣxk²) The level of a D.C. + signal that would + have the same power + as the audio’s + average power. + Maximum delta max(│xk−xk−1│) + Minimum delta min(│xk−xk−1│) + Mean delta ¹/n−1Σ│xk−xk−1│ + RMS delta √(¹/n−1Σ(xk−xk−1)²) + Rough frequency In Hz. + Volume Adjustment The parameter to + the vol effect + which would make + the audio as loud + as possible without + clipping. Note: + See the discussion + on Clipping above + for reasons why it + is rarely a good + idea actually to do + this. + + Note that the delta measurements are not applicable for multi‐ + channel audio. + + The −s option can be used to scale the input data by a given + factor. The default value of scale is 2147483647 (i.e. the max‐ + imum value of a 32‐bit signed integer). Internal effects always + work with signed long PCM data and so the value should relate to + this fact. + + The −rms option will convert all output average values to ‘root + mean square’ format. + + The −v option displays only the ‘Volume Adjustment’ value. + + The −freq option calculates the input’s power spectrum (4096 + point DFT) instead of the statistics listed above. This should + only be used with a single channel audio file. + + The −d option displays a hex dump of the 32‐bit signed PCM data + audio in SoX’s internal buffer. This is mainly used to help + track down endian problems that sometimes occur in cross‐plat‐ + form versions of SoX. + + See also the stats effect. + + stats [−b bits|−x bits|−s scale] [−w window‐time] + Display time domain statistical information about the audio + channels; audio is passed unmodified through the SoX processing + chain. Statistics are calculated and displayed for each audio + channel and, where applicable, an overall figure is also given. + + For example, for a typical well‐mastered stereo music file: + + Overall Left Right + DC offset 0.000803 −0.000391 0.000803 + Min level −0.750977 −0.750977 −0.653412 + Max level 0.708801 0.708801 0.653534 + Pk lev dB −2.49 −2.49 −3.69 + RMS lev dB −19.41 −19.13 −19.71 + RMS Pk dB −13.82 −13.82 −14.38 + RMS Tr dB −85.25 −85.25 −82.66 + Crest factor − 6.79 6.32 + Flat factor 0.00 0.00 0.00 + Pk count 2 2 2 + Bit‐depth 16/16 16/16 16/16 + Num samples 7.72M + Length s 174.973 + Scale max 1.000000 + Window s 0.050 + + DC offset, Min level, and Max level are shown, by default, in + the range ±1. If the −b (bits) options is given, then these + three measurements will be scaled to a signed integer with the + given number of bits; for example, for 16 bits, the scale would + be −32768 to +32767. The −x option behaves the same way as −b + except that the signed integer values are displayed in hexadeci‐ + mal. The −s option scales the three measurements by a given + floating‐point number. + + Pk lev dB and RMS lev dB are standard peak and RMS level mea‐ + sured in dBFS. RMS Pk dB and RMS Tr dB are peak and trough val‐ + ues for RMS level measured over a short window (default 50ms). + + Crest factor is the standard ratio of peak to RMS level (note: + not in dB). + + Flat factor is a measure of the flatness (i.e. consecutive sam‐ + ples with the same value) of the signal at its peak levels (i.e. + either Min level, or Max level). Pk count is the number of + occasions (not the number of samples) that the signal attained + either Min level, or Max level. + + The right‐hand Bit‐depth figure is the standard definition of + bit‐depth i.e. bits less significant than the given number are + fixed at zero. The left‐hand figure is the number of most sig‐ + nificant bits that are fixed at zero (or one for negative num‐ + bers) subtracted from the right‐hand figure (the number sub‐ + tracted is directly related to Pk lev dB). + + For multi‐channel audio, an overall figure for each of the above + measurements is given and derived from the channel figures as + follows: DC offset: maximum magnitude; Max level, Pk lev dB, + RMS Pk dB, Bit‐depth: maximum; Min level, RMS Tr dB: minimum; + RMS lev dB, Flat factor, Pk count: average; Crest factor: not + applicable. + + Length s is the duration in seconds of the audio, and Num sam‐ + ples is equal to the sample‐rate multiplied by Length. + Scale Max is the scaling applied to the first three measure‐ + ments; specifically, it is the maximum value that could apply to + Max level. Window s is the length of the window used for the + peak and trough RMS measurements. + + See also the stat effect. + + swap Swap stereo channels. If the input is not stereo, pairs of + channels are swapped, and a possible odd last channel passed + through. E.g., for seven channels, the output order will be 2, + 1, 4, 3, 6, 5, 7. + + See also remix for an effect that allows arbitrary channel + selection and ordering (and mixing). + + stretch factor [window fade shift fading] + Change the audio duration (but not its pitch). This effect is + broadly equivalent to the tempo effect with (factor inverted + and) search set to zero, so in general, its results are compara‐ + tively poor; it is retained as it can sometimes out‐perform + tempo for small factors. + + factor of stretching: >1 lengthen, <1 shorten duration. window + size is in ms. Default is 20ms. The fade option, can be ‘lin’. + shift ratio, in [0 1]. Default depends on stretch factor. 1 to + shorten, 0.8 to lengthen. The fading ratio, in [0 0.5]. The + amount of a fade’s default depends on factor and shift. + + See also the tempo effect. + + synth [−j KEY] [−n] [len [off [ph [p1 [p2 [p3]]]]]] {[type] [combine] + [[%]freq[k][:|+|/|−[%]freq2[k]]] [off [ph [p1 [p2 [p3]]]]]} + This effect can be used to generate fixed or swept frequency + audio tones with various wave shapes, or to generate wide‐band + noise of various ‘colours’. Multiple synth effects can be cas‐ + caded to produce more complex waveforms; at each stage it is + possible to choose whether the generated waveform will be mixed + with, or modulated onto the output from the previous stage. + Audio for each channel in a multi‐channel audio file can be syn‐ + thesised independently. + + Though this effect is used to generate audio, an input file must + still be given, the characteristics of which will be used to set + the synthesised audio length, the number of channels, and the + sampling rate; however, since the input file’s audio is not nor‐ + mally needed, a ‘null file’ (with the special name −n) is often + given instead (and the length specified as a parameter to synth + or by another given effect that has an associated length). + + For example, the following produces a 3 second, 48kHz, audio + file containing a sine‐wave swept from 300 to 3300 Hz: + + sox −n output.wav synth 3 sine 300−3300 + + and this produces an 8 kHz version: + + sox −r 8000 −n output.wav synth 3 sine 300−3300 + + Multiple channels can be synthesised by specifying the set of + parameters shown between braces multiple times; the following + puts the swept tone in the left channel and adds ‘brown’ noise + in the right: + + sox −n output.wav synth 3 sine 300−3300 brownnoise + + The following example shows how two synth effects can be cas‐ + caded to create a more complex waveform: + + play −n synth 0.5 sine 200−500 synth 0.5 sine fmod 700−100 + + Frequencies can also be given in ‘scientific’ note notation, or, + by prefixing a ‘%’ character, as a number of semitones relative + to ‘middle A’ (440 Hz). For example, the following could be + used to help tune a guitar’s low ‘E’ string: + + play −n synth 4 pluck %−29 + + or with a (Bourne shell) loop, the whole guitar: + + for n in E2 A2 D3 G3 B3 E4; do + play −n synth 4 pluck $n repeat 2; done + + See the delay effect (above) and the reference to ‘SoX scripting + examples’ (below) for more synth examples. + + N.B. This effect generates audio at maximum volume (0dBFS), + which means that there is a high chance of clipping when using + the audio subsequently, so in many cases, you will want to fol‐ + low this effect with the gain effect to prevent this from hap‐ + pening. (See also Clipping above.) Note that, by default, the + synth effect incorporates the functionality of gain −h (see the + gain effect for details); synth’s −n option may be given to dis‐ + able this behaviour. + + A detailed description of each synth parameter follows: + + len is the length of audio to synthesise (any time specifica‐ + tion); a value of 0 indicated to use the input length, which is + also the default. + + type is one of sine, square, triangle, sawtooth, trapezium, exp, + [white]noise, tpdfnoise, pinknoise, brownnoise, pluck; + default=sine. + + combine is one of create, mix, amod (amplitude modulation), fmod + (frequency modulation); default=create. + + freq/freq2 are the frequencies at the beginning/end of synthesis + in Hz or, if preceded with ‘%’, semitones relative to A + (440 Hz); alternatively, ‘scientific’ note notation (e.g. E2) + may be used. The default frequency is 440Hz. By default, the + tuning used with the note notations is ‘equal temperament’; the + −j KEY option selects ‘just intonation’, where KEY is an integer + number of semitones relative to A (so for example, −9 or 3 + selects the key of C), or a note in scientific notation. + + If freq2 is given, then len must also have been given and the + generated tone will be swept between the given frequencies. The + two given frequencies must be separated by one of the characters + ‘:’, ‘+’, ‘/’, or ‘−’. This character is used to specify the + sweep function as follows: + + : Linear: the tone will change by a fixed number of hertz + per second. + + + Square: a second‐order function is used to change the + tone. + + / Exponential: the tone will change by a fixed number of + semitones per second. + + − Exponential: as ‘/’, but initial phase always zero, and + stepped (less smooth) frequency changes. + + Not used for noise. + + off is the bias (DC‐offset) of the signal in percent; default=0. + + ph is the phase shift in percentage of 1 cycle; default=0. Not + used for noise. + + p1 is the percentage of each cycle that is ‘on’ (square), or + ‘rising’ (triangle, exp, trapezium); default=50 (square, trian‐ + gle, exp), default=10 (trapezium), or sustain (pluck); + default=40. + + p2 (trapezium): the percentage through each cycle at which + ‘falling’ begins; default=50. exp: the amplitude in multiples of + 2dB; default=50, or tone‐1 (pluck); default=20. + + p3 (trapezium): the percentage through each cycle at which + ‘falling’ ends; default=60, or tone‐2 (pluck); default=90. + + tempo [−q] [−m|−s|−l] factor [segment [search [overlap]]] + Change the audio playback speed but not its pitch. This effect + uses the WSOLA algorithm. The audio is chopped up into segments + which are then shifted in the time domain and overlapped (cross‐ + faded) at points where their waveforms are most similar as + determined by measurement of ‘least squares’. + + By default, linear searches are used to find the best overlap‐ + ping points. If the optional −q parameter is given, tree + searches are used instead. This makes the effect work more + quickly, but the result may not sound as good. However, if you + must improve the processing speed, this generally reduces the + sound quality less than reducing the search or overlap values. + + The −m option is used to optimize default values of segment, + search and overlap for music processing. + + The −s option is used to optimize default values of segment, + search and overlap for speech processing. + + The −l option is used to optimize default values of segment, + search and overlap for ‘linear’ processing that tends to cause + more noticeable distortion but may be useful when factor is + close to 1. + + If −m, −s, or −l is specified, the default value of segment will + be calculated based on factor, while default search and overlap + values are based on segment. Any values you provide still over‐ + ride these default values. + + factor gives the ratio of new tempo to the old tempo, so e.g. + 1.1 speeds up the tempo by 10%, and 0.9 slows it down by 10%. + + The optional segment parameter selects the algorithm’s segment + size in milliseconds. If no other flags are specified, the + default value is 82 and is typically suited to making small + changes to the tempo of music. For larger changes (e.g. a factor + of 2), 41 ms may give a better result. The −m, −s, and −l flags + will cause the segment default to be automatically adjusted + based on factor. For example using −s (for speech) with a tempo + of 1.25 will calculate a default segment value of 32. + + The optional search parameter gives the audio length in mil‐ + liseconds over which the algorithm will search for overlapping + points. If no other flags are specified, the default value is + 14.68. Larger values use more processing time and may or may + not produce better results. A practical maximum is half the + value of segment. Search can be reduced to cut processing time + at the risk of degrading output quality. The −m, −s, and −l + flags will cause the search default to be automatically adjusted + based on segment. + + The optional overlap parameter gives the segment overlap length + in milliseconds. Default value is 12, but −m, −s, or −l flags + automatically adjust overlap based on segment size. Increasing + overlap increases processing time and may increase quality. A + practical maximum for overlap is the value of search, with over‐ + lap typically being (at least) a little smaller then search. + + See also speed for an effect that changes tempo and pitch + together, pitch and bend for effects that change pitch only, and + stretch for an effect that changes tempo using a different algo‐ + rithm. + + treble gain [frequency[k] [width[s|h|k|o|q]]] + Apply a treble tone‐control effect. See the description of the + bass effect for details. + + tremolo speed [depth] + Apply a tremolo (low frequency amplitude modulation) effect to + the audio. The tremolo frequency in Hz is given by speed, and + the depth as a percentage by depth (default 40). + + trim {position(+)} + Cuts portions out of the audio. Any number of positions may be + given; audio is not sent to the output until the first position + is reached. The effect then alternates between copying and dis‐ + carding audio at each position. Using a value of 0 for the + first position parameter allows copying from the beginning of + the audio. + + For example, + + sox infile outfile trim 0 10 + + will copy the first ten seconds, while + + play infile trim 12:34 =15:00 ‐2:00 + + and + + play infile trim 12:34 2:26 ‐2:00 + + will both play from 12 minutes 34 seconds into the audio up to + 15 minutes into the audio (i.e. 2 minutes and 26 seconds long), + then resume playing two minutes before the end of audio. + + upsample [factor] + Upsample the signal by an integer factor: factor−1 zero‐value + samples are inserted between each pair of input samples. As a + result, the original spectrum is replicated into the new fre‐ + quency space (imaging) and attenuated. This attenuation can be + compensated for by adding vol factor after any further process‐ + ing. The upsample effect is typically used in combination with + filtering effects. + + For a general resampling effect with anti‐imaging, see rate. + See also downsample. + + vad [options] + Voice Activity Detector. Attempts to trim silence and quiet + background sounds from the ends of (fairly high resolution i.e. + 16‐bit, 44−48kHz) recordings of speech. The algorithm currently + uses a simple cepstral power measurement to detect voice, so may + be fooled by other things, especially music. The effect can + trim only from the front of the audio, so in order to trim from + the back, the reverse effect must also be used. E.g. + + play speech.wav norm vad + + to trim from the front, + + play speech.wav norm reverse vad reverse + + to trim from the back, and + + play speech.wav norm vad reverse vad reverse + + to trim from both ends. The use of the norm effect is recom‐ + mended, but remember that neither reverse nor norm is suitable + for use with streamed audio. + + Options: + Default values are shown in parenthesis. + + −t num (7) + The measurement level used to trigger activity detection. + This might need to be changed depending on the noise + level, signal level and other charactistics of the input + audio. + + −T num (0.25) + The time constant (in seconds) used to help ignore short + bursts of sound. + + −s num (1) + The amount of audio (in seconds) to search for qui‐ + eter/shorter bursts of audio to include prior to the + detected trigger point. + + −g num (0.25) + Allowed gap (in seconds) between quieter/shorter bursts + of audio to include prior to the detected trigger point. + + −p num (0) + The amount of audio (in seconds) to preserve before the + trigger point and any found quieter/shorter bursts. + + Advanced Options: + These allow fine tuning of the algorithm’s internal parameters. + + −b num The algorithm (internally) uses adaptive noise estima‐ + tion/reduction in order to detect the start of the wanted + audio. This option sets the time for the initial noise + estimate. + + −N num Time constant used by the adaptive noise estimator for + when the noise level is increasing. + + −n num Time constant used by the adaptive noise estimator for + when the noise level is decreasing. + + −r num Amount of noise reduction to use in the detection algo‐ + rithm (e.g. 0, 0.5, ...). + + −f num Frequency of the algorithm’s processing/measurements. + + −m num Measurement duration; by default, twice the measurement + period; i.e. with overlap. + + −M num Time constant used to smooth spectral measurements. + + −h num ‘Brick‐wall’ frequency of high‐pass filter applied at the + input to the detector algorithm. + + −l num ‘Brick‐wall’ frequency of low‐pass filter applied at the + input to the detector algorithm. + + −H num ‘Brick‐wall’ frequency of high‐pass lifter used in the + detector algorithm. + + −L num ‘Brick‐wall’ frequency of low‐pass lifter used in the + detector algorithm. + + See also the silence effect. + + vol gain [type [limitergain]] + Apply an amplification or an attenuation to the audio signal. + Unlike the −v option (which is used for balancing multiple input + files as they enter the SoX effects processing chain), vol is an + effect like any other so can be applied anywhere, and several + times if necessary, during the processing chain. + + The amount to change the volume is given by gain which is inter‐ + preted, according to the given type, as follows: if type is + amplitude (or is omitted), then gain is an amplitude (i.e. volt‐ + age or linear) ratio, if power, then a power (i.e. wattage or + voltage‐squared) ratio, and if dB, then a power change in dB. + + When type is amplitude or power, a gain of 1 leaves the volume + unchanged, less than 1 decreases it, and greater than 1 + increases it; a negative gain inverts the audio signal in addi‐ + tion to adjusting its volume. + + When type is dB, a gain of 0 leaves the volume unchanged, less + than 0 decreases it, and greater than 0 increases it. + + See [4] for a detailed discussion on electrical (and hence audio + signal) voltage and power ratios. + + Beware of Clipping when the increasing the volume. + + The gain and the type parameters can be concatenated if desired, + e.g. vol 10dB. + + An optional limitergain value can be specified and should be a + value much less than 1 (e.g. 0.05 or 0.02) and is used only on + peaks to prevent clipping. Not specifying this parameter will + cause no limiter to be used. In verbose mode, this effect will + display the percentage of the audio that needed to be limited. + + See also gain for a volume‐changing effect with different capa‐ + bilities, and compand for a dynamic‐range compression/expan‐ + sion/limiting effect. + +DIAGNOSTICS + Exit status is 0 for no error, 1 if there is a problem with the com‐ + mand‐line parameters, or 2 if an error occurs during file processing. + +BUGS + Please report any bugs found in this version of SoX to the mailing list + (sox‐users@lists.sourceforge.net). + +SEE ALSO + soxi(1), soxformat(7), libsox(3) + audacity(1), gnuplot(1), octave(1), wget(1) + The SoX web site at http://sox.sourceforge.net + SoX scripting examples at http://sox.sourceforge.net/Docs/Scripts + + References + [1] R. Bristow‐Johnson, Cookbook formulae for audio EQ biquad filter + coefficients, http://musicdsp.org/files/Audio‐EQ‐Cookbook.txt + + [2] Wikipedia, Q‐factor, http://en.wikipedia.org/wiki/Q_factor + + [3] Scott Lehman, Effects Explained, http://harmony‐cen‐ + tral.com/Effects/effects‐explained.html + + [4] Wikipedia, Decibel, http://en.wikipedia.org/wiki/Decibel + + [5] Richard Furse, Linux Audio Developer’s Simple Plugin API, + http://www.ladspa.org + + [6] Richard Furse, Computer Music Toolkit, http://www.ladspa.org/cmt + + [7] Steve Harris, LADSPA plugins, http://plugin.org.uk + +LICENSE + Copyright 1998−2013 Chris Bagwell and SoX Contributors. + Copyright 1991 Lance Norskog and Sundry Contributors. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MER‐ + CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + +AUTHORS + Chris Bagwell (cbagwell@users.sourceforge.net). Other authors and con‐ + tributors are listed in the ChangeLog file that is distributed with the + source code. + + + +sox December 31, 2014 SoX(1) diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.txt.meta new file mode 100644 index 0000000..a9830b3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/sox.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7c1ac621f1576c4b8bc936744fd4b22 +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxformat.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxformat.txt new file mode 100644 index 0000000..045de25 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxformat.txt @@ -0,0 +1,656 @@ +SoX(7) Sound eXchange SoX(7) + + + +NAME + SoX − Sound eXchange, the Swiss Army knife of audio manipulation + +DESCRIPTION + This manual describes SoX supported file formats and audio device + types; the SoX manual set starts with sox(1). + + Format types that can SoX can determine by a filename extension are + listed with their names preceded by a dot. Format types that are + optionally built into SoX are marked ‘(optional)’. + + Format types that can be handled by an external library via an optional + pseudo file type (currently sndfile) are marked e.g. ‘(also with −t + sndfile)’. This might be useful if you have a file that doesn’t work + with SoX’s default format readers and writers, and there’s an external + reader or writer for that format. + + To see if SoX has support for an optional format or device, enter sox + −h and look for its name under the list: ‘AUDIO FILE FORMATS’ or ‘AUDIO + DEVICE DRIVERS’. + + SOX FORMATS & DEVICE DRIVERS + .raw (also with −t sndfile), .f32, .f64, .s8, .s16, .s24, .s32, + .u8, .u16, .u24, .u32, .ul, .al, .lu, .la + Raw (headerless) audio files. For raw, the sample rate and the + data encoding must be given using command‐line format options; + for the other listed types, the sample rate defaults to 8kHz + (but may be overridden), and the data encoding is defined by the + given suffix. Thus f32 and f64 indicate files encoded as 32 and + 64‐bit (IEEE single and double precision) floating point PCM + respectively; s8, s16, s24, and s32 indicate 8, 16, 24, and + 32‐bit signed integer PCM respectively; u8, u16, u24, and u32 + indicate 8, 16, 24, and 32‐bit unsigned integer PCM respec‐ + tively; ul indicates ‘μ‐law’ (8‐bit), al indicates ‘A‐law’ + (8‐bit), and lu and la are inverse bit order ‘μ‐law’ and inverse + bit order ‘A‐law’ respectively. For all raw formats, the number + of channels defaults to 1 (but may be overridden). + + Headerless audio files on a SPARC computer are likely to be of + format ul; on a Mac, they’re likely to be u8 but with a sample + rate of 11025 or 22050 Hz. + + See .ima and .vox for raw ADPCM formats, and .cdda for raw CD + digital audio. + + .f4, .f8, .s1, .s2, .s3, .s4, + .u1, .u2, .u3, .u4, .sb, .sw, .sl, .ub, .uw + Deprecated aliases for f32, f64, s8, s16, s24, s32, + u8, u16, u24, u32, s8, s16, s32, u8, and u16 respectively. + + .8svx (also with −t sndfile) + Amiga 8SVX musical instrument description format. + + .aiff, .aif (also with −t sndfile) + AIFF files as used on old Apple Macs, Apple IIc/IIgs and SGI. + SoX’s AIFF support does not include multiple audio chunks, or + the 8SVX musical instrument description format. AIFF files are + multimedia archives and can have multiple audio and picture + chunks ‐ you may need a separate archiver to work with them. + With Mac OS X, AIFF has been superseded by CAF. + + .aiffc, .aifc (also with −t sndfile) + AIFF‐C is a format based on AIFF that was created to allow han‐ + dling compressed audio. It can also handle little endian uncom‐ + pressed linear data that is often referred to as sowt encoding. + This encoding has also become the defacto format produced by + modern Macs as well as iTunes on any platform. AIFF‐C files + produced by other applications typically have the file extension + .aif and require looking at its header to detect the true for‐ + mat. The sowt encoding is the only encoding that SoX can handle + with this format. + + AIFF‐C is defined in DAVIC 1.4 Part 9 Annex B. This format is + referred from ARIB STD‐B24, which is specified for Japanese data + broadcasting. Any private chunks are not supported. + + alsa (optional) + Advanced Linux Sound Architecture device driver; supports both + playing and recording audio. ALSA is only used in Linux‐based + operating systems, though these often support OSS (see below) as + well. Examples: + + sox infile −t alsa + sox infile −t alsa default + sox infile −t alsa plughw:0,0 + sox −b 16 −t alsa hw:1 outfile + + See also play(1), rec(1), and sox(1) −d. + + .amb Ambisonic B‐Format: a specialisation of .wav with between 3 and + 16 channels of audio for use with an Ambisonic decoder. See + http://www.ambisonia.com/Members/mleese/file‐format‐for‐b‐format + for details. It is up to the user to get the channels together + in the right order and at the correct amplitude. + + .amr−nb (optional) + Adaptive Multi Rate ‐ Narrow Band speech codec; a lossy format + used in 3rd generation mobile telephony and defined in 3GPP TS + 26.071 et al. + + AMR‐NB audio has a fixed sampling rate of 8 kHz and supports + encoding to the following bit‐rates (as selected by the −C + option): 0 = 4.75 kbit/s, 1 = 5.15 kbit/s, 2 = 5.9 kbit/s, 3 = + 6.7 kbit/s, 4 = 7.4 kbit/s 5 = 7.95 kbit/s, 6 = 10.2 kbit/s, 7 = + 12.2 kbit/s. + + .amr−wb (optional) + Adaptive Multi Rate ‐ Wide Band speech codec; a lossy format + used in 3rd generation mobile telephony and defined in 3GPP TS + 26.171 et al. + + AMR‐WB audio has a fixed sampling rate of 16 kHz and supports + encoding to the following bit‐rates (as selected by the −C + option): 0 = 6.6 kbit/s, 1 = 8.85 kbit/s, 2 = 12.65 kbit/s, 3 = + 14.25 kbit/s, 4 = 15.85 kbit/s 5 = 18.25 kbit/s, 6 = 19.85 + kbit/s, 7 = 23.05 kbit/s, 8 = 23.85 kbit/s. + + ao (optional) + Xiph.org’s Audio Output device driver; works only for playing + audio. It supports a wide range of devices and sound systems ‐ + see its documentation for the full range. For the most part, + SoX’s use of libao cannot be configured directly; instead, libao + configuration files must be used. + + The filename specified is used to determine which libao plugin + to use. Normally, you should specify ‘default’ as the filename. + If that doesn’t give the desired behavior then you can specify + the short name for a given plugin (such as pulse for pulse audio + plugin). Examples: + + sox infile −t ao + sox infile −t ao default + sox infile −t ao pulse + + See also play(1) and sox(1) −d. + + .au, .snd (also with −t sndfile) + Sun Microsystems AU files. There are many types of AU file; DEC + has invented its own with a different magic number and byte + order. To write a DEC file, use the −L option with the output + file options. + + Some .au files are known to have invalid AU headers; these are + probably original Sun μ‐law 8000 Hz files and can be dealt with + using the .ul format (see below). + + It is possible to override AU file header information with the + −r and −c options, in which case SoX will issue a warning to + that effect. + + .avr Audio Visual Research format; used by a number of commercial + packages on the Mac. + + .caf (optional) + Apple’s Core Audio File format. + + .cdda, .cdr + ‘Red Book’ Compact Disc Digital Audio (raw audio). CDDA has two + audio channels formatted as 16‐bit signed integers (big + endian)at a sample rate of 44.1 kHz. The number of (stereo) + samples in each CDDA track is always a multiple of 588. + + coreaudio (optional) + Mac OSX CoreAudio device driver: supports both playing and + recording audio. If a filename is not specific or if the name + is "default" then the default audio device is selected. Any + other name will be used to select a specific device. The valid + names can be seen in the System Preferences‐>Sound menu and then + under the Output and Input tabs. + + Examples: + + sox infile −t coreaudio + sox infile −t coreaudio default + sox infile −t coreaudio "Internal Speakers" + + See also play(1), rec(1), and sox(1) −d. + + .cvsd, .cvs + Continuously Variable Slope Delta modulation. A headerless for‐ + mat used to compress speech audio for applications such as voice + mail. This format is sometimes used with bit‐reversed samples ‐ + the −X format option can be used to set the bit‐order. + + .cvu Continuously Variable Slope Delta modulation (unfiltered). This + is an alternative handler for CVSD that is unfiltered but can be + used with any bit‐rate. E.g. + + sox infile outfile.cvu rate 28k + play −r 28k outfile.cvu sinc −3.4k + + + .dat Text Data files. These files contain a textual representation + of the sample data. There is one line at the beginning that + contains the sample rate, and one line that contains the number + of channels. Subsequent lines contain two or more numeric data + intems: the time since the beginning of the first sample and the + sample value for each channel. + + Values are normalized so that the maximum and minimum are 1 and + −1. This file format can be used to create data files for + external programs such as FFT analysers or graph routines. SoX + can also convert a file in this format back into one of the + other file formats. + + Example containing only 2 stereo samples of silence: + + + ; Sample Rate 8012 + ; Channels 2 + 0 0 0 + 0.00012481278 0 0 + + + .dvms, .vms + Used in Germany to compress speech audio for voice mail. A + self‐describing variant of cvsd. + + .fap (optional) + See .paf. + + .flac (optional; also with −t sndfile) + Xiph.org’s Free Lossless Audio CODEC compressed audio. FLAC is + an open, patent‐free CODEC designed for compressing music. It + is similar to MP3 and Ogg Vorbis, but lossless, meaning that + audio is compressed in FLAC without any loss in quality. + + SoX can read native FLAC files (.flac) but not Ogg FLAC files + (.ogg). [But see .ogg below for information relating to support + for Ogg Vorbis files.] + + SoX can write native FLAC files according to a given or default + compression level. 8 is the default compression level and gives + the best (but slowest) compression; 0 gives the least (but + fastest) compression. The compression level is selected using + the −C option [see sox(1)] with a whole number from 0 to 8. + + .fssd An alias for the .u8 format. + + .gsrt Grandstream ring‐tone files. Whilst this file format can con‐ + tain A‐Law, μ‐law, GSM, G.722, G.723, G.726, G.728, or iLBC + encoded audio, SoX supports reading and writing only A‐Law and + μ‐law. E.g. + + sox music.wav −t gsrt ring.bin + play ring.bin + + + .gsm (optional; also with −t sndfile) + GSM 06.10 Lossy Speech Compression. A lossy format for com‐ + pressing speech which is used in the Global Standard for Mobile + telecommunications (GSM). It’s good for its purpose, shrinking + audio data size, but it will introduce lots of noise when a + given audio signal is encoded and decoded multiple times. This + format is used by some voice mail applications. It is rather + CPU intensive. + + .hcom Macintosh HCOM files. These are Mac FSSD files with Huffman + compression. + + .htk Single channel 16‐bit PCM format used by HTK, a toolkit for + building Hidden Markov Model speech processing tools. + + .ircam (also with −t sndfile) + Another name for .sf. + + .ima (also with −t sndfile) + A headerless file of IMA ADPCM audio data. IMA ADPCM claims + 16‐bit precision packed into only 4 bits, but in fact sounds no + better than .vox. + + .lpc, .lpc10 + LPC‐10 is a compression scheme for speech developed in the + United States. See http://www.arl.wustl.edu/~jaf/lpc/ for + details. There is no associated file format, so SoX’s implemen‐ + tation is headerless. + + .mat, .mat4, .mat5 (optional) + Matlab 4.2/5.0 (respectively GNU Octave 2.0/2.1) format (.mat is + the same as .mat4). + + .m3u A playlist format; contains a list of audio files. SoX can + read, but not write this file format. See [1] for details of + this format. + + .maud An IFF‐conforming audio file type, registered by MS MacroSystem + Computer GmbH, published along with the ‘Toccata’ sound‐card on + the Amiga. Allows 8bit linear, 16bit linear, A‐Law, μ‐law in + mono and stereo. + + .mp3, .mp2 (optional read, optional write) + MP3 compressed audio; MP3 (MPEG Layer 3) is a part of the + patent‐encumbered MPEG standards for audio and video compres‐ + sion. It is a lossy compression format that achieves good com‐ + pression rates with little quality loss. + + Because MP3 is patented, SoX cannot be distributed with MP3 sup‐ + port without incurring the patent holder’s fees. Users who + require SoX with MP3 support must currently compile and build + SoX with the MP3 libraries (LAME & MAD) from source code, or, in + some cases, obtain pre‐built dynamically loadable libraries. + + When reading MP3 files, up to 28 bits of precision is stored + although only 16 bits is reported to user. This is to allow + default behavior of writing 16 bit output files. A user can + specify a higher precision for the output file to prevent loss‐ + ing this extra information. MP3 output files will use up to 24 + bits of precision while encoding. + + MP3 compression parameters can be selected using SoX’s −C option + as follows (note that the current syntax is subject to change): + + The primary parameter to the LAME encoder is the bit rate. If + the value of the −C value is a positive integer, it’s taken as + the bitrate in kbps (e.g. if you specify 128, it uses 128 kbps). + + The second most important parameter is probably "quality" + (really performance), which allows balancing encoding speed vs. + quality. In LAME, 0 specifies highest quality but is very slow, + while 9 selects poor quality, but is fast. (5 is the default and + 2 is recommended as a good trade‐off for high quality encodes.) + + Because the −C value is a float, the fractional part is used to + select quality. 128.2 selects 128 kbps encoding with a quality + of 2. There is one problem with this approach. We need 128 to + specify 128 kbps encoding with default quality, so 0 means use + default. Instead of 0 you have to use .01 (or .99) to specify + the highest quality (128.01 or 128.99). + + LAME uses bitrate to specify a constant bitrate, but higher + quality can be achieved using Variable Bit Rate (VBR). VBR qual‐ + ity (really size) is selected using a number from 0 to 9. Use a + value of 0 for high quality, larger files, and 9 for smaller + files of lower quality. 4 is the default. + + In order to squeeze the selection of VBR into the the −C value + float we use negative numbers to select VRR. ‐4.2 would select + default VBR encoding (size) with high quality (speed). One spe‐ + cial case is 0, which is a valid VBR encoding parameter but not + a valid bitrate. Compression value of 0 is always treated as a + high quality vbr, as a result both ‐0.2 and 0.2 are treated as + highest quality VBR (size) and high quality (speed). + + See also Ogg Vorbis for a similar format. + + .nist (also with −t sndfile) + See .sph. + + .ogg, .vorbis (optional) + Xiph.org’s Ogg Vorbis compressed audio; an open, patent‐free + CODEC designed for music and streaming audio. It is a lossy + compression format (similar to MP3, VQF & AAC) that achieves + good compression rates with a minimum amount of quality loss. + + SoX can decode all types of Ogg Vorbis files, and can encode at + different compression levels/qualities given as a number from −1 + (highest compression/lowest quality) to 10 (lowest compression, + highest quality). By default the encoding quality level is 3 + (which gives an encoded rate of approx. 112kbps), but this can + be changed using the −C option (see above) with a number from −1 + to 10; fractional numbers (e.g. 3.6) are also allowed. Decod‐ + ing is somewhat CPU intensive and encoding is very CPU inten‐ + sive. + + See also .mp3 for a similar format. + + .opus (optional) + Xiph.org’s Opus compressed audio; an open, lossy, low‐latency + codec offering a wide range of compression rates. It uses the + Ogg container. + + SoX can only read Opus files, not write them. + + oss (optional) + Open Sound System /dev/dsp device driver; supports both playing + and recording audio. OSS support is available in Unix‐like + operating systems, sometimes together with alternative sound + systems (such as ALSA). Examples: + + sox infile −t oss + sox infile −t oss /dev/dsp + sox −b 16 −t oss /dev/dsp outfile + + See also play(1), rec(1), and sox(1) −d. + + .paf, .fap (optional) + Ensoniq PARIS file format (big and little‐endian respectively). + + .pls A playlist format; contains a list of audio files. SoX can + read, but not write this file format. See [2] for details of + this format. + + Note: SoX support for SHOUTcast PLS relies on wget(1) and is + only partially supported: it’s necessary to specify the audio + type manually, e.g. + + play −t mp3 "http://a.server/pls?rn=265&file=filename.pls" + + and SoX does not know about alternative servers ‐ hit Ctrl‐C + twice in quick succession to quit. + + .prc Psion Record. Used in Psion EPOC PDAs (Series 5, Revo and simi‐ + lar) for System alarms and recordings made by the built‐in + Record application. When writing, SoX defaults to A‐law, which + is recommended; if you must use ADPCM, then use the −e ima‐adpcm + switch. The sound quality is poor because Psion Record seems to + insist on frames of 800 samples or fewer, so that the ADPCM + CODEC has to be reset at every 800 frames, which causes the + sound to glitch every tenth of a second. + + pulseaudio (optional) + PulseAudio driver; supports both playing and recording of audio. + PulseAudio is a cross platform networked sound server. If a + file name is specified with this driver, it is ignored. Exam‐ + ples: + + sox infile −t pulseaudio + sox infile −t pulseaudio default + + See also play(1), rec(1), and sox(1) −d. + + .pvf (optional) + Portable Voice Format. + + .sd2 (optional) + Sound Designer 2 format. + + .sds (optional) + MIDI Sample Dump Standard. + + .sf (also with −t sndfile) + IRCAM SDIF (Institut de Recherche et Coordination Acous‐ + tique/Musique Sound Description Interchange Format). Used by + academic music software such as the CSound package, and the + MixView sound sample editor. + + .sln Asterisk PBX ‘signed linear’ 8khz, 16‐bit signed integer, lit‐ + tle‐endian raw format. + + .sph, .nist (also with −t sndfile) + SPHERE (SPeech HEader Resources) is a file format defined by + NIST (National Institute of Standards and Technology) and is + used with speech audio. SoX can read these files when they con‐ + tain μ‐law and PCM data. It will ignore any header information + that says the data is compressed using shorten compression and + will treat the data as either μ‐law or PCM. This will allow SoX + and the command line shorten program to be run together using + pipes to encompasses the data and then pass the result to SoX + for processing. + + .smp Turtle Beach SampleVision files. SMP files are for use with the + PC‐DOS package SampleVision by Turtle Beach Softworks. This + package is for communication to several MIDI samplers. All sam‐ + ple rates are supported by the package, although not all are + supported by the samplers themselves. Currently loop points are + ignored. + + .snd See .au, .sndr and .sndt. + + sndfile (optional) + This is a pseudo‐type that forces libsndfile to be used. For + writing files, the actual file type is then taken from the out‐ + put file name; for reading them, it is deduced from the file. + + sndio (optional) + OpenBSD audio device driver; supports both playing and recording + audio. + + sox infile −t sndio + + See also play(1), rec(1), and sox(1) −d. + + .sndr Sounder files. An MS‐DOS/Windows format from the early ’90s. + Sounder files usually have the extension ‘.SND’. + + .sndt SoundTool files. An MS‐DOS/Windows format from the early ’90s. + SoundTool files usually have the extension ‘.SND’. + + .sou An alias for the .u8 raw format. + + .sox SoX’s native uncompressed PCM format, intended for storing (or + piping) audio at intermediate processing points (i.e. between + SoX invocations). It has much in common with the popular WAV, + AIFF, and AU uncompressed PCM formats, but has the following + specific characteristics: the PCM samples are always stored as + 32 bit signed integers, the samples are stored (by default) as + ‘native endian’, and the number of samples in the file is + recorded as a 64‐bit integer. Comments are also supported. + + See ‘Special Filenames’ in sox(1) for examples of using the .sox + format with ‘pipes’. + + sunau (optional) + Sun /dev/audio device driver; supports both playing and record‐ + ing audio. For example: + + sox infile −t sunau /dev/audio + + or + + sox infile −t sunau −e mu‐law −c 1 /dev/audio + + for older sun equipment. + + See also play(1), rec(1), and sox(1) −d. + + .txw Yamaha TX‐16W sampler. A file format from a Yamaha sampling + keyboard which wrote IBM‐PC format 3.5" floppies. Handles read‐ + ing of files which do not have the sample rate field set to one + of the expected by looking at some other bytes in the + attack/loop length fields, and defaulting to 33 kHz if the sam‐ + ple rate is still unknown. + + .vms See .dvms. + + .voc (also with −t sndfile) + Sound Blaster VOC files. VOC files are multi‐part and contain + silence parts, looping, and different sample rates for different + chunks. On input, the silence parts are filled out, loops are + rejected, and sample data with a new sample rate is rejected. + Silence with a different sample rate is generated appropriately. + On output, silence is not detected, nor are impossible sample + rates. SoX supports reading (but not writing) VOC files with + multiple blocks, and files containing μ‐law, A‐law, and + 2/3/4‐bit ADPCM samples. + + .vorbis + See .ogg. + + .vox (also with −t sndfile) + A headerless file of Dialogic/OKI ADPCM audio data commonly + comes with the extension .vox. This ADPCM data has 12‐bit pre‐ + cision packed into only 4‐bits. + + Note: some early Dialogic hardware does not always reset the + ADPCM encoder at the start of each vox file. This can result in + clipping and/or DC offset problems when it comes to decoding the + audio. Whilst little can be done about the clipping, a DC off‐ + set can be removed by passing the decoded audio through a high‐ + pass filter, e.g.: + + sox input.vox output.wav highpass 10 + + + .w64 (optional) + Sonic Foundry’s 64‐bit RIFF/WAV format. + + .wav (also with −t sndfile) + Microsoft .WAV RIFF files. This is the native audio file format + of Windows, and widely used for uncompressed audio. + + Normally .wav files have all formatting information in their + headers, and so do not need any format options specified for an + input file. If any are, they will override the file header, and + you will be warned to this effect. You had better know what you + are doing! Output format options will cause a format conversion, + and the .wav will written appropriately. + + SoX can read and write linear PCM, floating point, μ‐law, A‐law, + MS ADPCM, and IMA (or DVI) ADPCM encoded samples. WAV files can + also contain audio encoded in many other ways (not currently + supported with SoX) e.g. MP3; in some cases such a file can + still be read by SoX by overriding the file type, e.g. + + play −t mp3 mp3−encoded.wav + + Big endian versions of RIFF files, called RIFX, are also sup‐ + ported. To write a RIFX file, use the −B option with the output + file options. + + waveaudio (optional) + MS‐Windows native audio device driver. Examples: + + sox infile −t waveaudio + sox infile −t waveaudio default + sox infile −t waveaudio 1 + sox infile −t waveaudio "High Definition Audio Device (" + + If the device name is omitted, ‐1, or default, then you get the + ‘Microsoft Wave Mapper’ device. Wave Mapper means ‘use the sys‐ + tem default audio devices’. You can control what ‘default’ + means via the OS Control Panel. + + If the device name given is some other number, you get that + audio device by index; so recording with device name 0 would get + the first input device (perhaps the microphone), 1 would get the + second (perhaps line in), etc. Playback using 0 will get the + first output device (usually the only audio device). + + If the device name given is something other than a number, SoX + tries to match it (maximum 31 characters) against the names of + the available devices. + + See also play(1), rec(1), and sox(1) −d. + + .wavpcm + A non‐standard, but widely used, variant of .wav. Some applica‐ + tions cannot read a standard WAV file header for PCM‐encoded + data with sample‐size greater than 16‐bits or with more than two + channels, but can read a non‐standard WAV header. It is likely + that such applications will eventually be updated to support the + standard header, but in the mean time, this SoX format can be + used to create files with the non‐standard header that should + work with these applications. (Note that SoX will automatically + detect and read WAV files with the non‐standard header.) + + The most common use of this file‐type is likely to be along the + following lines: + + sox infile.any −t wavpcm −e signed‐integer outfile.wav + + + .wv (optional) + WavPack lossless audio compression. Note that, when converting + .wav to this format and back again, the RIFF header is not nec‐ + essarily preserved losslessly (though the audio is). + + .wve (also with −t sndfile) + Psion 8‐bit A‐law. Used on Psion SIBO PDAs (Series 3 and simi‐ + lar). This format is deprecated in SoX, but will continue to be + used in libsndfile. + + .xa Maxis XA files. These are 16‐bit ADPCM audio files used by + Maxis games. Writing .xa files is currently not supported, + although adding write support should not be very difficult. + + .xi (optional) + Fasttracker 2 Extended Instrument format. + +SEE ALSO + sox(1), soxi(1), libsox(3), octave(1), wget(1) + + The SoX web page at http://sox.sourceforge.net + SoX scripting examples at http://sox.sourceforge.net/Docs/Scripts + + References + [1] Wikipedia, M3U, http://en.wikipedia.org/wiki/M3U + + [2] Wikipedia, PLS, http://en.wikipedia.org/wiki/PLS_(file_format) + +LICENSE + Copyright 1998−2013 Chris Bagwell and SoX Contributors. + Copyright 1991 Lance Norskog and Sundry Contributors. + +AUTHORS + Chris Bagwell (cbagwell@users.sourceforge.net). Other authors and con‐ + tributors are listed in the ChangeLog file that is distributed with the + source code. + + + +soxformat December 31, 2014 SoX(7) diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxformat.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxformat.txt.meta new file mode 100644 index 0000000..b1f9240 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxformat.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7865c24f92f26ec4b99ee216da142aac +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi new file mode 100644 index 0000000..9ca83ec --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi @@ -0,0 +1 @@ +sox \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.meta new file mode 100644 index 0000000..6ce13ff --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a0e0997a8d333cb498ea2c33468929e2 +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.txt new file mode 100644 index 0000000..3b02f26 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.txt @@ -0,0 +1,82 @@ +SoXI(1) Sound eXchange SoXI(1) + + + +NAME + SoXI − Sound eXchange Information, display sound file metadata + +SYNOPSIS + soxi [−V[level]] [−T] [−t|−r|−c|−s|−d|−D|−b|−B|−p|−e|−a] infile1 ... + +DESCRIPTION + Displays information from the header of a given audio file or files. + Supported audio file types are listed and described in soxformat(7). + Note however, that soxi is intended for use only with audio files with + a self‐describing header. + + By default, as much information as is available is shown. An option + may be given to select just a single piece of information (perhaps for + use in a script or batch‐file). + +OPTIONS + −V Set verbosity. See sox(1) for details. + + −T Used with multiple files; changes the behaviour of −s, −d and −D + to display the total across all given files. Note that when + used with −s with files with different sampling rates, this is + of questionable value. + + −t Show detected file‐type. + + −r Show sample‐rate. + + −c Show number of channels. + + −s Show number of samples (0 if unavailable). + + −d Show duration in hours, minutes and seconds (0 if unavailable). + Equivalent to number of samples divided by the sample‐rate. + + −D Show duration in seconds (0 if unavailable). + + −b Show number of bits per sample (0 if not applicable). + + −B Show the bitrate averaged over the whole file (0 if unavail‐ + able). + + −p Show estimated sample precision in bits. + + −e Show the name of the audio encoding. + + −a Show file comments (annotations) if available. + +BUGS + Please report any bugs found in this version of SoX to the mailing list + (sox‐users@lists.sourceforge.net). + +SEE ALSO + sox(1), soxformat(7), libsox(3) + + The SoX web site at http://sox.sourceforge.net + +LICENSE + Copyright 2008−2013 by Chris Bagwell and SoX Contributors. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MER‐ + CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + +AUTHORS + Chris Bagwell (cbagwell@users.sourceforge.net). Other authors and con‐ + tributors are listed in the ChangeLog file that is distributed with the + source code. + + + +soxi February 1, 2013 SoXI(1) diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.txt.meta new file mode 100644 index 0000000..8041326 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-macosx/soxi.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e5559805d132cff48a8cd99c7f234ae0 +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32.meta new file mode 100644 index 0000000..cb4cfd0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: cc77dab52013d59478d776e7026a39e5 +folderAsset: yes +timeCreated: 1548365885 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/ChangeLog.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/ChangeLog.txt new file mode 100644 index 0000000..809b43f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/ChangeLog.txt @@ -0,0 +1,1759 @@ +Change History +-------------- + +This file contains a list of all changes starting after the release of +sox-11gamma, followed by a list of prior authors and features. + +$ox-14.4.2 2015-02-22 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.3.0 O -1/-2/-3/-4/-8 -b + 14.3.0 O -s/-u/-f -e + 14.3.0 O -A/-U/-o/-i/-a/-g -e + 14.4.0 E swap with parameters remix + 14.4.0 E mixer remix + 14.4.1 OpenMP < 3.0 OpenMP >= 3.0 + 14.4.1 F ffmpeg ffmpeg/avconv via pipe + +File formats: + + o Add optional support for reading Ogg Opus files. (John Stumpo) + o Fix for max size text chunks in aiff files. (cbagwell) + o Add reading support for RF64 WAV files. (Dave Lambley) + o Work around for libsndfile created RF64 files with invalid + sizes. (Dave Lambley) + o Detect MS ADPCM WAV files with invalid blocks. (cbagwell) + o Detect Sphere files with invalid header sizes. (cbagwell) + +Effects: + + o 'Deemph' can now also be used at 48kHz sample rate. (robs) + o 'Rate' now much faster in many cases. (robs) + o Allow sending spectrograms to stdout. (Ulrich Klauer) + o Allow use of Dolph window with spectrograms. (robs) + o Allow mixing time and sample-count arguments for the delay + effect, and for spectrogram -S and -d. (Ulrich Klauer) + o Support multi-channel LADSPA plugins. (Eric Wong) + o Support infinite repetition with repeat. (Ulrich Klauer) + o Improved pink noise frequency response in synth. (robs) + o Extended syntax for specifying audio positions to several + effects. (Ulrich Klauer) + o Fix integer overflow in mcompand. [3590093] (Guido Aulisi) + o Add optional latency compenstation for LADSPA plugins. (Eric Wong) + +Other new features: + + o New -p option for soxi to display sample precision. (Ulrich Klauer) + o New libsox example6: give explicit output attributes. (robs) + +Internal improvements: + + o Speed optimization for effects that operate on channels + independently. (Ulrich Klauer) + o Fix memory leaks. (Ulrich Klauer) + o Most internal symbols (lsx_*) are no longer exported. (Ulrich Klauer) + + +sox-14.4.1 2013-02-01 +---------- + +Newly deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.4.1 OpenMP < 3.0 OpenMP >= 3.0 14.4.1 + 14.4.1 F ffmpeg ffmpeg/avconf via pipe 14.4.1 + +File formats: + + o Fix pipe file-type detection regression. (robs) + o MAUD write fixes. [3507927] (Carl Eric Codere and Ulrich Klauer) + o Fix crash when seeking within a FLAC file. [3476843] (Eric Wong) + o Fix Ogg Vorbis files with certain numbers of channels being + truncated. (Ulrich Klauer) + o Fix reading 64-bit float WAVs. [3481510] (nu774 and Ulrich Klauer) + o Fix potential buffer overrun when writing FLAC files directly via + sox_write(). [3474924] (Eric Wong) + +Audio device drivers: + + o Check whether pulseaudio is available before choosing it as + default. (robs) + +Effects: + + o Restore 8 seconds default for spectrogram, if the input length is + not known. (Ulrich Klauer) + o Set output length for splice to unknown instead of 0. (Ulrich Klauer) + o Increase maximum width for spectrograms. (Ulrich Klauer) + o Fix memory leaks in LADSPA effect. (Eric Wong) + o Fix hang in several effects (rate, tempo, and those based on + dft_filter) when processing long files. [3592482, 3594822] (MrMod) + o Prevent (m)compand from tampering with their arguments. (Ulrich Klauer) + +Other bug fixes: + + o Fix input length calculation for combine methods other than + concatenate. (Ulrich Klauer) + o Fix to configure.ac to work with Autoconf 2.69. [3600293] (cbagwell) + o Use binary mode for pipes on all Windows compilers, rather than + MSVC only. [3602130] (Ulrich Klauer) + + +sox-14.4.0 2012-03-04 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.3.0 O --interactive --no-clobber + 14.3.0 E filter ~= sinc + 14.3.0 E norm -b, norm -i gain -B, gain -en + 14.3.0 PLAY_RATE_ARG SOX_OPTS + 14.2.0 E key alias pitch + 14.2.0 E pan ~= remix + 14.1.0 E resample alias rate + 14.1.0 E polyphase alias rate + 14.1.0 E rabbit alias rate + 14.3.1 F sndfile: sndfile 1.0.11 sndfile > 1.0.11 + 14.3.0 F flac: libFLAC < 1.1.3 libFLAC >= 1.1.3 + 14.3.1 F mp3: lame 3.97 lame > 3.97 + +Newly deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.4.0 E mixer remix 14.4.0 + 1 year + 14.4.0 E swap with parameters remix 14.4.0 + +Previously deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.3.0 O -1/-2/-3/-4/-8 -b 14.4.0 + 14.3.0 O -s/-u/-f -e 14.4.0 + 14.3.0 O -A/-U/-o/-i/-a/-g -e 14.4.0 + +File formats: + + o Mention in man pages that WAV files support floating point encodings. + o Add support for floating point encodings in AIFF-C files. (Ulrich Klauer) + o Pad WAV data chunk to an even number of bytes (as required by the + specification). [3203418] (Ulrich Klauer) + o Add optional MP2 write support with twolame library. (Paul Kelly) + +Audio device drivers: + + o Give pulseaudio driver higher priority than alsa or oss now that + its proven stable and gives user more features; such as per app + volume control. (cbagwell) + o Fix bug when specifying OSX coreaudio device name. Would only + search for first 3 devices. (cbagwell) + o Fix sox hangups are exit when using coreaudio. (cbagwell) + o Improve buffering in coreaudio driver (Michael Chen) + o Support enabling play/rec mode when user invokes sox as either + play or play.exe on windows. (cbagwell) + o Fix compile of sunaudio driver on OpenBSD (cbagwell) + +Effects: + + o Improvements to man pages for tempo effect. Really made in 14.3.2. + (Jim Harkins). + o New upsample effect. (robs) + o Fix to effects pipeline to let fade effect specify time from end of + file again. (cbagwell and Thor Andreassen) + o Fix man page default error for splice effect. (Ulrich Klauer) + o Enable support for --plot option on biquad and fir effects. (Ulrich Klauer) + o Effects chain can now be unlimited in length. (Ulrich Klauer) + o Fix newfile/restart effects when merging or mixing files. (Ulrich Klauer) + o Fix crashes in compand and mcompand effects. [3420893] (Ulrich Klauer) + o Let the delay effect gracefully handle the special case that a delay can + be more than the input length. [3055399] (Ulrich Klauer) + o New hilbert and downsample effects. (Ulrich Klauer) + o Fix problem where fade would sometimes fail if specifying a fade-out + immediately after a fade-in. (robs) + o Stricter syntax checking for several effects (might reveal bugs hidden + in existing scripts). (Ulrich Klauer) + o Calculate output audio length for most effects. (Ulrich Klauer) + o Fix problems with several effects when the buffer size was not evenly + divisible by the number of channels. [3420899] (Ulrich Klauer) + o Complete rewrite of the trim effect with extended syntax (backwards + compatible) and capabilities. [FR 2941349] (Ulrich Klauer) + o Fix trim optimization unexpectedly seeking backwards. (Ulrich Klauer) + o Prevent samples from getting lost at effects chain transitions in + multiple effects chain/multiple output modes. (Ulrich Klauer) + +Misc: + + o Minor improvements to the man page. (Ulrich Klauer) + o When using pipes (-p) on Windows, set file mode to binary. (cbagwell) + o Updated .dat format description in soxformat. (Jan Stary) + o Doxygen documentation for libSoX. (Doug Cook) + +Other bug fixes: + + o Fix several memory leaks. [3309913] (Jin-Myung Won and Ulrich Klauer) + o Fixed crashes in apps that call sox_format_init/quit() multiple times. + (cbagwell) + +Internal improvements: + + o Added use_threads variable to sox_globals. This should be used to enable + or disable use of parallel effects processing instead of directly calling + omp_set_num_threads. (Doug Cook) + o Fix compiler warnings. (Cristian Morales Vega [P. 3072301], Doug Cook) + o Improve large file support by using 64-bit numbers to count + samples. (Doug Cook, Thor Andreassen, Ulrich Klauer) + + +sox-14.3.2 2011-02-27 +---------- + +File formats: + + o Add seek support to mp3 handler for speed improvements. (Pavel Karneliuk) + o Fix bug were WavPack header was not updated correctly when closing + file. Fixed libsox memory leak when closing WavPack files. + (David Bryant) + o Fix RIFF chunk length error when writing 24-bit files. (David Bryant) + o 24-bit WAV files were leaving channel maps unassigned. Change to use + common channel mappings based on channel count. This allows to + work more seemlessly with other apps such as WavPack and Foobar2000. + (David Bryant) + o Fix ffmpeg playback bug caused by alignment requirements on some platforms. + Closes bug #3017690. (Reuben Thomas). + o Fix memory leak in ffmpeg. (Doug Cook) + o Handle 0 length chunks in WAV files gracefully. (Beat Jorg) + o When skipping over chunks, account for word alignment. Helps + with some Logic Pro generated files. (D Lambley) + o Fix incorrect MP3 file length determination with VBR & .5s initial + silence. (robs) + +Audio device drivers: + + o Fix immediate segfault on OSX while attempting to record. (Adam Fritzler) + o Fix segfault on OSX playback for some HW that gives smaller then + requested buffers. (cbagwell) + o Clean up system resource in coreaudio on close. Allows running + back-to-back open()/close()'s without exiting app first. (cbagwell) + o Add support for 32-bit samples to OSS driver. (Eric Lammerts) + o Add support for 24 and 32-bit samples to waveaudio (Win32) driver. + (Doug Cook) + o Support specifying audio device other than default on OSX (cbagwell) + +Effects: + + o F.R. [3051700] spectrogram -r for `raw' spectrogram, no legend. (robs) + o Fix -w option on stats effect. (Ronald Sprouse) + o Fix segfault with some ladspa plugins (Thor Andreassen) + o Optionally look for png.h in libpng directory to support OpenBSD + packaging. Helps enable spectrograph effect. (cbagwell) + o libpng15 requires application to include zlib.h header file. (cbagwell) + Add this to spectrograph effect. [3184238] + o Enable LADSPA effects on all platforms without any external + dependencies. Mainly useful for Linux, Windows and OS X which have + binaries readily available. (cbagwell) + o Support specifying an absolute end location for trim effect instead + only an offset from trim begin location. (Ulrich Klauer) + o Fix regression where MP3 handler required libmad headers to be installed. + (Samuli Suominen) + o Allow dynamic loading of lame to be enabled even if lame header files + are not installed. (Doug Cook) + +Other new features: + + o Soxi now reports duration of AMR files. (robs) + o Document the "multiple" combine option in man pages and in + usage output (Ulrich Klauer). + +Internal improvements: + + o Distribute msvc9 project files that had been in CVS only. (cbagwell) + o Add msvc10 project files (also compatible with the Windows SDK 7.1). + (Doug Cook) + o cmake now compiles waveaudio driver under windows environment. (cbagwell) + [3072672] + +sox-14.3.1 2010-04-11 +---------- + +Newly deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.3.1 F mp3: lame 3.97 lame > 3.97 2011-04-11 + 14.3.1 F sndfile: sndfile 1.0.11 sndfile > 1.0.11 14.3.1 + +Previously deprecated features (to be removed in future): + + Deprec- Feature [O(ption)] Removal + ated in [F(ormat)] [E(ffect)] Replacement due after + ------- ---------------------- ---------------------- ------- + 14.2.0 E key alias pitch 14.3.1 + 14.2.0 E pan ~= mixer/remix 14.3.1 + 14.3.0 F flac: libFLAC 1.1.2,3 libFLAC > 1.1.3 14.3.1 + 14.3.0 PLAY_RATE_ARG SOX_OPTS 14.3.1 + 14.3.0 E norm -b, norm -i gain -B, gain -en 2010-06-14 + 14.3.0 E filter ~=sinc 2010-06-14 + 14.1.0 E resample alias rate 2010-06-14 + 14.1.0 E polyphase alias rate 2010-06-14 + 14.1.0 E rabbit alias rate 2010-06-14 + +LibSoX interface changes: + + o Added new variants of sox_open to allow read/write from/to memory + buffers (in POSIX 2008 environment); see example5.c. (robs) + +File formats: + + o New Grandstream ring-tone (gsrt) format. (robs) + o CVSD encode/decode speed-ups. (Kimberly Rockwell, P. Chaintreuil) + o Add ability to select MP3 compression parameters. (Jim Harkins) + o Now writes out ID3-tags in MP3 files with lame supports it. (Doug Cook) + o Also can write VBR Tag ("XING Header") in MP3 files. (Jim Hark / + Doug Cook) + o Increase percision of MP3 encoders to use 24-bits instead of + 16-bits. (Doug Cook) + o Fix failed writing 24-bit PAF files (and possibly other libsndfile + based formats). (cbagwell) + o Allow libsndfile to be dlopen()'ed at runtime if --enable-dl-sndfile + is used. (Doug Cook) + o Allow amr-nb/amr-wb to be dlopen()'ed at runtime if + --enable-dl-amrwb or --enable-dl-amrnb is used. (Doug Cook) + o amrnb and amrwb formats can optionally use opencore-amr libraries. + (cbagwell) + +Audio device drivers: + + o Add native windows audio driver. (Pavel Karneliuk, Doug Cook) + o Add 32-bit support to ALSA driver. (Pavel Hofman) + o Make OpenBSD sndio audio driver default over older sunau driver. + (cbagwell) + +Effects: + + o Fix [2254919] silence doesn't trim digital silence correctly. (robs) + o Fix [2859842] stats effect crashes on 64-bit arch. (Ulrich Klauer) + +Other new features: + + o Added libSoX example #4: concatenating audio files. (robs) + o Show soxi version & usage information when no args given. (robs) + +Other bug fixes: + + o Fix build so that grouped files (e.g. play -r 6k "*.vox" plays all + at 6k) works. (robs) + o Fix build to support auto file type detection with pipes on FreeBSD + and elsewhere. (Dan Nelson) + o Fix simultaneous play & rec not working. (robs) + o Fix multi-threading problems on multi-core Windows OS; also, change + default to single-threaded. + o Fix mistaken file size with pipe input on Windows. (Doug Cook) + o Fix missing documentation for -R (repeatable), and pulseaudio driver. + o Fix memory leak of format private data. (Slawomir Testowy) + +Internal improvements: + + o Move bit-rot detection support files to sub-directory (could + previously cause build problems). (robs) + o [2859244] Fixes to improve compatibility with MSVC. (Doug Cook) + o Added utilities to help any format handler dlopen() external + libraries at run time instead of link time. (Doug Cook) + o Compiling with mingw now has feature parity with cygwin. (Doug Cook + and cbagwell) + + + +sox-14.3.0 2009-06-14 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.1.0 E resample * ~= rate + 14.1.0 E polyphase * ~= rate + 14.1.0 E rabbit * ~= rate + 14.2.0 E dither: RPDF,scaled dither (TPDF only) + 14.1.0 F flac: libFLAC 1.1.1 libFLAC > 1.1.1 + + * But interface retained as an alias for `rate'. + +LibSoX interface changes: + + o sox_format_init() has been supeseded by sox_init(). + o Removed obsolete error codes (SOX_E...); new sox_strerror() + function to convert error codes to text. + o Use of sox_effect_options() is now mandatory when initialising an + effect (see example0.c for an example of this). + o sox_flow_effects() has a new (3rd) parameter: a void pointer + `client_data' that is passed as a new (2nd) parameter to the flow + callback function. client_data may be NULL. + +File formats: + + o Slight improvement to A-law/u-law conversion accuracy: round LSB + instead of truncating. (robs) + o Fix length in wav header with multi-channel output to pipe. (robs) + o Fix [2028181] w64 float format incompatibility. (Tim Munro) + o Fix reading AIFF files with pad bytes in COMT chunks. (Joe Holt) + o Fix AIFF file length bug to stop reading trash data on files that + have extra chunks at end of file. (Joe Holt) + o Fix file length being 4 bytes short for AIFF sowt CD tracks. (Joe Holt) + o Fix [2404566] segfault when converting from MS ADPCM wav file. (robs) + o Fix slight FLAC seek inaccuracy e.g. when using `trim' effect. (robs) + o Fix mp3 decode sometimes being up to a block short. (robs) + o Fix not outputing GSM-in-wav when input is GSM-in-wav. (robs) + +Audio device drivers: + + o New native OpenBSD audio handler for play/recording. (Alexandre Ratchov) + o 24-bit support for ALSA handler. (robs) + o Warn if ALSA under/overrun. (robs) + +Effects: + + o New `stats' effect; multichannel audio statistics. (robs) + o New `sinc' FFT filter effect; replacement for `filter'. (robs) + o New `fir' filter effect using external coefficients/file. (robs) + o New `biquad' filter effect using external coefficients. (robs) + o New `overdrive' effect. (robs) + o New `vad' Voice Activity Detector effect. (robs) + o `synth' enhancements: can now set common parameters for multiple + channels, new `pluck' and `tpdf' types, `scientific' note + notation, [2778142] just intonation. (robs) + o New multi-channel support and revised sizing options for `spectrogram'. + N.B. revised options are not directly backwards compatible -- see the + man page for details of the new syntax. (robs) + o Richer gain/normalise options. (robs) + o [2704442] Slight change to `riaa' gain: now norm'd to 0dB @ 1k + (previously 19.9dB @ DC). (Glenn Davis) + o Fix [2487589] `dither' clipping detection & handling. (robs) + o Fix `repeat' sometimes stopping repeating too soon. (robs) + o Fix `repeat' sometimes repeating wrong audio segments. (robs) + o Fix [2332343] 'silence' segfault with certain lengths. (cbagwell) + o Fix `silence' empty output file with A-law input. (robs) + o Fix temporary file problems in Windows (cygwin) with normalise and + other effects. (robs) + o Fix [2779041] spectrogram PNG file is invalid on Windows. (robs) + o Fix [2787587] `trim x 0' should produce zero length audio. (robs) + o Parallel effects channel processing on some hyper-threading/mult-core + architectures. New `--single-threaded' option to disable this. (robs) + +Other new features: + + o Added ability to create shared DLL's on cygwin (cbagwell) + o New `--guard' & `--norm' options; use temporary files to guard against + clipping for many, but not currently all, effects. (robs) + o New `--ignore-length' option to ignore length in input file header (for + simple encodings & for mp3); instead, read to end of file. (robs) + o New `--temp DIRECTORY' option. (robs) + o New `--play-rate-arg ARG' option. (robs) + o New SOX_OPTS environment variable; can be used to provide default + values for above and other options. (robs) + o Grouped files, e.g. play -r 6k "*.vox" plays all at 6k. (robs) + o Automatically `dither'; new `--no-dither' option to disable this. (robs) + o Can now use `v' & `V' keys to adjust volume whilst playing audio (on some + systems). (robs) + o New bitrate, time in seconds, & total options for soxi; bitrate + and file-size display for sox. (robs) + o `Magic' (libmagic) file type detection now selected using `--magic' + option (where supported). + o [2003121] In many cases, no longer need to specify -t when inputing + audio from a `pipe'. (robs) + o Support more Shoutcast URL variants. (robs) + o Added libSoX example #3: playing audio. (robs) + +Other bug fixes: + + o Fix [2262177] SoX build could fail with parse /etc/issue error. (robs) + o Fix "no handler for detected file type `application/octet-stream; + charset=binary'" with raw files when using libmagic. (robs) + +Internal improvements: + + o Rationalise use of and make repeatable across different platforms + pseudo random number generators. (robs) + o Rationalise effects' options interface (getopt compatible). (robs) + o Added stub headers to allow test compilation of all sources on + linux. (robs) + + +sox-14.2.0 2008-11-09 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 14.0.0 E pitch new pitch = old key + +File formats: + + o New `.cvu' unfiltered CVSD; supports any bit-rate. (robs) + o New `.sox' native format intended for intermediate files. (robs) + o Fix WAV write on 64-bit arch. (robs) + o Fix writing PRC ADPCM files. (Silas Brown) + o Fix problems reading short mp3 files. (robs) + +Effects: + + o N.B. Reduced default bandwidth setting for `rate' effect from 99% + to 95%; use `rate -s' to be compatible with SoX v14.1.0. (robs) + o New options for `rate' effect to configure phase response, + band-width and aliasing. (robs) + o New options for 'dither' effect: RPDF, TPDF, noise-shaping. (robs) + o New `riaa' effect: RIAA vinyl playback EQ. (robs) + o New `loudness' effect: gain control with ISO 226 loudness + compensation. (robs) + o New `bend' effect; pitch bending. (robs) + o New -b option for the norm effect; can be used to fix stereo + imbalance. (robs) + o Wider tempo range for `tempo' effect. (robs) + o New --effects-file option to read effects and arguments from + a file instead of command line. (cbagwell) + o `filter' effect now supports --plot. (robs) + o Improved documentation for the `stat' effect. (robs) + o Fix broken audio pass-through with noiseprof effect. (robs) + o Fix graph legend display when using --plot octave. (robs) + o Fix rare crash with `rate' effect. (robs) + o Fix [2190767] `norm' under-amplifying in some cases. (George Yohng) + o Fix [2007062] Earwax effect can overflow; should clip. (robs) + o Fix [2223251] mcompand should use linkwitz-riley. (robs) + o Fix `phaser' clicks and overflows. (robs) + o Trim will now skip past 2G point correctly. (cbagwell) + o Improved handling of speed changes in the effects chain. (robs) + +Other new features: + + o New psuedo-effects "newfile" and ":" to allow running + multiple effect chains on a single file. newfile will + create a new output file when an effect chain terminates. + Of most use with trim and silence effects. (cbagwell) + o Can now use multiple pipes as inputs to the combiner; + see `Special Filenames' in sox(1). (robs) + o Display SoX build/run environment information with -V -V. (robs) + o Display (with -V) the detected file-type if it differs from the + file extension. (robs) + o New -t option for soxi; to display the detected file type. (robs) + o New -b/--bits, -e/--encoding alternative options for specifying + audio encoding parameters. (robs) + o [FR 1958680] Support more than 32 input files. (robs) + o New native Mac OSX audio handler for playing/recording. (cbagwell) + +Other bug fixes: + + o Bump library version because it was not binary compatible with + SoX 14.0.1 (Pascal Giard) + o Turn off versioning of special libsox_fmt* libraries since thats + not really needed. (kwizart) + o Fixed crash when running play with no arguments. (Dan Nelson) + o Allow libpng to be found with -static option. (cbagwell) + o Allow libsamplerate to be found if pkg-config is installed but + no samplerate.pc exists. (cbagwell) + o [2038855] external lpc10 lib patch. (Oden Eriksson, Mandriva) + o Fix memory leaks in effects chain when restarting effects. (cbagwell) + o Fixed pkg-config CFLAGS. (evilynux) + o Fix sndfile inclusion in build in some circumstances. (robs) + o Fix [2026912] Fails on URL-like filenames. (robs) + o Always add _LARGEFILE_SUPPORT when off_t is 64bits to work around + buggy platforms. Fixes not able to read WAV files. (cbagwell) + +Internal improvements: + + o Fixed all compiler warnings (with gcc 4.3.1, 64-bit arch.). (robs) + o Updates to internal effects chain API. (cbagwell) + o Retire old FFT routines (speeds up `noisered' effect). (robs) + o Allow effects to use getopt. (robs) + o Use libmagic for mp3. (robs) + o Change sox_seek() offset to 64-bit to work with > 2G files (cbagwell) + o Merged libsfx back into libsox to align with sox.h API. (cbagwell) + + +sox-14.1.0 2008-7-29 +---------- + +Previously deprecated features that have been removed in this release: + + Deprec- Feature [O(ption)] + ated in [F(ormat)] [E(ffect)] Replacement + ------- ---------------------- ---------------------- + 13.0.0 O -e -n + 13.0.0 O -b/-w/-l/-d -1/-2/-4/-8 + 13.0.0 E avg, pick mixer + 13.0.0 E highp, lowp highpass -1, lowpass -1 + 13.0.0 E mask dither + 13.0.0 E vibro ~= tremolo + 13.0.0 F auto Becomes internal only + +File formats: + + o New option --help-format shows info about supported format(s). (robs) + o New WavPack format (includes lossless audio compression, but not + guaranteed lossless file compression). (robs) + o New htk format. (robs) + o Add .f4 & .f8 raw file extensions. (robs) + o Writing aiff, aifc & dvms now repeatable with -R. (robs) + o Writing hcom no longer fails with unsupported rate--chooses + best match. (robs) + o Au/snd: added support for 32-bit integer and 64-bit float PCM + encoding/decoding; display name of unsupported encoding. (robs) + o Can now write .amb (.wav variant) files [FR 1902232]. (robs) + o Can now read 2,3(2.6),4 bit ADPCM .voc files [FR 1714991]. (robs) + o Can now read some MP3 ID3 tags. (robs) + o Can now write Sounder files. (robs) + o Can now write DEC-variant au files (with -x). (robs) + o Comments support for SoundTool files. (robs) + o Fix [1864216] comments mangled when writing ogg-vorbis. (robs) + o Fix short noise at end of alsa playback. (Morita Sho/Tim Munro/robs) + o Fix wve seek accuracy. (robs) + o Fix lpc10 not working. (robs) + o Fix [1187257] wav MS-ADPCM block-align size incorrect. (robs) + o For wav & au, fix [548256] size in header wrong when piping out. (robs) + o Fix IRCAM SF header processing; support all (modern) variants. (robs) + o Fix 24-bit read/write on big-endian systems. (robs) + o Fix crash trying to open non-existent play-list. (robs) + o Fix FLAC read from stdin with libFLAC >= 8. (Patrick Taylor Ramsey/robs) + o Fix [1997637] Trim effect loses samples (with wav). (robs) + +Effects: + + o New `splice' effect; splice together audio sections. (robs) + o New `remix' effect; mixes any number of channels. (robs) + o New `norm' (normalise) effect. (robs) + o New `delay' effect; delay one or more channels. (robs) + o New `contrast' enhancement effect [FR 708923]. (robs) + o Improved `rate' resampling effect; resample, polyphase, & rabbit + now deprecated. (robs) + o New `spectrogram' effect; creates a PNG (if built with PNG lib). (robs) + o `synth' can now sweep linearly and squarely (as well as + exponentially). (robs) + o Can now `fade' out to EOF without giving file-length (if it can + be determined from the input file header). (robs) + o Fix synth max. level setting for some output encodings. (robs) + o Fix crash on 64-bit arch. with tempo & key effects. (Sami Liedes) + o `gain' alias for the vol effect. (robs) + +Other new features: + + o Now possible to control play-back resampling quality (and hence + cpu-load) via the PLAY_RATE_ARG environment variable. (robs) + o Command line support for multiple file comments. (robs) + o New --combine=mix-power option to mix combine using 1/sqrt(n) scaling + instead of 1/n [FR 2012856]. (robs) + o New --input-buffer option to specify (only) input buffer size. (robs) + o New `soxi' utility to extract/display file header fields. (robs) + o Pkg-config support. (Pascal Giard) + o Simple VU meter. (robs) + o Heuristic to detect when playing an album and set + the default replay-gain mode to `album'. (robs) + o Better auto-choice of output file format parameters when + type is different to that of input file. (robs) + o SoX now treats (and displays) encoding size & signal precision + separately. (robs) + o Default audio devices (sox), and allow environment variables to + be used to override the default audio device driver (rec/play) + and default audio device (all). (robs) + o Simpler file info display for `play'. (robs) + o For some file-types, warn if file size seems too short. (robs) + o Added auto-detect for caf, sndr, txw & sf files. (robs) + o Added example0: simpler example of how to develop applications that + use the libSoX effects chain. (robs) + o Added example2: simple example of how to develop applications that + use libSoX to read an audio file. (robs) + o Moved contents of soxexam man page into soxeffect man page. (robs) + +Other bug fixes: + + o Fix [1890983] rec shortcut should apply bit depth (8-bit, + 16-bit, etc.) to input handler. (robs) + o Fix ungraceful handling of out of disc space and other write + errors (bug was introduced in 14.0.0). (robs) + o Fix endian selection (-B, -L, -x) in some circumstances. (robs) + o Fix auto-detect of hcom files. (robs) + +Internal improvements: + + o Use FORTIFY_SOURCE with gcc. (robs) + o Fixed all compiler warnings (with gcc 4.2.3, 32-bit arch). (robs) + o Reimplement (separately) SoundTool & Sounder format handlers. (robs) + o Allow formats & effects to have any size of private data. (robs) + + +sox-14.0.1 2008-01-29 +---------- + + File formats: + + o Added support for non-standard, non-WAVE_FORMAT_EXTENSIBLE + (esp. 24-bit) PCM wav (see wavpcm in soxformat.7 for details). (robs) + + Effects: + + o Reimplemented reverb to be similar to freeverb. (robs) + + Bug fixes: + + o Fix Sndtool read error causing noise at start. (Reynir Stefánsson) + o Fix mixer with >4 numbers, and mixer -3 behaving as mixer -4. (robs) + o Fix [1748909] sox does not report remaining playtime of mp3s. (robs) + o Fix failure to read AIFF files with empty MARK chunk. (robs) + o Fix spurious 'Premature EOF' message in some circumstances. (robs) + o Switched to 16-bit for libao driver since not all its plugins + support it (such as oss, nas, and pulse audio) (Morita Sho) + o Stop crash when "rec" is run with no arguments (Morita Sho). + o Fix -V (without argument) on non-gnu systems. (robs) + o Fix reported (with -V) output audio length in some cases. (robs) + o Fix actual FLAC output file audio length in some cases. (robs) + o Fix poor 24-bit FLAC compression & support newer versions of + libFLAC (1.2.x). (robs) + o Fix loss of 1 decoded FLAC block when using "trim 0 ...". (robs) + o Fix trim when first effect with IMA-ADPCM input wav file. (robs) + + Internal improvements: + + o Let "make distcheck" run some automated test scripts. + o Distribute missing cmake files. + o Fix ogg vorbis compile error on some platforms. + o Remove unused libltdl that could cause header mismatch with + installed libltdl. + o Fix AMR detection with --disable-shared. (robs) + o Updated configure to support linking to static libraries + on mingw for flac, ogg, and libsamplerate libraries. + o Added example1: simple example of how to develop applications that + use the libSoX effects chain. (robs) + + +sox-14.0.0 2007-09-11 +---------- + + File formats: + + o Added ffmpeg support. (Reuben Thomas) + o FLAC: added seekable decoding; added seek-table generation. (robs) + o Added M3U & PLS playlist formats [FR# 1667341] (Note: SHOUTcast PLS + is only partially supported). (robs) + o Made format readers and writers into individual modules for easier + distribution of differently-licensed code. (Reuben Thomas) + o Added libao support. (Reuben Thomas) + o Added support for ADPCM-encoded PRC files, based on Danny Smith's + rec2wav and sndcmp. (Reuben Thomas) + o Added AMR-NB [FR# 728875] & AMR-WB formats (with external libs). (robs) + o Added LPC-10 support. (Reuben Thomas) + + Effects: + + o Use LADSPA effects (one input, one output). (Reuben Thomas) + o --octave option changed to --plot; can now also use gnuplot to + plot effect transfer function. (robs) + o Added soft-knee companding. (robs) + o Show (with --plot) compand transfer function. (robs) + o Allow e.g. "vol 6dB" (as well as "vol 6 dB"). (robs) + o Changed deemph filter from 1st order to 2nd order for + slightly better accuracy. (robs) + o Add option to silence effect to leave periods of silence + in and only strip out extra silence. (Mark Schreiber) + o synth can now generate any number of channels. (robs) + o mixer can now mixdown to mono any number of channels. (robs) + o Added oops effect (mixer special case). (robs) + o All effects that could only work on mono or stereo audio, now + work with any number of channels. (robs) + o Added WSOLA-based key and tempo effects. (robs) + + Other new features: + + o Show (with -S) if clipping is occurring. (robs) + o Added internet input file support (needs wget). (robs) + o Made it possible to build without sound drivers. (Reuben Thomas) + + Bug fixes: + + o Fix (m)compand transfer function non-linearities; fix compand + drain volume. (robs) + o Fix crash with pan effect. (robs) + o Add missing RM define to Makefiles so installs work. + (Bug# 1666599) (cbagwell) + o Fix I/O performance regression in 13.0.0. (Reuben Thomas) + o Fix .lu, .la read regression in 13.0.0 [Bug# 1715076]. (robs) + o Fix uncompressed NIST/Sphere read regression in v13 [Bug #1736016]. + o Fix displayed times when playing a file and using trim. (robs) + o Fix CDDA sector duration display for non-CDDA sample rates. (robs) + o synth fixes: brown noise; inverted square wave; offset < 0. (robs) + o Fix crash when encoding Vorbis or FLAC: with no comment. (robs) + o Fix effect drain problems: chorus, echo(s), phaser. (robs) + o Fix rabbit responsiveness and memory problems. (Peter Samuelson) + o Fix broken stereo audio when recording using ALSA. (robs) + o Fix OSS driver on big endian machines that was introduced in + last release. + + Internal improvements: + + o Renamed libst to libsox for name recongition and to avoid + duplications with other existing libst libraries. (Reuben Thomas) + o Moved effects to libsfx. (Reuben Thomas) + o Got rid of several hundred compiler warnings. (robs, Reuben Thomas) + o Added basic performance testing of I/O. (Reuben Thomas) + o Effects chain processing now available in libSoX. (robs) + o Added effects-chain buffering for effects that use a window [FR# + 1621695]. (robs) + o Added cmake build files for Win32. (robs) + + +sox-13.0.0 2007-02-11 +---------- + + File formats: + + o Support for .caf, .paf, .fap, .nist, .w64, .nist, Matlab 4.2/5.0 + (Octave 2.0/2.1), .pvf, .sds, .sd2 and .xi file formats via libsndfile. + If available, libsndfile can also be used to handle all the other file + formats it understands. (Reuben Thomas) + o Add FLAC support (robs) + o Support Maxis's XA format. (Dwayne C. Litzenberger) + o Add support for 24-bit PCM raw, wav (WAVE_FORMAT_EXTENSIBLE) [FR# 801015], + au, aiff, & flac files. (robs) + o Add AIFF-C output support. (shashimoto) + o New .ima file format for raw IMA ADPCM. (robs) + o Allow the rate and number of channels of .au files to be overridden + by command-line arguments. (robs) + o Add seek support for GSM data in WAV files. Rafal Maszkowski + o Allow encoding quality to be specified (FLAC & Ogg, but not + MP3 yet). (robs) + o Rename -b to -1, -w to -2, -l to -4, -d to -8, and mask to dither. + (robs) + o New options for specifying endianness (and separate options for + nibble & bit reversal) [FR# 1621702]. (robs) + o Improved multi-channel file reading; fixes [1599990]. (robs) + + Effects: + + o Equalizer effect (Pascal Giard) + o bass and treble altering effects. (robs) + o New optional rabbit resample routine, using libsamplerate + (aka Secret Rabbit Code). (Reuben Thomas) + o Added allpass filter effect. (robs) + o Documented the butterworth filter effects; added variable Q. (robs) + o "rate" effect made an alias for "resample". + o Visualisation of various filters' frequency response via Octave. (robs) + o Can now specify width of many 2nd-order filters as: Hz, octaves, + or Q. (robs) + o Dither/mask amount now specifiable. (robs) + o Consistent (and hopefully complete) clipping detection and + reporting. (robs) + o Allow command-line time parameters of < 1 sec to omit the + leading 0. (robs) + o Improved synth usage and improved the synth entry in the man- + page. (robs) + o Higher quality audio speed adjustment; also fixes [1155364]. (robs) + o Replacement flanger effect; also fixes [1393245]. (robs) + o Added silence padding effect. (robs) + o Added ability for noiseprof to use stdout and noisered to use stdin + [FR# 1621694]. (Reuben Thomas) + o vibro effect name deprecated in favour of tremolo; this effect + reimplemented as a special case of synth. (robs) + + Other new features: + + o Remove soxmix. (Reuben Thomas) + o Preview mode now removed, as all it did was use rate rather than + resample, and rate has been removed. + o -V now gives only user-relevant messages, use -V -V to get + developer-relevant messages. (robs) + o -V output much improved and expanded; now includes display of + (auto-)selected effects. (robs) + o sox man-page overhaul, new soxexam man-page entries. (robs) + o Added command line options for specifying the output file + comment. (robs) + o Added ability to merge e.g. 2 mono files to 1 stereo file + [FR# 1297076]. (robs) + o Removed the restrictions whereby multiple input files had to have + the same data encoding & size, and in most situations where they + had to have the same # of channels, and for play where they had + to have the same sampling-rate. (robs) + o Options to apply replay-gain on input; enabled by default + with `play'. (robs) + o Can now use Ctrl-C to skip to next track when playing multiple + files (e.g. play *.mp3); Ctrl-C twice to exit. (robs) + o Added --interactive option to prompt to overwrite pre-existing + output file. (robs) + o Added large file support. (Reuben Thomas) + + Bug fixes: + + o Fix writing MP3 files on AMD64 processors. + o More fixes to MP3 tag reading. Sometimes tags were + detected as valid MP3 frames. + o Fix to stop, avoiding a crash, when starting of effects fails. + (Reuben Thomas) + o Fixed a bug introduced in 12.18.2 that stopped the draining + of effects from occuring. This had stopped the reverse effect, + among others, from working. (Reuben Thomas) + o Several effects are now optimised out in situations where they need + do nothing, e.g. changing rate from 8000 to 8000, or changing volume + by 0dB [Bug# 1395781]. (robs) + o Fix rounding error when reading command-line time + parameters. (robs) + o Fix nul file hander ignoring other format options if rate + option has not been given. (robs) + o Fix synth length accuracy. (robs) + o Fix broken audio when downmixing with any of the following + effects: synth, deemph, vibro. (robs) + o Fixed deemph & earwax effects to work with MP3, vorbis, + & FLAC. (robs) + o Fix wav file handler discarding the last PCM sample in certain + circumstances. (robs) + o Fix [1627972] AIFF read bug when MARK chunk present. (Richard Fuller) + o Fix [1160154] VOX to WAV conversion problem. (robs) + o Removed (for output file only) the potentially + problematic -v option. Use the vol effect instead. (robs) + o Improved the accuracy of integer and floating point PCM + conversions. (robs) + o Don't go into a loop on zero-padded WAVs. (Jorge Serna) + o Fix to AIFF writing to avoid writing invalid files in some situations. + (Reuben Thomas) + o Fix compander effect bugs: [1613030] Compand fails to compress + clipping, [1181423] compand with 0 sec attack/release. (robs) + + Internal improvements: + + o More and better self-tests. (robs) + o Build system overhaul to use the full set of GNU autotools. + (Reuben Thomas) + o Add new getopt1.c to win32 project file. + o Remove old, optional rate change and alaw/ulaw conversion code. + (Reuben Thomas) + o Removed the old internally invoked (but mentioned in the man page) + copy effect. (robs) + + +sox-12.18.2 2006-09-03 +----------- + + o Adding in Debian's disk full fix (#313206). + o Finally got rid of reference to cleanup() function in + library. Applications are now required to detect + all failures from return codes and cleanup as they + want. + o Changed how list of formats and effects are stored internally. + Effects libst users only. Dirk + o Store effects usage so that its accessable by applications. + Dirk + o Modify the synth effect to not use SIGINT to stop processing + and instead return ST_EOF. This allows exact acount of + samples to be written out instead of an approximate amount. + o Fix hangup when attempting to write stereo MP3 files. + (1512218) Kendrick Shaw + o Fix deemph effect would lose stereo separation. (1479249) robs + o Adding cross-platform support for getopt_long + o Make help screens print much more information and add + new --help-effect option. (Originally from Dirk). + o Add support for using an external gsm library instead of + just the internal one. Vladimir Nadvornik + o Updates to nul file handler to prevent crashes during output. + Martin Panter (1482869) + + +sox-12.18.1 2006-05-07 +------------ + + o The "filter" effect could go into infinite drain mode. Now + only drain 1 buffer. noisered as well. + o SoX was ignoring user aborts (ctrl-c) if it occured during + effect drain operations. This was bad if effects had + bugs and stuck in infinite loop. + o Stop SoX from crashing when file type could not be auto + determined (1417776). + o Output filenames with multiple '.' confused SoX. (1417776) + Christian Hammer + o Moved to a common set of CLIP routines. This fixed clipping + bugs in noisered and mcompand. + o Stop SoX from crashing on sphere files that contain large text + strings. (1430025) Ulf Hamhammar + o Fix some overflow crashes in aiff handler. (1430024) Ulf Hamhammar. + o Under windows, set piped input/output to binary mode (1417794). Martin + Panter + o Fixed broken internal version of strdup(). (1417790) Marty + o Stop infinite loop when reading MP3's with a tag size of + exactly 8192 bytes. (1417511) Hans Fugal + o Fix typo in stlib.dsp for loading in Visual Studio 6. + o Fixed problems in silence effect related to removing multiple + periods of silence from the middle of the sound file. + o Reduced the window size greatly on the silence effect to + prevent leaving in silence that looked like noise still based + on RMS values. + o Prevent infinite loop in pitch effect from uninitialize variable. + Frank Heckenbach + o Prevent crashes when printing error mesages (1447239) + o Added makefile and support files to compile using Open Watcom + compiler. (1417798) Marty + o Stop calling flow() on effects that returned EOF during drain(). Allows + two back-to-back reverse effects to work. + o Added support for multiple channels in .dat files. + (1366634) tomchristie + + +sox-12.17.9 2005-12-05 +----------- + + o Updates to compile under VC6. Jimen Ching + o Declare st_signalinfo_t to specifically be signed in case + platform does not default ot signed chars. This + is required for NetBSD/powerpc. + o When seek()ing in AIFF, SMP, and WAV handlers, remaining samples were + incorrectly computed based on bytes and not samples. Jukka + o Changed noisered effect to just warn during clipping instead + of aborting. Ian Turner + o Fixed bug were pieces of audio were lost every buffer read + when running both -c and -r options together on mono audio. + Users probably percieved it as shorter audio files that + played with a sped up tempo. + Bugfix will also apply to other times when multiple effects + are ran on the command line. + o Added support for -V option to play/rec scripts. + o Fix to silence effect to allow negative periods to be specified + (to remove silence from middle of sound file). + o Fix swap option handling so that special case of "swap 1 1" will + work. + o Track length of Ogg Vorbis files on read. + o Add support for displaying a status line that tracks progress + of read/write routines. Part of information requires read + file handlers to be able to determine file length. + o Converted alsa driver to use asoundlib instead of directly + talking to kernel driver. This also means that device names + are now the ALSA logical names instead of /dev type names. + o Added ALSA support to play/rec scripts. + o Added st_open*, st_read, st_write, st_seek, st_close routines + to help simplify developer interface to libst. See libst.3.. + o Removed st_initformat(), st_copyformat(), and + st_checkformat() from library. If your app used those + functions then copy them from 12.17.8 source code + directly into your application or update to use new + routines. + o Force word-alignment on AIFF SSND and APPL chunks on input. + Matthew Hodgson. + o Add fix to WAV handler to only return data in multiples + of sample_size*channels to better handle corrupt files. + o Fixed bug where "-4" option didn't work with avg + effect (Tom Christie). + o Fixed fade's fade-out-length to match man page + description as noted by Geoff Kuenning. This required + updates to the sample crossfade scripts. Also modified fade + effect to report when no more samples will be produced to + prevent unneeded reading of whole file. + o Allow aborting SoX with SIGTERM, along with previous SIGINT. + Norman Ramsey. + + +sox-12.17.8 2005-08-22 +----------- + + o noisered effect had compile problems with some compilers. + o "-x" option was being ignored since 12.17.7. + o Stuart Brady added support for reading and writing RIFX files (big + endian RIFF/WAV files). Also added support for auto detecting + DEC-style ".sd\0" files. + o Gene Mar found typo in polyphase nuttall calculation. + o SMP buffer overflow (detected by gcc 4.0). Reported by Marcus Meissner + and Matthias Saou. + o Fixed URL in manpage to resample overviews. + o Fixed WAV handler so that it didn't think WAV chunks with max size + were invalid chunks. This allows WAV's to be used in pipes since + they have to default to max size. + o WAV files with alaw or ulaw data don't need extended format chunks. + (Lars Immisch) + o In AIFF files, fixed problem were short comments should cause + AIFF handler to get confused and become misaligned. + + +sox-12.17.7 2004-12-20 +----------- + + o Christian Weisgerber sent patches to man page fixes + and patches for sunaudio driver on openbsd. + o Default volume for soxmix wrongly set to 0 instead + of 1/#_input_files (float rounding error). + o Update to ALSA driver to do a better job of detecting + unsupported sample rate/size/encoding and change to + a supported one. + o Fix bug in alsa writing were last last partial buffer + wasn't being flushed. + o Guentcho Skordev pointed out ogg vorbis files were using + the same value for serial numbers each time. + o Changed sox to only read the exact size of a WAV data chunk + if cooledit IFF LIST chunk is found at the end of the file. + Normally, this isn't done to allow reading > 2gig WAV files. + o Modified configure to detect cygwin compiler after detecting + gcc compiler (fixes some default CFLAGS options). + o Added explicit rule for compile *.o from *.c so that + CPPFLAGS is always referenced. Not all platform's default + rule includes CPPFLAGS (FreeBSD). + o Under linux, add include path to /lib/modules/* so that ALSA + include files can be auto detected. + o Ian Turner added an effect to remove noise from an audio + file by first profiling silent periods of the audio + to determine what the noise is (like background hiss on + cassette tapes). + + +sox-12.17.6 2004-10-13 +----------- + + o Changed comment code to always use copies of strings to + fix bug in WAV handlering freeing argv[] memory. + o Use calloc() to create ft_t structures so that all + memory is initialized before being referenced. + o Fixed VOC EOF bug were it thought there was an extra + block when there wasn't. + o Restructured directory layout so that source code is in + a seperate directory. + o Modified SoX to accept multiple input files. Concatenates + files together in this case. + o Removed map effect so that loops and instr could be removed + from effects structures. This makes effects engine stand + alone from the rest of the sox package. + o Benedikt Zeyen found a bug in synth effect when generating + brown noise that could cause clipping. + o David Leverton sent another patch to prevent crashes on + amd64's when resampling. + o Fixed a bug were MP3 files with large ID3v2 tags could + cause SoX to stick in a loop forever. Now, it will + abort on IDv3 tags larger then 100k. Could still be + improved to handle any size. + o Changed volume option (-v) so that it tracks the file + it was specified. This means that when specified with + the input file, it changes volume before effects engine + and when specified with output file, its done after effects + engine. + o Added crossfade_cat.sh script that will concatenate to + audio files and do a crossfade between them. + o Fixed bug in fade effect were it was impossible to do a + fadeout starting from the beginning of the audio file. + o Removed rounding error when changing volume of audio with + "-v" option. This error caused doing a "-v -1.0" twice + to not result in the original file. + o Fixed a possible overflow in lots of effects were MIN + value was treated as -MAX instead of -MAX-1. + o Modifed sox so its OK for effects to not process any + input or output bytes as long as they return ST_EOF. + o When effects output data and reported ST_EOF at the + same time, that buffer was discarded as well as + data from any chained effect. + o Added patch from Eric Benson that attempts to do a seek() + if the first effect is trim. This greatly speeds up + processing large files. + o Daniel Pouzzner implemented a multi-band compander (using + the butterworth filters to split the audio into bands). + o Donnie Smith updated the silence effect so that its possible + to remove silence from the middle of a sound file by + using a negative value for stop_periods. + o Changed float routines to only work with normalized values + from -1:1. + o Modifed .au handler to be able to read and write 32-bit + and 64-bit float data. Only tested reading so far. + o WAV with GSM data now always pads data to even number of bytes. + o Added support for writing 32-bit audio to AIFF. + + +sox-12.17.5 2004-08-15 +----------- + + o Thomas Klausner sent in patches to compile audio drivers under + NetBSD. + o Rahul Powar pointed out a memory leak in the WAV file handler. + It wasn't calling the correct close() function when closing + input files. + o Modified play.1 man page to not use multiple name lines. This + appears to confuse some conversion programs. Updated sox.1 + man page for typo in reverb option. + o Andrew Church fixed problem with header of stereo 8SVX files. + o Jimen Ching added support to scan over garbage data at the + beginning of MP3 files to find valid frames. This is useful + to play WAV and AIFF files that have MP3 data in them until + those handlers support it directly. To play those, force + sox to use the mp3 handler with the "-t mp3" option. + o Added patch from Ulf Harnhammar to wav handler to prevent + buffer overflows. + o Added patch from Redhat to allow resample to work on certain 64-bit + machines (Sam Varshavchik) + o Tony Seebregts added a file handler for headerless Dialogic/OKI ADPCM + files (VOX files). + o Jan Paul Schmidt added a repeat effect to do loops the brute force way. + This is also good for file format that don't support loops as well. + o Fix for OSS driver in rate tolerance calcs that were off because + of type conversion problems. Guenter Geiger. + o Allow reading sphere files with headers greater then 256 bytes. Jimen + Ching. + o Fix for vorbis were comments are displayed in KEY=value format always. + Stop printing some info to stdout in case output is a pipe. Guenter + Geiger. + o J Robert Ray submitted fix for AIFF handler to ignore lowercase + chunks that are unknown. + o Bugfix for 8-bit voc files. Jimen Ching + o General warning cleanups (cbagwell) + o Memory leaks in reading WAV files (Ufuk Kayserilioglu) + o Rearrange link order of ogg vorbis libraries so that they + can be compiled as static. (Christian Weisgerbr) + + +sox-12.17.4 2003-03-22 +----------- + + o Peter Nyhlen fixed a problem with reading Comments in Ogg Vorbis files. + o Added install target to allow installing libgsm from main Makefile. + Leigh Smith. + o Minor updates to sox.c to free unused memory and close all input + files during failures. + o Pieter Krul added a patch that makes play script look at AUDIODEV + environment variable if it exists to find which device to use. + This allows scripts to work with Solaris SunRays and is a good idea + in general. + o Updated config.sub to detect latest supported OS's. + o Fabrizio Gennari added support for reading and writing + MP3 files using the external libraries libmad and libmp3lame. + o Jens Henrik Goebbert sent in several bugfixes for integer overflows + in the compand effect. + o Dan Dickerman sent in patches for integer overflows in the resample + effect. + o Jimen Ching sent in a fix for multi-channel sound file processing + using the avg effect. + o Richards Bannister added patches to clean up prototypes and filter + private sizes being to small. + o Jimen Ching adds -d option to specify 64bit data size and changed + Ulaw/Alaw encoding to default to 8bit data size if not specified. + o David Singer pointed out that a MS program creates AIFF files + with an invalid length of 0 in its header. Changed SoX to warn the + user but continue instead of aborting since SoX can still read + the file just fine. + o Bert van Leeuwen added a file handler for Psion record.app used + for System/Alarms in some Psion devices. + o Richard Bannister sent in a patch to make writing vorbis files + work with Vorbis 1.0 libraries. + o Fixed configure scripts so that they can be ran with the + --with-oss-dsp, --with-alsa, and --with-sun-audio options. + Was causing compile time problems. Reported by Raul Coronado. + o Change Ogg Vorbis support to use VBR encoding to match defaults + of oggenc based on suggestion from Christian Weisgerber. + o Prints error message now when a channel value of -1 is given. + Reported by Pierre Fortin. + o Fixed bug were memory could be trashed if a input WAV file contained + a comment. Found by Rhys Chard. + o Change command line to compile soxmix.o slightly to try and make + Forte compiler happy. + o Added support for ALSA 0.9 driver. Jimen Ching + + +sox-12.17.3 2001-12-15 +----------- + + o Removed check that prevented pan from being invoked when the + input and output channels were the same. + o Ciaran Anscomb added a flush to sunaudio driver after changing + settings. This is because it can start buffering data as soon + as the device is open and the buffered data can be in a + wrong format. + o trim wasn't accounting for # of channels and was generally broken. + o Jeff Bonggren fixed trim bugs were it was failing when triming + data that equaled to BUFSIZ. Also, trim now immediately returns + ST_EOF when its done instead of requiring an extra call that + returns no data. + o auto effect wasn't rewinding the file if the file was less then + 132 bytes. Changed auto parsing of header to be incremental + instead of reading in a large buffer. + o William Plant pointed out a bad pointer access in fade effect's + parsing of options. + o Ken pointed out a problem were private data was not 8-byte aligned + and causing crashes on most RISC CPU's. Fixed by going back to + old style of declaring private data as type "double" which usually + forces strictest alignment. + o ima_rw was miscompiling on alpha's because of a header ordering + problem. + o Erik de Castro Lopo pointed out that when writing 16-bit VOC files + the headers did not contain the correct length or encoding type. + o Seperated st.h into 2 files. st.h for libst users and st_i.h for + internal use. + o Added new types used extensively by libst: st_sample_t & st_size_t. + This allows for more deterministic behavior on 64-bit machines and + also allows sox to possibly work with much larger file sizes. + o SoX was some times getting confused and thinking an EOF was an + error case when reading audio files. Removed unneeded aborts + when EOF was OK. + o Silence effect was broken on stereo files. Also, made thresholds + relative to original bit percision of audio data. When 16-bit audio + is scaled up to 32-bits, a little bit of noise starts to look like a + large amplitude of noise. Also, now using RMS values to smooth out + clicks. RMS rolling window size is 1/10 of sample rate. + o Changed Floats into a type of encoding instead of a size of audio data. + o Put a flush at the end of OSS driver so that no old data would be + left in internal buffers after changing audio format parameters. + o Fixed problem where play script wasn't installed correctly if you + build from another directory (pointed out by Mike Castle). + o Made GSM support internal to libst (no external library required). + o Change configure script to enable ulaw/alaw lookup tables and GSM + support by default. Also have Makefile's make use of more configure + prefix options to allow for customized installs. + o Reverted ulaw/alaw conversion routines back to Sun's versions. + o Modified raw file handler to write files in the same generic buffered + fashion that was added for reading in 12.17.2. Seems to have + speed up some types of writing. + o Reading Ogg Vorbis files could get confused of when EOF was reached. + o Added uninstall rules to Makefile. Added new ststdint.h to define + *int*_t typedefs. + o Added internal strcasecmp for OS/2. + o Added support for swapping "bit" order (MSB becomes LSB) for raw u-law + and A-law data. Some ISDN equipment prefers it this way. Use -x flag + or new .la or .lu file extensions. + o Annonymous patch submitted to fix types and spelling problems in + various files. Also, updated VOC files to have u-law and A-law + support as well as able to read in VOC files using a pipe. More + examples added to soxexam file. + + +sox-12.17.2 2001-09-15 +----------- + + o Daniel Culbert found and fixed a bug in the polyphase effect + that occurs on platforms that rand() can return large values. + The bug resulted in polyphase resampling an audio file to a + different rate then it said it was. + o Stan Seibert contributed a handler for Ogg Vorbis files. It + handles all input formats but can only save using default + settings. + o Darrick Servis has made major cleanups in the code in regards + to error conditions. Helps people using libst. + o Darrick Servis has added added optional seek functionality sox. + Several formats have been modified to make use of this. + o Geoff Kuenning rewrote the average effect into a general-purpose + parametric mapping from N channels to M channels. + o Geoff Kuenning added an optional delay-time parameter to the compander + effect to allow companding to effectively operate based on future + knowledge. + o Geoff Kuenning Added support to fade and trim effect for specifying time + in hh:mm:ss.frac format. + Fixed a bug that caused integer overflow when large start/stop times + were used. + o Geoff Kuenning updated play/rec/soxeffect scripts to handle all effects + added since 12.17. Spell-checked soxexam.1 file. + o Jimen Ching updated ALSA configure support to auto-detect 4.x or 5.x API + and compile correctly under those two. All other versions are unsupported. + o Merged in the NetBSD package changes into CVS finally. + o Removed broken support for non-ANSI compilers. + o Makefile now places the correct path to SoX in the play/rec scripts + based on configuration script values. + o Alexander Pevzner provided a fix for OSS driver for sound being + dropped under heavy CPU loads. Moved GETBLKSIZE operation + until after setting up the format (SBLive! was modify the block size + after changing formats). + o With help from David Blythe, updated OSS drivers to use newer format + interface. OSS driver will now attempt to detect a valid endian type + to use with sound card. + o Carsten Borchardt pointed out a bug in lowp filter. Added new + nul file handler that reads and writes from/to nothing. + Also added new synth effect that creates sounds using a simple + synthesizer. Created a testcd.sh that uses two new features + to create a test sound CD for testing audio equipment. + o Ben Last added a new program that uses libst and will merge two + seperate audio files into a single file with multiple channels. + This was merged into the standard sox.c file by cbagwell. + o Andreas Menke fixed some problems with the speed effect and + how effects were drained. Also improved the usage of printf()'s + to use stderr. + o Corrected AU header length value when comments were less than + 4 bytes. + o Added support for reading non-standard bit size data from AIFF files. + o Ignore unmatched MARK/INSTR chunks in AIFF files now instead of quiting. + o Fixed ALAW encoding bug in .au files as pointed out by Bruce Forsberg. + o Unified the raw reading functions. Probably slightly faster for + most datatypes but was done to fix recording from the OSS driver. + Control-C stopped working somewhere during the 12.17 series. + o Ford Prefect added a dcshift which can shift the midline amplitude + towards the true center. This will allow for a greater range + of volume adjustments without clipping audio data. + o Heikki Leinonen submitted a silence effect that will trim off + silence from the beginning of a file. cbagwell made some modifications + to trim off front and back as well as some other tweaks. + o Made the "auto" effect the default file handler for input files. + Also have auto handler now use file extensions if it can't figure + it out. + + +sox-12.17.1 2000-11-19 +----------- + + o Andreas Kies fixed a bug were we were not detecting correctly + if an output file was seekable. + o Fixed a bug in the mask effect introduced in 12.17. If the libc + version of rand() returned more then 15-bit values then it would + trash your data. Reported by Friedhel Mehnert. + o Added a new fade in/out effect from Ari Moisio. + o AIFF files now ignore a MARK chunk if the loop type is NoLoop (0). + o Fixed bug were it was impossible to output ADPCM data in wav files. + o Fixed bug were rate had to be specified for sphere files (fix from + Antti Honkela). + o Added small work around to let compile with cygwin's gcc 95.2 + which also now allows to compile with GSM support under windows. + o Removed accessing of sound devices in tests for sound support and + instead just look for needed header files. This allows the sound + support to be detected even if the device is currently busy or when + compiled on a box that doesn't have a sound card but the OS supports + it (which is the enviornment of most distributions creating new + binaries). + o Added support to partially handle AIFC files but only uncompressed + versions. This should allow people to work with raw CD audio data + on Mac OSX and also gives a basis for adding future support for + things like ADPCM processing. + o Added new "earwax" effect from Edward Beingessner. It is meant to + be used for CD audio played through headphones. It will move the + sound stage from left/right to in front of you. + o Trim effect did not compute locations as was documented in the + man pages. Changed effect so that it computed the time the + same way that the fade effect does. + + +sox-12.17 2000-09-08 +--------- + + o Sox can now read and write w98 compatible gsm .wav files, + if compiled properly with libgsm. Thanks go to Stuart + Daines for the gsm-wav patches. + This is new, and relatively untested. See -g format option. + o Sox can now write IMA_ADPCM and ADPCM compressed .wav, + this is new, and relatively untested. See -i and -a format + options in manpage. + o General changes to wav.c for writing additional wav formats. + Reading wave headers: more consistency checks. + Writing wave headers: fixes for w98. + o Speedups to adpcm read routines, new codex versions are + now in ima_rw.c and adpcm.c. + o Speedups for raw.c, especially for gcc with glibc. + o Fixed a segfault problem with ulaw/alaw conversion, where + an out-of-range index into the tables could occur. + o More detailed output from the stat effect. + o Continued rewrite of resample.c, now it is almost as + fast with floating arithmetic as the old (buggy) version + was with 16-bit integer arithmetic. The older version + in sox-12.16 shifted frequencies slightly and was less + accurate. (Stan Brooks) + o Extensive rewrite of polyphas.c, should be faster and use less memory + now. The sox-12.16 polyphase code had some bugs. (Stan Brooks) + o New effect 'filter' which is a high-quality DSP lowpass/ + highpass/bandpass filter using windowed sinc function + methods, like polyphase and resample. (Stan Brooks) + o Jan Paul Schmidt added new low/high/bandpass and bandlimit + filters to sox. They have much better results then the old + versions of low/high/bandpass. The new effects are all + Butterworth filters. + o New data file type supported, -sl or extension .sl for + signed 32-bit integers. Some simplification of the raw.c + source. + o Some test programs and scripts in the test directory, for + making gnuplot plots of frequency response, error-levels + of rate-conversion and filter effects. + o Removed sbdsp code. All modern unixes are support via OSS, + ALSA, or sun audio device interfaces. + o Added AVR handler from Jan Paul Schmidt. + o SoX now waits until the last possible moment before opening + the output file. This will allow all input and effect options + to be parsed for errors and abort before overwriting any file. + o SoX will no longer write to files that exists. This will keep + it from deleting files when a user mistakenly types "sox *.wav". + o Added new compander effect from Nick Bailey. Nice general purpose + filter. + o Under Solaris, SoX now checks hardware ability to play stereo/PCM + and forces output data to match. Sorry, no SunOS support. I don't + have access to one any more. + o Fixed array overrun bug in rate effect as pointed out by Ian + Donaldson. + o Fixed clip24() range as pointed out by Ted Powell. + o Fixed possible segfault in echos effect, as pointed out by Zinx + Verituse. + o Moved most documentation to new "soxexam.1" manual page so that + all users on a unix system will have access to important information. + This means no more TIPS, CHEATS, or CHEATS.eft files. + o Richard Kent fixed a byte alignment problem in aiff comment code. + o Loring Holden added support to create missing directories on install + and support for installs from outside the source directory. + o Fabien COELHO added a pan and volume effect. + o Fabien COELHO added a speed effect to sox (like speeding up a tape + machine). Also added pitch which changes pitch without effecting + duration and stretch which stretch time without effecting pitch. + o Leigh Smith updated aiff support to use the COMT check when writing + comments instead of the ANNO. It is the prefered method from Apple + and newer programs are starting to require it. Also fixed some bugs + in how we compute the length of various chunks in output files. + o Changed the default block alignement for IMA ADPCM WAV files to use + 256 which is what windows programs use. Badly written readers expect + 256. + o Matthias Nutt helped add support for specifying multiple effects + to SoX on the command line. + o Curt Zirzow added a trim effect to trim off audio data. + o Updated ALSA driver to support new interface. Jimen Ching + + +sox-12.16 1999-07-13 +--------- + + o Changed raw data functions to perform I/O operations using block reads. + Should improve speeds greatly, especially when filesize is in megs. + Got code ready to tweak speed more which also forced me to clean up + Endian test code. + o Fixed a bug in .au's handling of G.723. It wasn't using the correct + number of bits. Added A-law support to .au. + o Quoted $filename in play/rec scripts so that files with spaces in + their names can be given. + o Old OS/2 support didn't work. Replaced with known working EMX + GCC compatible code. + o ADPCM WAV files were defaulting to 8-bit outputs and thus losing + some persision. Now defaults to 16-bit signed uncompressed data. + o Fixed a couple cross-platform compiler issues. + o Jimen Ching has added support for "configure" in to SOX. Finally, + a good solution to cross-platform compiling! + o Jimen Ching has added native support for the ALSA driver to play + and record audio from. (jching@flex.com) + o Minor correction for -r example in manual page. + o Renamed sox.sh to soxeffect and rewrote. Symbolic links can be made + from this file to the name of a sox effect. It will then run that + effect on STDIN and output the results to STDOUT. + o Fixed up some makefiles and 16-bit support from patches sent by + Mark Morgan Lloyd (markMLl.in@telemetry.co.uk). Also added some + nice DOS test bat files from him as well. + o Cleaned up some more cross-platform compile problems. In the process + got it working with Turbo C again, kinda. It still locks DOS up at times. + o Made AIFF handler work with invalid headers that some programs generate. + Also fix an Endian bug thats been there for quite a long time (when + ran on Intel machines). Made comment lengths even length to make + most MacOS programs happy. cbagwell + o Resample function was updated by Andreas Wilde + (andreas@eakaw2.et.tu-dresden.de) to fix problem were freqs. were + off by a factor of 2. + o Added an effect that swaps stereo channels. cbagwell + o Combined play and rec scripts to a single program to ease mantaince. + Also added GNU style long-options (--help). Careful, some options have + change (but more logical). + o Fixed a very old silly bug were low/high/bandpass filters would + add some trash data to the end of the sound file. + o "avg" effect wouldn't give error message when you tried to average + x number of channels in to the same number of channels. + o Fixed core dump when writting AIFF files with no comments. + (Olaf Pueschel) + + +sox-12.15 1998-10-01 +--------- + + o Juergen Mueller moved Sox forward quite a bit by adding all the + most commonly known "Guitar Effects". He enhanced echo support, + added chorus, flanger, and reverb effects. He also wrote a very + handy CHEAT.eft file for using various effects. + o Incorporated Yamaha TX-16W sampler file support provided by + Rob Talley (rob@aii.com) and Mark Lakata (lakata@physics.berkeley.edu). + o Fixed a small bug in hcom compression, dependent on sign + extension. Leigh Smith (leigh@psychokiller.dialix.oz.au). + o sox -h now prints out the file formats and effects supported. + Leigh Smith and Chris Bagwell. + o smp transfers comments more completely. Leigh Smith. + o aiff manages markers and loops correctly and produces more + verbose output. Leigh Smith. + o Added polyphase resampler (kb@ece.cmu.edu). This adds a slightly + different resampling algorithm to the mix. + o Michael Brown (mjb@pootle.demon.co.uk) sent a patch to stop crashes + from happening when reading mono MS ADPCM files. + o Fabrice Bellard has added a less buggy 'rate' conversion. I've left + the old rate code included but if all goes well this will become + the new 'rate'. Please test and let me know how it works. Resample + effect needs to be reworked now. + o Heiko Eissfeldt: Implemented a simple deemphasis effect for + certain audio cd samples. + o Matija Nalis (mnalis@public.srce.hr) sent a patch to fix volume adjustment + (-v) option of sox. + o Fixed typo in optimazation flag in unix makefile, as pointed out by + Manoj Kasichainula (manojk@io.com). + o Fixed missing ';;' in play script. cbagwell + o Fixed bug in determining length of IMA and MS ADPCM WAVE files. cbagwell + o Fixed bug in how stereo effects were drained which fixed the + "reverse" effect from only saving half of stereo files. cbagwell + o Can use "-e" without an effect again. + o Added -g and -a options for new style support of GSM and ADPCM. Added + error checking to various formats to avoid allowing these types. + + +sox-12.14 1998-05-15 +--------- + + o Bumped major version number up and shortened name. The shorter name + should help the various distributions using this package. + o Added support for MS ADPCM and IMA (or DVI) ADPCM for .wav files. + Thanks to Mark Podlipec's xanim for this code (podlipec@ici.net). + o Change Lance Norskog's email address to thinman@meer.net. The old + one was bouncing. + o Added path string to play and rec strings so that it could be run by + users without complete paths setup (i.e. Ran by "rc" files during bootup + or shutdown) + o Fixed -e option from Richard Guenther + (richard.guenther@student.uni-tuebingen.de) and fixed a small bug + in stat. + o Fixed a bug in the mask effect for ULAW/ALAW files. + o Fixed a bug in cdr output files that appended trash to end of file. + o Guenter Geiger (geiger@iem.mhsg.ac.at) made a rather large patch to + allow sox to work on 64-bit alphas. It was done the easiest meathod + by changing all long declarations to use a macro that knows to + make it 32-bits. Want to port to another 64-bit-but-not-alpha + machine? Grep for "alpha" to see changes. There are most likely + several bugs left for alphas. Guenter is also supporting this + package for the Debian distribution. + o Did some major code cleanups to clear out some warning messages + during compile. This is to clear up problems I'm finding under + both alpha and dos. Some warning messages are actually useful + now (pointing out possible data loss). Hopefully, I didn't + break anything. + o Code clean up allows me to finally compile code under Turbo C + again. Too bad the EXE gets a currupted stack somewhere and locks + up the system. Anyone want to try it with Borland C for me? + If you get a working EXE I would like to start distributing a DOS + package like there used to be. + o Speaking of cleanups, anyone want to help cleanup the makefiles for + various platforms? They are quite outdated right now and it is + very obvious that Sox hasn't been able to compile under all the + platforms it once did for several releases. Please send in + the cleaned-up makefile versions along with what programs you + used to compile it with. + o There is a known bug in hcom's compress() function. It is allocating + memory that can't be free'd under some OS's. It causes a core dump. + + +sox-11gamma-cb3 1997-03-28 +--------------- + +This release of sox is mainly a bugfix release. The following things +have changed: + + o Documentation has been updated when it was obviously wrong. + Much more work could be done. Man pages were updated to + work correctly on Solaris and add some missing info. + o Several people sent me patches to fix compiling on Solaris + as well as fix a few bugs. + o Change USS driver's name to OSS. Man, does that driver + like to change names! This could cause problems if you + have made your own custom play and rec scripts. + o Updated my email address. Sorry if I haven't responded to + any emails as I no longer have access to my old address. + Please use cbagwell@sprynet.com. + o Fixed unix test scripts so that they worked again. + o Fixed endian bug in psion .wve code. + o Replaced outdated voc info file with detailed format info + inside voc code. + o Added new sound format, cvsd (Continuously Variable Slope Delta) + from Thomas Sailer (sailer@ife.ee.ethz.ch). + + +sox-11gamma-cb2 1996-10-04 +--------------- + +This release of sox is based on the latest gamma version released +plus some patches I've made to support the following new features: + +I would like to thank everyone that wrote me about the long +standing bug in Sox that could DELETE your /dev/* file if the +program was aborted for reason such as invalid audio file. Special +thanks for Bryan Franklin for sending in a patch when I was +to busy to even look for it. + + o Better play support for 8-bit stereo voc files. New support + for outputing both 8-bit and 16-bit stereo voc files. + o Built-in support for playing and recording from Linux /dev/dsp. + This is a re-write and seperate module from the previous + support included inside the sbdsp module. Also fixes a buffer + size bug that showed up when using newer versions of OSS. + This driver will work with OSS (and older versions called USS, TASD + and Voxware). + o Support for audio playing and recording with SunOS /dev/audio. + o Fixes a bug were /dev/audio or /dev/dsp could be deleted + when playing an invalid format audio file. + o Expanded options for play and rec scripts. You can now specify + sox effects after the filename and hear them in real time. + Please be sure that an older version of sox is not in your path + because these script will possibly find it first and + incorrectly use it. + o Setting play/record volume still requires an external program. + If you have one a command line program to do this (such as + "mixer" for Linux) then you will want to edit the play and rec + to use this. The current support for it is only in example + form of how it can be done. + + +List of earlier SoX Contributors +-------------------------------- +Covering the time from its creation (Jul '91) until sox-11gamma (Feb '95): + + o Lance Norskog thinman at netcom.com + Creator & maintenance + o Guido Van Rossum guido at cwi.nl + AU, AIFF, AUTO, HCOM, reverse, many bug fixes + o Jef Poskanzer jef at well.sf.ca.us + original code for u-law and delay line + o Bill Neisius bill%solaria at hac2arpa.hac.com + DOS port, 8SVX, Sounder, Soundtool formats + Apollo fixes, stat with auto-picker + o Rick Richardson rick at digibd.com + WAV and SB driver handlers, fixes + o David Champion dgc3 at midway.uchicago.edu + Amiga port + o Pace Willisson pace at blitz.com + Fixes for ESIX + o Leigh Smith leigh at psychok.dialix.oz.au + SMP and comment movement support. + o David Sanderson dws at ssec.wisc.edu + AIX3.1 fixes + o Glenn Lewis glewis at pcocd2.intel.com + AIFF chunking fixes + o Brian Campbell brianc at quantum.qnx.com + QNX port and 16-bit fixes + o Chris Adams gt8741 at prism.gatech.edu + DOS port fixes + o John Kohl jtkohl at kolvir.elcr.ca.us + BSD386 port, VOC stereo support + o Ken Kubo ken at hmcvax.claremont.edu + VMS port, VOC stereo support + o Frank Gadegast phade at cs.tu-berlin.de + Microsoft C 7.0 & C Borland 3.0 ports + o David Elliot dce at scmc.sony.com + CD-R format support + o David Sears dns at essnj3.essnjay.com + Linux support + o Tom Littlejohn tlit at seq1.loc.gov + Raw textual data + o Boisy G. Pitre boisy at microware.com + OS9 port + o Sun Microsystems, Guido Van Rossum + CCITT G.711, G.721, G.723 implementation + o Graeme Gill graeme at labtam.labtam.oz.au + A-LAW format, Good .WAV handling, avg channel expansion + o Allen Grider grider at hfsi.hfsi.com + VOC stereo mode, WAV file handling + o Michel Fingerhut Michel.Fingerhut at ircam.fr + Upgrade 'sf' format to current IRCAM format. Float file support. + o Chris Knight + Achimedes Acorn support + o Richard Caley R.Caley at ed.ac.uk + Psion WVE handler + o Lutz Vieweg lkv at mania.RoBIN.de + MAUD (Amiga) file handler + o Tim Gardner timg at tpi.com + Windows NT port for V7 + o Jimen Ching jiching at wiliki.eng.hawaii.edu + Libst porting bugs + o Lauren Weinstein lauren at vortex.com + DOS porting, scripts, professional use diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/ChangeLog.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/ChangeLog.txt.meta new file mode 100644 index 0000000..c83d2fd --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/ChangeLog.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd048c00c1786594dafd4f1835ca2a4c +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/LICENSE.GPL.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/LICENSE.GPL.txt new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/LICENSE.GPL.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/LICENSE.GPL.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/LICENSE.GPL.txt.meta new file mode 100644 index 0000000..3d6595f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/LICENSE.GPL.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b08b947443d7534da1f20b8e03c0f8e +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.txt new file mode 100644 index 0000000..d50f332 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.txt @@ -0,0 +1,196 @@ + SoX: Sound eXchange + =================== + +SoX (Sound eXchange) is the Swiss Army knife of sound processing tools: it +can convert sound files between many different file formats & audio devices, +and can apply many sound effects & transformations, as well as doing basic +analysis and providing input to more capable analysis and plotting tools. + +SoX is licensed under the GNU GPL and GNU LGPL. To be precise, the 'sox' +and 'soxi' programs are distributed under the GPL, while the library +'libsox' (in which most of SoX's functionality resides) is dual-licensed. +Note that some optional components of libsox are GPL only: if you use these, +you must use libsox under the GPL. See INSTALL for the list of optional +components and their licences. + +If this distribution is of source code (as opposed to pre-built binaries), +then you will need to compile and install SoX as described in the 'INSTALL' +file. + +Changes between this release and previous releases of SoX can be found in +the 'ChangeLog' file; a summary of the file formats and effects supported in +this release can be found below. Detailed documentation for using SoX can +be found in the distributed 'man' pages: + + o sox(1) + o soxi(1) + o soxformat(7) + o libsox(3) + +or in plain text or PDF files for those systems without man. + +The majority of SoX features and fixes are contributed by SoX users - thank +you very much for making SoX a success! There are several new features +wanted for SoX, listed on the feature request tracker at the SoX project +home-page: + + http://sourceforge.net/projects/sox + +users are encouraged to implement them! + +Please submit bug reports, new feature requests, and patches to the relevant +tracker at the above address, or by email: + + mailto:sox-devel@lists.sourceforge.net + +Also accessible via the project home-page is the SoX users' discussion +mailing list which you can join to discuss all matters SoX with other SoX +users; the mail address for this list is: + + mailto:sox-users@lists.sourceforge.net + +The current release handles the following audio file formats: + + + o Raw files in various binary formats + o Raw textual data + o Amiga 8svx files + o Apple/SGI AIFF files + o SUN .au files + o PCM, u-law, A-law + o G7xx ADPCM files (read only) + o mutant DEC .au files + o NeXT .snd files + o AVR files + o CDDA (Compact Disc Digital Audio format) + o CVS and VMS files (continuous variable slope) + o Grandstream ring-tone files + o GSM files + o HTK files + o LPC-10 files + o Macintosh HCOM files + o Amiga MAUD files + o AMR-WB & AMR-NB (with optional libamrwb & libamrnb libraries) + o MP2/MP3 (with optional libmad, libtwolame and libmp3lame libraries) + o Opus files (read only; with optional Opus libraries) + + o Ogg Vorbis files (with optional Ogg Vorbis libraries) + o FLAC files (with optional libFLAC) + o IRCAM SoundFile files + o NIST SPHERE files + o Turtle beach SampleVision files + o Sounder & Soundtool (DOS) files + o Yamaha TX-16W sampler files + o SoundBlaster .VOC files + o Dialogic/OKI ADPCM files (.VOX) + o Microsoft .WAV files + o PCM, floating point + o u-law, A-law, MS ADPCM, IMA (DMI) ADPCM + o GSM + o RIFX (big endian) + o WavPack files (with optional libwavpack library) + o Psion (palmtop) A-law WVE files and Record voice notes + o Maxis XA Audio files + o EA ADPCM (read support only, for now) + o Pseudo formats that allow direct playing/recording from most audio devices + o The "null" pseudo-file that reads and writes from/to nowhere + + +The audio effects/tools included in this release are as follows: + + o Tone/filter effects + o allpass: RBJ all-pass biquad IIR filter + o bandpass: RBJ band-pass biquad IIR filter + o bandreject: RBJ band-reject biquad IIR filter + o band: SPKit resonator band-pass IIR filter + o bass: Tone control: RBJ shelving biquad IIR filter + o equalizer: RBJ peaking equalisation biquad IIR filter + o firfit+: FFT convolution FIR filter using given freq. response (W.I.P.) + o highpass: High-pass filter: Single pole or RBJ biquad IIR + o hilbert: Hilbert transform filter (90 degrees phase shift) + o lowpass: Low-pass filter: single pole or RBJ biquad IIR + o sinc: Sinc-windowed low/high-pass/band-pass/reject FIR + o treble: Tone control: RBJ shelving biquad IIR filter + + o Production effects + o chorus: Make a single instrument sound like many + o delay: Delay one or more channels + o echo: Add an echo + o echos: Add a sequence of echos + o flanger: Stereo flanger + o overdrive: Non-linear distortion + o phaser: Phase shifter + o repeat: Loop the audio a number of times + o reverb: Add reverberation + o reverse: Reverse the audio (to search for Satanic messages ;-) + o tremolo: Sinusoidal volume modulation + + o Volume/level effects + o compand: Signal level compression/expansion/limiting + o contrast: Phase contrast volume enhancement + o dcshift: Apply or remove DC offset + o fade: Apply a fade-in and/or fade-out to the audio + o gain: Apply gain or attenuation; normalise/equalise/balance/headroom + o loudness: Gain control with ISO 226 loudness compensation + o mcompand: Multi-band compression/expansion/limiting + o norm: Normalise to 0dB (or other) + o vol: Adjust audio volume + + o Editing effects + o pad: Pad (usually) the ends of the audio with silence + o silence: Remove portions of silence from the audio + o splice: Perform the equivalent of a cross-faded tape splice + o trim: Cuts portions out of the audio + o vad: Voice activity detector + + o Mixing effects + o channels: Auto mix or duplicate to change number of channels + o divide+: Divide sample values by those in the 1st channel (W.I.P.) + o remix: Produce arbitrarily mixed output channels + o swap: Swap pairs of channels + + o Pitch/tempo effects + o bend: Bend pitch at given times without changing tempo + o pitch: Adjust pitch (= key) without changing tempo + o speed: Adjust pitch & tempo together + o stretch: Adjust tempo without changing pitch (simple alg.) + o tempo: Adjust tempo without changing pitch (WSOLA alg.) + + o Mastering effects + o dither: Add dither noise to increase quantisation SNR + o rate: Change audio sampling rate + + o Specialised filters/mixers + o deemph: ISO 908 CD de-emphasis (shelving) IIR filter + o earwax: Process CD audio to best effect for headphone use + o noisered: Filter out noise from the audio + o oops: Out Of Phase Stereo (or `Karaoke') effect + o riaa: RIAA vinyl playback equalisation + + o Analysis `effects' + o noiseprof: Produce a DFT profile of the audio (use with noisered) + o spectrogram: graph signal level vs. frequency & time (needs `libpng') + o stat: Enumerate audio peak & RMS levels, approx. freq., etc. + o stats: Multichannel aware `stat' + + o Miscellaneous effects + o ladspa: Apply LADSPA plug-in effects e.g. CMT (Computer Music Toolkit) + o synth: Synthesise/modulate audio tones or noise signals + o newfile: Create a new output file when an effects chain ends. + o restart: Restart 1st effects chain when multiple chains exist. + + o Low-level signal processing effects + o biquad: 2nd-order IIR filter using externally provided coefficients + o downsample: Reduce sample rate by discarding samples + o fir: FFT convolution FIR filter using externally provided coefficients + o upsample: Increase sample rate by zero stuffing + + + Experimental or incomplete effect; may change in future. + +Multiple audio files can be combined (and then further processed with +effects) using any one of the following combiner methods: + + o concatenate + o mix + o merge: E.g. two mono files to one stereo file + o sequence: For playing multiple audio files/streams diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.txt.meta new file mode 100644 index 0000000..32c4e0a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f574d76410a043b488a62ea227f5d239 +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.win32.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.win32.txt new file mode 100644 index 0000000..0ed7815 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.win32.txt @@ -0,0 +1,167 @@ +SoX +--- + +This file contains information specific to the Win32 version of SoX. +Please refer to the README file for general information. + +The binary SOX.EXE can be installed anywhere you desire. The only +restriction is that the included ZLIB1..DLL and LIBGOMP-1.DLL must be +located in the same directory as SOX.EXE or somewhere within your PATH. + +SoX Helper Applications +----------------------- + +SoX also includes support for SOXI.EXE, PLAY.EXE and REC.EXE and their +behaviors are documented in included PDF's. They have the same +install restrictions as SOX.EXE. + +SOXI.EXE, PLAY.EXE, and REC.EXE are not distributed with this package to +reduce size requirements. They are, in fact, only copies of the original +SOX.EXE binary which changes SOX.EXE's behavior based on the +executable's filename. + +If you wish to make use of these utils then you can create them +yourself. + +copy sox.exe soxi.exe +copy sox.exe play.exe +copy sox.exe rec.exe + +If you are concerned with disk space, the play and record +functionality can be equated using the "-d" option with SOX.EXE. soxi +functionality can be equated using the "--info" option with SOX.EXE. The +rough syntax is: + +play: sox [input files and options] -d [effects] +rec: sox -d [output file and options] [effects] +soxi: sox --info [input files and options] + +Acknowledgements +---------------- + +SOX.EXE included in this package makes use of the following projects. +See the cygbuild script included with the source code package for +further information on how it was compiled and packaged. + + SoX - http://sox.sourceforge.net + + FLAC - http://flac.sourceforge.net + + LADSPA - http://www.ladspa.org + + libid3tag - http://www.underbit.com/products/mad + + libsndfile - http://www.mega-nerd.com/libsndfile + + Ogg Vorbis - http://www.vorbis.com + + PNG - http://www.libpng.org/pub/png + + WavPack - http://www.wavpack.com + + wget - http://www.gnu.org/software/wget + +Enjoy, +The SoX Development Team + +Appendix - wget Support +----------------------- + +SoX can make use of the wget command line utility to load files over +the internet. A binary copy of wget has been included with this +package of SoX for your convience. + +For SoX to make use of wget, it must be located either in your PATH or +within the same directory that SoX is ran from. + +Custom configuration of wget can be made by editing the file wget.ini +contained in the same directory as wget.exe. + +Please consult wget's homepage for access to source code as well as +further instructions on configuring. + +http://www.gnu.org/software/wget + +Appendix - MP3 Support +---------------------- + +SoX contains support for reading and writing MP3 files but does not ship +with the DLL's that perform decoding and encoding of MP3 data because +of patent restrictions. For further details, refer to: + +http://en.wikipedia.org/wiki/MP3#Licensing_and_patent_issues + +MP3 support can be enabled by placing Lame encoding DLL and/or +MAD decoding DLL into the same directory as SOX.EXE. These +can be compiled yourself, they may turn up on searches of the internet +or may be included with other MP3 applications already installed +on your system. For encoding/writing, try searching for lame-enc.dll, +libmp3lame-0.dll, libmp3lame.dll, or cygmp3lame-0.dll. For +decoding/reading, try searching for libmad-0.dll, libmad.dll or cygmad-0.dll. + +Instructions are included here for using MSYS to create the DLL's. +It is assumed you already have MSYS installed on your system +with a working gcc compiler. The commands are ran from MSYS +bash shell. + +Obtain the latest Lame and MAD source code from approprate locations. + +Lame MP3 encoder http://lame.sourceforge.net +MAD MP3 decoder http://www.underbit.com/products/mad + +cd lame-398-2 +./configure --disabled-static --enable-shared +make +cp libmp3lame/.libs/libmp3lame-0.dll /path/to/sox + +MAD libraries up to 0.15.1b have a bug in configure that will not allow +building DLL under mingw. This can be resolved by adding LDFLAGS +to configure and editing the generated Makefile to remove an invalid +option. + +cd libmad-0.15.1b +./configure --enable-shared --disable-static LDFLAGS="-no-undefined" +[edit Makefile, search for "-fforce-mem" and delete it.] +make +cp libmad-0.dll /path/to/sox/ + +Appendix - AMR-NB/AMR-WB Support +-------------------------------- + +SoX contains support for reading and writing AMR-NB and AMR-WB files but +does not ship with the DLL's that perform decoding and encoding of AMR +data because of patent restrictions. + +AMR-NB/AMR-WB support can be enabled by placing required DLL's +into the same directory as SOX.EXE. These can be compiled yourself, +they may turn up on searches of the internet or may be included with other +MP3 applications already installed on your system. For AMR-NB support, +try searching for libamrnb-3.dll, libopencore-amrnb-0.dll, or +libopencore-amrnb.dll. For AMR-WB support, try searching for libamrwb-3.dll, +libopencore-amrwb-0.dll, or libopencore-amrwb.dll. + +Instructions are included here for using MSYS to create the DLL's. +It is assumed you already have MSYS installed on your system with +working gcc compiler. These commands are ran from MSYS bash shell. + +Obtain the latest amrnb and amrwb source code from +http://sourceforge.net/projects/opencore-amr . + +cd opencore-amr-0.1.2 +./configure --enable-shared --disable-static LDFLAGS="-no-undefined" +make +cp amrnb/.libs/libopencore-amrnb-0.dll /path/to/sox +cp amrwb/.libs/libopencore-amrwb-0.dll /path/to/sox + +Appendix - LADSPA Plugins +------------------------- + +SoX has built in support for LADSPA Plugins. These plugins are +mostly built for Linux but some are available for Windows. +The Audacity GUI application has a page that points to a collection +of Windows LADSPA plugins. + +http://audacity.sourceforge.net/download/plugins + +SoX will search for these plugins based on LADSPA_PATH +enviornment variable. See sox.txt for further information. diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.win32.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.win32.txt.meta new file mode 100644 index 0000000..14b9e21 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/README.win32.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad876da50a1320144aa8f61ab2c66920 +timeCreated: 1548365886 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/batch-example.bat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/batch-example.bat new file mode 100644 index 0000000..65d8876 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/batch-example.bat @@ -0,0 +1,14 @@ +rem Example of how to do batch processing with SoX on MS-Windows. +rem +rem Place this file in the same folder as sox.exe (& rename it as appropriate). +rem You can then drag and drop a selection of files onto the batch file (or +rem onto a `short-cut' to it). +rem +rem In this example, the converted files end up in a folder called `converted', +rem but this, of course, can be changed, as can the parameters to the sox +rem command. + +cd %~dp0 +mkdir converted +FOR %%A IN (%*) DO sox %%A "converted/%%~nxA" rate -v 44100 +pause diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/batch-example.bat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/batch-example.bat.meta new file mode 100644 index 0000000..017a2a4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/batch-example.bat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0c1776a1ad8d5ab46a11f693a9d9d7b5 +timeCreated: 1548365885 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libflac-8.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libflac-8.dll new file mode 100644 index 0000000..d124323 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libflac-8.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libflac-8.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libflac-8.dll.meta new file mode 100644 index 0000000..2879b23 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libflac-8.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: d3153176bb7f5d847bdf1f0915a8d3de +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgcc_s_sjlj-1.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgcc_s_sjlj-1.dll new file mode 100644 index 0000000..358b42e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgcc_s_sjlj-1.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgcc_s_sjlj-1.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgcc_s_sjlj-1.dll.meta new file mode 100644 index 0000000..d9031e5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgcc_s_sjlj-1.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 3b2af1a0b3defbe4a8936935bdcb0366 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgomp-1.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgomp-1.dll new file mode 100644 index 0000000..6a2c790 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgomp-1.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgomp-1.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgomp-1.dll.meta new file mode 100644 index 0000000..28b2ac5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libgomp-1.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 82e279ebe272e1f4ca10455b36377769 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libid3tag-0.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libid3tag-0.dll new file mode 100644 index 0000000..b295539 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libid3tag-0.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libid3tag-0.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libid3tag-0.dll.meta new file mode 100644 index 0000000..81cc273 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libid3tag-0.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 3476e70fbd69ff74cbc8e06e597ea539 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmad-0.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmad-0.dll new file mode 100644 index 0000000..0fd0049 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmad-0.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmad-0.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmad-0.dll.meta new file mode 100644 index 0000000..63aad21 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmad-0.dll.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: 60054fd3786524f48b09d50f5035bf8b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmp3lame-0.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmp3lame-0.dll new file mode 100644 index 0000000..289b3d5 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmp3lame-0.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmp3lame-0.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmp3lame-0.dll.meta new file mode 100644 index 0000000..2aff472 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libmp3lame-0.dll.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: f26e3d27860cc2b40a553f2492ebc187 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libogg-0.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libogg-0.dll new file mode 100644 index 0000000..3eb7ece Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libogg-0.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libogg-0.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libogg-0.dll.meta new file mode 100644 index 0000000..1d3a6c5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libogg-0.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: dd4687db5d302f94c9ddc0a9acafbe5c +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libpng16-16.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libpng16-16.dll new file mode 100644 index 0000000..e1c18e9 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libpng16-16.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libpng16-16.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libpng16-16.dll.meta new file mode 100644 index 0000000..312b70a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libpng16-16.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 1f0c2ee991bd28e4c85228b872444b26 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libsox-3.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libsox-3.dll new file mode 100644 index 0000000..265c115 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libsox-3.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libsox-3.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libsox-3.dll.meta new file mode 100644 index 0000000..b76dc96 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libsox-3.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 1e22a13358886c4499f6a61155129a92 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libssp-0.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libssp-0.dll new file mode 100644 index 0000000..7a87258 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libssp-0.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libssp-0.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libssp-0.dll.meta new file mode 100644 index 0000000..953eb28 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libssp-0.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: bfaeb44f6c981d24f8f53fa7d83d8356 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbis-0.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbis-0.dll new file mode 100644 index 0000000..bd1e1d5 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbis-0.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbis-0.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbis-0.dll.meta new file mode 100644 index 0000000..d185105 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbis-0.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 0f84edee013f04146948143683b8a62c +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisenc-2.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisenc-2.dll new file mode 100644 index 0000000..a5bb208 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisenc-2.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisenc-2.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisenc-2.dll.meta new file mode 100644 index 0000000..7fa9e32 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisenc-2.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 3916f1fff2b5d5c4cb4464555c3a6540 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisfile-3.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisfile-3.dll new file mode 100644 index 0000000..6a0d386 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisfile-3.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisfile-3.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisfile-3.dll.meta new file mode 100644 index 0000000..77574a7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libvorbisfile-3.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: a2cf91f216fe055458ad480e8b36b0a7 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwavpack-1.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwavpack-1.dll new file mode 100644 index 0000000..0b1fbe8 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwavpack-1.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwavpack-1.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwavpack-1.dll.meta new file mode 100644 index 0000000..51df690 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwavpack-1.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: e58d3dce0fa5d394e8dcbbfed7475f73 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwinpthread-1.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwinpthread-1.dll new file mode 100644 index 0000000..7bc670c Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwinpthread-1.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwinpthread-1.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwinpthread-1.dll.meta new file mode 100644 index 0000000..7e173d5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/libwinpthread-1.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 9369d402f63c05341adef0c4766b7fc1 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.exe b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.exe new file mode 100644 index 0000000..350561b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.exe differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.exe.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.exe.meta new file mode 100644 index 0000000..517ec99 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.exe.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aedc3c784fbe940419abb36ef335faa8 +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.pdf b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.pdf new file mode 100644 index 0000000..5457b9a Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.pdf differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.pdf.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.pdf.meta new file mode 100644 index 0000000..915af2c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/sox.pdf.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1980b2879aff59444800fbd25b2c7658 +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxformat.pdf b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxformat.pdf new file mode 100644 index 0000000..85ab02e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxformat.pdf differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxformat.pdf.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxformat.pdf.meta new file mode 100644 index 0000000..ee5457e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxformat.pdf.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e0932a9ec4dcc234b8e136788bd9a0ce +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxi.pdf b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxi.pdf new file mode 100644 index 0000000..82b07f1 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxi.pdf differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxi.pdf.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxi.pdf.meta new file mode 100644 index 0000000..61feafa --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/soxi.pdf.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 366dbca5d60856d408fd29ff5d935843 +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.exe b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.exe new file mode 100644 index 0000000..f2a11c1 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.exe differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.exe.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.exe.meta new file mode 100644 index 0000000..fc6e152 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.exe.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2fd1121db3bf29640a76d9e0fd6b1054 +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.ini b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.ini new file mode 100644 index 0000000..7aeacc7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.ini @@ -0,0 +1,112 @@ +### +### Sample Wget initialization file .wgetrc +### + +## You can use this file to change the default behaviour of wget or to +## avoid having to type many many command-line options. This file does +## not contain a comprehensive list of commands -- look at the manual +## to find out what you can put into this file. +## +## Wget initialization file can reside in /usr/local/etc/wgetrc +## (global, for all users) or $HOME/.wgetrc (for a single user). +## +## To use the settings in this file, you will have to uncomment them, +## as well as change them, in most cases, as the values on the +## commented-out lines are the default values (e.g. "off"). + + +## +## Global settings (useful for setting up in /usr/local/etc/wgetrc). +## Think well before you change them, since they may reduce wget's +## functionality, and make it behave contrary to the documentation: +## + +# You can set retrieve quota for beginners by specifying a value +# optionally followed by 'K' (kilobytes) or 'M' (megabytes). The +# default quota is unlimited. +#quota = inf + +# You can lower (or raise) the default number of retries when +# downloading a file (default is 20). +#tries = 20 + +# Lowering the maximum depth of the recursive retrieval is handy to +# prevent newbies from going too "deep" when they unwittingly start +# the recursive retrieval. The default is 5. +#reclevel = 5 + +# By default Wget uses "passive FTP" transfer where the client +# initiates the data connection to the server rather than the other +# way around. That is required on systems behind NAT where the client +# computer cannot be easily reached from the Internet. However, some +# firewalls software explicitly supports active FTP and in fact has +# problems supporting passive transfer. If you are in such +# environment, use "passive_ftp = off" to revert to active FTP. +#passive_ftp = off + +# The "wait" command below makes Wget wait between every connection. +# If, instead, you want Wget to wait only between retries of failed +# downloads, set waitretry to maximum number of seconds to wait (Wget +# will use "linear backoff", waiting 1 second after the first failure +# on a file, 2 seconds after the second failure, etc. up to this max). +waitretry = 10 + + +## +## Local settings (for a user to set in his $HOME/.wgetrc). It is +## *highly* undesirable to put these settings in the global file, since +## they are potentially dangerous to "normal" users. +## +## Even when setting up your own ~/.wgetrc, you should know what you +## are doing before doing so. +## + +# Set this to on to use timestamping by default: +#timestamping = off + +# It is a good idea to make Wget send your email address in a `From:' +# header with your request (so that server administrators can contact +# you in case of errors). Wget does *not* send `From:' by default. +#header = From: Your Name + +# You can set up other headers, like Accept-Language. Accept-Language +# is *not* sent by default. +#header = Accept-Language: en + +# You can set the default proxies for Wget to use for http and ftp. +# They will override the value in the environment. +#http_proxy = http://proxy.yoyodyne.com:18023/ +#ftp_proxy = http://proxy.yoyodyne.com:18023/ + +# If you do not want to use proxy at all, set this to off. +#use_proxy = on + +# You can customize the retrieval outlook. Valid options are default, +# binary, mega and micro. +#dot_style = default + +# Setting this to off makes Wget not download /robots.txt. Be sure to +# know *exactly* what /robots.txt is and how it is used before changing +# the default! +#robots = on + +# It can be useful to make Wget wait between connections. Set this to +# the number of seconds you want Wget to wait. +#wait = 0 + +# You can force creating directory structure, even if a single is being +# retrieved, by setting this to on. +#dirstruct = off + +# You can turn on recursive retrieving by default (don't do this if +# you are not sure you know what it means) by setting this to on. +#recursive = off + +# To always back up file X as X.orig before converting its links (due +# to -k / --convert-links / convert_links = on having been specified), +# set this variable to on: +#backup_converted = off + +# To have Wget follow FTP links from HTML files by default, set this +# to on: +#follow_ftp = off diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.ini.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.ini.meta new file mode 100644 index 0000000..f522f31 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/wget.ini.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff5c5834fc18a9d4eb244a041b43baed +timeCreated: 1548365886 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/zlib1.dll b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/zlib1.dll new file mode 100644 index 0000000..b39de53 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/zlib1.dll differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/zlib1.dll.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/zlib1.dll.meta new file mode 100644 index 0000000..b0f5251 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/AutoSync/SoX Sound Exchange/sox-14.4.2-win32/zlib1.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: d15568a42818ceb4eb8800c8ceaa0238 +timeCreated: 1548365886 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems.meta new file mode 100644 index 0000000..6642107 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e785b3e054e465345a15a1efaf25f1ee +folderAsset: yes +timeCreated: 1448115946 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/AdvancedBlendshapeBlendSystem.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/AdvancedBlendshapeBlendSystem.cs new file mode 100644 index 0000000..eec86a1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/AdvancedBlendshapeBlendSystem.cs @@ -0,0 +1,69 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +namespace RogoDigital.Lipsync { + [RequireComponent(typeof(BlendshapeManager))] + public class AdvancedBlendshapeBlendSystem : BlendSystem { + [SerializeField] + private BlendshapeManager manager; + + public override void OnEnable () { + // Sets info about this blend system for use in the editor. + blendableDisplayName = "Blend Shape"; + blendableDisplayNamePlural = "Blend Shapes"; + noBlendablesMessage = "Your chosen Skinned Mesh Renderer has no Blend Shapes defined."; + notReadyMessage = "Skinned Mesh Renderer not set. The Blend Shape BlendSystem requires at least one Skinned Mesh Renderer."; + + if (manager == null) { + if (gameObject.GetComponents().Length > 1) { + manager = gameObject.AddComponent(); + } else { + manager = gameObject.GetComponent(); + } + manager.blendSystem = this; + } else if (manager.blendSystem == null) { + manager.blendSystem = this; + } + + isReady = true; + + base.OnEnable(); + } + + public override string[] GetBlendables () { + if (!isReady) + return null; + + bool setInternal = false; + string[] blendShapes = new string[manager.blendShapes.Length]; + if (blendableCount == 0) setInternal = true; + + for (int a = 0; a < blendShapes.Length; a++) { + blendShapes[a] = manager.blendShapes[a].name + " (" + a.ToString() + ")"; + float value = 0; + if(manager.blendShapes[a].mappings.Length > 0) { + value = manager.blendShapes[a].mappings[0].skinnedMeshRenderer.GetBlendShapeWeight(manager.blendShapes[a].mappings[0].blendShapeIndex); + } + if (setInternal) AddBlendable(a, value); + } + + return blendShapes; + } + + public override void SetBlendableValue (int blendable, float value) { + if (!isReady) + return; + + if (blendable >= manager.blendShapes.Length) + return; + + if(manager.blendShapes[blendable].mappings != null) { + for (int i = 0; i < manager.blendShapes[blendable].mappings.Length; i++) { + SetInternalValue(blendable, value); + manager.blendShapes[blendable].mappings[i].skinnedMeshRenderer.SetBlendShapeWeight(manager.blendShapes[blendable].mappings[i].blendShapeIndex, value); + } + } + } + + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/AdvancedBlendshapeBlendSystem.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/AdvancedBlendshapeBlendSystem.cs.meta new file mode 100644 index 0000000..f922b8d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/AdvancedBlendshapeBlendSystem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 73062c91ee80bb040abd084433473a81 +timeCreated: 1499343908 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeBlendSystem.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeBlendSystem.cs new file mode 100644 index 0000000..23e3572 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeBlendSystem.cs @@ -0,0 +1,129 @@ +using UnityEngine; +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace RogoDigital.Lipsync +{ + public class BlendshapeBlendSystem : BlendSystem + { + + /// + /// Main Character SkinnedMeshRenderer. + /// + public SkinnedMeshRenderer characterMesh; + + /// + /// Any Additional SkinnedMeshRenderers. + /// + public SkinnedMeshRenderer[] optionalOtherMeshes; + + private bool wireframeVisible = true; + + // Do any setup necessary here. BlendSystems run in edit mode as well as play mode, so this will also be called when Unity starts or your scripts recompile. + // Make sure you call base.OnEnable() here for expected behaviour. + public override void OnEnable () + { + // Sets info about this blend system for use in the editor. + blendableDisplayName = "Blend Shape"; + blendableDisplayNamePlural = "Blend Shapes"; + noBlendablesMessage = "Your chosen Skinned Mesh Renderer has no Blend Shapes defined."; + notReadyMessage = "Skinned Mesh Renderer not set. The Blend Shape BlendSystem requires at least one Skinned Mesh Renderer."; + + base.OnEnable(); + +#if UNITY_EDITOR + if (!isReady) + return; + +#if UNITY_5_5_OR_NEWER + EditorUtility.SetSelectedRenderState(characterMesh, wireframeVisible ? EditorSelectedRenderState.Highlight : EditorSelectedRenderState.Hidden); + foreach (SkinnedMeshRenderer renderer in optionalOtherMeshes) + { + EditorUtility.SetSelectedRenderState(renderer, wireframeVisible ? EditorSelectedRenderState.Highlight : EditorSelectedRenderState.Hidden); + } +#else + EditorUtility.SetSelectedWireframeHidden(characterMesh, !wireframeVisible); + foreach (SkinnedMeshRenderer renderer in optionalOtherMeshes) { + EditorUtility.SetSelectedWireframeHidden(renderer, !wireframeVisible); + } +#endif +#endif + } + + /// + /// Sets the value of a blendable. + /// + /// Blendable. + /// Value. + public override void SetBlendableValue (int blendable, float value) + { + if (!isReady || characterMesh == null) + return; + + characterMesh.SetBlendShapeWeight(blendable, value); + SetInternalValue(blendable, value); + foreach (SkinnedMeshRenderer renderer in optionalOtherMeshes) + { + if (blendable < renderer.sharedMesh.blendShapeCount) + renderer.SetBlendShapeWeight(blendable, value); + } + } + + public override string[] GetBlendables () + { + if (!isReady || characterMesh == null) + return null; + + bool setInternal = false; + string[] blendShapes = new string[characterMesh.sharedMesh.blendShapeCount]; + if (blendableCount == 0) + setInternal = true; + + for (int a = 0; a < blendShapes.Length; a++) + { + blendShapes[a] = characterMesh.sharedMesh.GetBlendShapeName(a) + " (" + a.ToString() + ")"; + if (setInternal) + AddBlendable(a, characterMesh.GetBlendShapeWeight(a)); + } + + return blendShapes; + } + + public override void OnVariableChanged () + { + if (characterMesh != null) + { + isReady = true; + } + else + { + isReady = false; + } + } + + //Editor Buttons + [BlendSystemButton("Toggle Wireframe")] + public void ToggleWireframe () + { + if (characterMesh != null) + { + wireframeVisible = !wireframeVisible; +#if UNITY_EDITOR +#if UNITY_5_5_OR_NEWER + EditorUtility.SetSelectedRenderState(characterMesh, wireframeVisible ? EditorSelectedRenderState.Highlight : EditorSelectedRenderState.Hidden); + foreach (SkinnedMeshRenderer renderer in optionalOtherMeshes) + { + EditorUtility.SetSelectedRenderState(renderer, wireframeVisible ? EditorSelectedRenderState.Highlight : EditorSelectedRenderState.Hidden); + } +#else + EditorUtility.SetSelectedWireframeHidden(characterMesh, !wireframeVisible); + foreach (SkinnedMeshRenderer renderer in optionalOtherMeshes) { + EditorUtility.SetSelectedWireframeHidden(renderer, !wireframeVisible); + } +#endif +#endif + } + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeBlendSystem.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeBlendSystem.cs.meta new file mode 100644 index 0000000..0e0ee4a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeBlendSystem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9036ca68e4aa8924a9003edadadd85a2 +timeCreated: 1448116066 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeManager.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeManager.cs new file mode 100644 index 0000000..38ba8c4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeManager.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace RogoDigital.Lipsync +{ + [System.Serializable] + public class BlendshapeManager : MonoBehaviour + { + + [Space] + public AdvancedBlendShape[] blendShapes = new AdvancedBlendShape[0]; + + [HideInInspector] + public AdvancedBlendshapeBlendSystem blendSystem; + + [System.Serializable] + public struct AdvancedBlendShape + { + public string name; + public BlendShapeMapping[] mappings; + } + + [System.Serializable] + public struct BlendShapeMapping + { + public SkinnedMeshRenderer skinnedMeshRenderer; + public int blendShapeIndex; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeManager.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeManager.cs.meta new file mode 100644 index 0000000..57fc80d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BlendshapeManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6dc1e47bffd97414a93a92fb41f56b80 +timeCreated: 1499343929 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BonesOnlyBlendSystem.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BonesOnlyBlendSystem.cs new file mode 100644 index 0000000..bd68b7f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BonesOnlyBlendSystem.cs @@ -0,0 +1,11 @@ +using RogoDigital.Lipsync; + +// This Blend System intentionally does nothing. It is intended as an alternative to the blendshape blend system for those using entirely bone-based rigs. + +public class BonesOnlyBlendSystem : BlendSystem +{ + public override void OnVariableChanged () + { + isReady = true; + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BonesOnlyBlendSystem.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BonesOnlyBlendSystem.cs.meta new file mode 100644 index 0000000..5bbf142 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/BonesOnlyBlendSystem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cfbd411424bbdb842a5b964a94bb8fc2 +timeCreated: 1469318990 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor.meta new file mode 100644 index 0000000..727e09e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9d5175d6c60f9754aa1c7ac6bf81ea86 +folderAsset: yes +timeCreated: 1515781704 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor/BlendshapeBlendSystemEditor.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor/BlendshapeBlendSystemEditor.cs new file mode 100644 index 0000000..6bd1372 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor/BlendshapeBlendSystemEditor.cs @@ -0,0 +1,60 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using RogoDigital.Lipsync; + +[CustomEditor(typeof(BlendshapeBlendSystem))] +public class BlendshapeBlendSystemEditor : Editor +{ + private bool validRenderer = false; + private bool initialValidation = false; + + public override void OnInspectorGUI () + { + serializedObject.Update(); + EditorGUI.BeginChangeCheck(); + SerializedProperty meshRendererProperty = serializedObject.FindProperty("characterMesh"); + EditorGUILayout.PropertyField(meshRendererProperty); + if (EditorGUI.EndChangeCheck() || !initialValidation) + { + ValidateChoice(meshRendererProperty.objectReferenceValue); + } + + if (!validRenderer) + { + EditorGUILayout.HelpBox("The referenced Skinned Mesh Renderer is part of a prefab. If this object is in the scene, you should reference the in-scene version instead.", MessageType.Warning); + } + + EditorGUILayout.PropertyField(serializedObject.FindProperty("optionalOtherMeshes"), true); + serializedObject.ApplyModifiedProperties(); + } + + private void ValidateChoice (Object renderer) + { + initialValidation = true; + if (!renderer) + { + validRenderer = true; + return; + } + +#if UNITY_2018_3_OR_NEWER + if (PrefabUtility.IsPartOfAnyPrefab(renderer)) + { + validRenderer = false; + } + else + { + validRenderer = true; + } +#else + PrefabType t = PrefabUtility.GetPrefabType(renderer); + if (t == PrefabType.Prefab || t == PrefabType.ModelPrefab) { + validRenderer = false; + } else { + validRenderer = true; + } +#endif + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor/BlendshapeBlendSystemEditor.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor/BlendshapeBlendSystemEditor.cs.meta new file mode 100644 index 0000000..dfd44b2 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/Editor/BlendshapeBlendSystemEditor.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: b5331dba3e30af643842cb6b1f0ab5d8 +timeCreated: 1515781750 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/NewBlendSystemTemplate.cs.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/NewBlendSystemTemplate.cs.txt new file mode 100644 index 0000000..d75e460 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/NewBlendSystemTemplate.cs.txt @@ -0,0 +1,71 @@ +using UnityEngine; +using RogoDigital.Lipsync; + +// This is an empty blend system. It will be accepted as a blend system by LipSync, but doesn't contain any real functional code. +// For details on how this works, consult the "Creating Blend Systems" section of the documentation. + +public class MyNewBlendSystem : BlendSystem +{ + + // Do any setup necessary here. BlendSystems run in edit mode as well as play mode, so this will also be called when Unity starts or your scripts recompile. + // Make sure you call base.OnEnable() here for expected behaviour. + public override void OnEnable () + { + // Sets info about this blend system for use in the editor. + blendableDisplayName = "Blendable Name"; + blendableDisplayNamePlural = "Blendable Names"; + noBlendablesMessage = "This message is displayed if there are no blendables available."; + notReadyMessage = "This message is displayed if isReady is set to false."; + + base.OnEnable(); + } + + // This method is used for setting the value of a blendable. The blendable argument is a zero-based index for identifying a blendable. + // It will never be higher than the number of blendables returned by GetBlendables(). + // Depending on how you blend system will work, you may want to keep track of available blendables in an array. + public override void SetBlendableValue (int blendable, float value) + { + // These two lines are important to avoid errors if the method is called before the system is setup. + if(!isReady) + return; + + // As well as making any necesary changes to the mesh/sprite etc, this method should also include the following line. + // This updates the internally tracked value for the blendshape, which is used to prevent conflicts with other scripts. + SetInternalValue(blendable , value); + } + + + // This method is used to populate the blendables dropdown in the LipSync editor. + // The array of strings it returns should be easily readable, and can be categorised using "/". + public override string[] GetBlendables () + { + // These two lines are important to avoid errors if the method is called before the system is setup. + if(!isReady) + return null; + + // The following block of pseudo-code is a rough guide to one way of implementing this method. + // The setInternal bool is used to check if the internal blendable array has been filled in. + // If it hasn't, the AddBlendable method is called for each blendable to correct this. + // This internal blendable array is used to avoid conflicts with other scripts changing the same base values. + +// bool setInternal = false; +// string[] blendShapes = new string[numberOfBlendablesInUnderlyingSystem]; +// if(blendableCount == 0) setInternal = true; +// +// for(int a = 0 ; a < blendShapes.Length ; a++){ +// blendShapes[a] = nameOfBlendable + " (" + a.ToString() + ")"; +// if(setInternal) AddBlendable(a , blendableCurrentValue); +// } + + // Obviously, you should return an actual array of strings here, not an empty one. + // Usually you would loop through the blendable equivalent in whatever system this is designed to work with and add them to a temporary array. + return new string[0]; + } + + // This method is called whenever a public, non-static variable from this class (not the base BlendSystem class) is changed in the LipSync editor. + // It should check that any essential variables have valid values, and set isReady to true only if they do. + public override void OnVariableChanged () + { + isReady = true; + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/NewBlendSystemTemplate.cs.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/NewBlendSystemTemplate.cs.txt.meta new file mode 100644 index 0000000..12fcf15 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/NewBlendSystemTemplate.cs.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65d827f451972b84b8b7e2f12ba9f23f +timeCreated: 1453421701 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteBlendSystem.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteBlendSystem.cs new file mode 100644 index 0000000..273c8cf --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteBlendSystem.cs @@ -0,0 +1,133 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [RequireComponent(typeof(SpriteManager))] + public class SpriteBlendSystem : BlendSystem + { + + [SerializeField] + private SpriteManager manager; + + // Do any setup necessary here. BlendSystems run in edit mode as well as play mode, so this will also be called when Unity starts or your scripts recompile. + // Make sure you call base.OnEnable() here for expected behaviour. + public override void OnEnable () + { + // Sets info about this blend system for use in the editor. + blendableDisplayName = "Sprite"; + blendableDisplayNamePlural = "Sprites"; + noBlendablesMessage = "No Sprites or Layers available. Add Sprites and Layers to the attached SpriteManager to use them."; + notReadyMessage = "No renderers set up"; + +#if LS_EXPERIMENTAL_FEATURES + allowResyncing = true; +#endif + + if (manager == null) + { + if (gameObject.GetComponents().Length > 1) + { + manager = gameObject.AddComponent(); + } + else + { + manager = gameObject.GetComponent(); + } + manager.blendSystem = this; + } + else if (manager.blendSystem == null) + { + manager.blendSystem = this; + } + + base.OnEnable(); + } + + // This method is used for setting the value of a blendable. The blendable argument is a zero-based index for identifying a blendable. + // It will never be higher than the number of blendables returned by GetBlendables(). + public override void SetBlendableValue (int blendable, float value) + { + // These two lines are important to avoid errors if the method is called before the system is setup. + if (!isReady) + return; + + if (manager.groups.Count == 0 || manager.availableSprites.Count == 0) + return; + + int groupnum = Mathf.FloorToInt(blendable / manager.availableSprites.Count); + + SpriteRenderer group = manager.groups[groupnum].spriteRenderer; + if (group == null) + return; + + SetInternalValue(blendable, value); + + int highest = 0; + float highestWeight = 0; + for (int s = groupnum * manager.availableSprites.Count; s < (groupnum + 1) * manager.availableSprites.Count; s++) + { + float sWeight = GetBlendableValue(s); + if (sWeight > highestWeight) + { + highestWeight = sWeight; + highest = s % manager.availableSprites.Count; + } + } + + if (highestWeight == 0) + { + group.sprite = manager.groups[groupnum].defaultSprite; + } + else if (group != null) + { + group.sprite = manager.availableSprites[highest]; + } + + } + + // This method is used to populate the blendables dropdown in the LipSync editor. + // The array of strings it returns should be easily readable, and can be categorised using "/". + public override string[] GetBlendables () + { + // These two lines are important to avoid errors if the method is called before the system is setup. + if (!isReady) + return null; + + ClearBlendables(); + List blendShapes = new List(); + + if (manager == null) + manager = GetComponent(); + + for (int a = 0; a < manager.groups.Count; a++) + { + if (manager.groups[a] != null) + { + for (int s = 0; s < manager.availableSprites.Count; s++) + { + if (manager.availableSprites[s] != null) + { + blendShapes.Add(manager.groups[a].groupName + "/" + manager.availableSprites[s].name + "(" + ((a * manager.availableSprites.Count) + s).ToString() + ")"); + AddBlendable(a, 0); + } + } + } + } + return blendShapes.ToArray(); + } + + // This method is called whenever a public, non-static variable from this class (not the base BlendSystem class) is changed in the LipSync editor. + // It should check that any essential variables have valid values, and set isReady to true only if they do. + public override void OnVariableChanged () + { + isReady = true; + } + + [BlendSystemButton("Show Help")] + public void ShowHelp () + { + Application.OpenURL("http://updates.rogodigital.com/AssetStore/LipSync/spriteblendsystem.pdf"); + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteBlendSystem.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteBlendSystem.cs.meta new file mode 100644 index 0000000..e7991fc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteBlendSystem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a73e9d104505f7740b1524f08e1e5240 +timeCreated: 1459956498 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteManager.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteManager.cs new file mode 100644 index 0000000..e6bd8a1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteManager.cs @@ -0,0 +1,32 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [System.Serializable] + public class SpriteManager : MonoBehaviour + { + [SerializeField] + public List availableSprites = new List(); + [SerializeField] + public List groups = new List(); + + public SpriteBlendSystem blendSystem; + + [System.Serializable] + public class SpriteGroup + { + [SerializeField] + public string groupName; + [SerializeField] + public SpriteRenderer spriteRenderer; + [SerializeField] + public Sprite defaultSprite; + + public SpriteGroup (string groupName) + { + this.groupName = groupName; + } + } + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteManager.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteManager.cs.meta new file mode 100644 index 0000000..4cfd8a7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/SpriteManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aae829b8e4b9bb04397abef041e429b8 +timeCreated: 1459956498 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetBlendSystem.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetBlendSystem.cs new file mode 100644 index 0000000..d6dba23 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetBlendSystem.cs @@ -0,0 +1,168 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [RequireComponent(typeof(TextureOffsetManager))] + public class TextureOffsetBlendSystem : BlendSystem + { + + [SerializeField] + private TextureOffsetManager manager; + + private Dictionary groupLookup; + private Dictionary reverseGroupLookup; + + // Do any setup necessary here. BlendSystems run in edit mode as well as play mode, so this will also be called when Unity starts or your scripts recompile. + // Make sure you call base.OnEnable() here for expected behaviour. + public override void OnEnable () + { + // Sets info about this blend system for use in the editor. + blendableDisplayName = "Texture Setting"; + blendableDisplayNamePlural = "Texture Settings"; + noBlendablesMessage = "No Texture Settings available. Add Texture Settings to the attached Texture Offset Manager to use them."; + notReadyMessage = "No renderers set up"; + +#if LS_EXPERIMENTAL_FEATURES + allowResyncing = true; +#endif + + if (manager == null) + { + if (gameObject.GetComponents().Length > 1) + { + manager = gameObject.AddComponent(); + } + else + { + manager = gameObject.GetComponent(); + } + manager.blendSystem = this; + } + else if (manager.blendSystem == null) + { + manager.blendSystem = this; + } + + CacheGroups(); + + base.OnEnable(); + } + + private void CacheGroups () + { + groupLookup = new Dictionary(); + reverseGroupLookup = new Dictionary(); + + int count = 0; + for (int i = 0; i < manager.materialGroups.Length; i++) + { + for (int a = 0; a < manager.materialGroups[i].textureSettings.Length; a++) + { + groupLookup.Add(count, i); + reverseGroupLookup.Add(i.ToString() + a, count); + Debug.LogFormat("Cached {0} at index {1} as being in group {2} with a sub-index of {3}", manager.materialGroups[i].textureSettings[a].displayName, count, i, a); + count++; + } + } + } + + // This method is used for setting the value of a blendable. The blendable argument is a zero-based index for identifying a blendable. + // It will never be higher than the number of blendables returned by GetBlendables(). + public override void SetBlendableValue (int blendable, float value) + { + // These two lines are important to avoid errors if the method is called before the system is setup. + if (!isReady) + return; + + if (manager.materialGroups.Length == 0) + return; + + if (blendableCount != groupLookup.Count) + CacheGroups(); + + int groupNumber = groupLookup[blendable]; + TextureOffsetManager.MaterialTextureGroup group = manager.materialGroups[groupNumber]; + if (group == null) + return; + + SetInternalValue(blendable, value); + + int highest = 0; + float highestWeight = 0; + for (int s = 0; s < group.textureSettings.Length; s++) + { + float sWeight = GetBlendableValue(reverseGroupLookup[groupNumber.ToString() + s]); + if (sWeight > highestWeight) + { + highestWeight = sWeight; + highest = s; + } + } + + if (!group.material) + return; + + if (highestWeight == 0) + { + if (!group.defaultTexture) + return; + group.material.SetTexture(group.texturePropertyName, group.defaultTexture); + group.material.SetTextureOffset(group.texturePropertyName, group.defaultTextureOffset); + group.material.SetTextureScale(group.texturePropertyName, group.defaultTextureScale); + } + else if (group != null) + { + if (!group.textureSettings[highest].texture) + return; + group.material.SetTexture(group.texturePropertyName, group.textureSettings[highest].texture); + group.material.SetTextureOffset(group.texturePropertyName, group.textureSettings[highest].textureOffset); + group.material.SetTextureScale(group.texturePropertyName, group.textureSettings[highest].textureScale); + } + + } + + // This method is used to populate the blendables dropdown in the LipSync editor. + // The array of strings it returns should be easily readable, and can be categorised using "/". + public override string[] GetBlendables () + { + // These two lines are important to avoid errors if the method is called before the system is setup. + if (!isReady) + return null; + + ClearBlendables(); + List blendShapes = new List(); + + if (manager == null) + { + manager = GetComponent(); + } + + int count = 0; + for (int a = 0; a < manager.materialGroups.Length; a++) + { + if (manager.materialGroups[a] != null) + { + for (int s = 0; s < manager.materialGroups[a].textureSettings.Length; s++) + { + if (manager.materialGroups[a].textureSettings[s] != null) + { + blendShapes.Add(manager.materialGroups[a].displayName + "/" + manager.materialGroups[a].textureSettings[s].displayName + " (" + count + ")"); + AddBlendable(a, 0); + count++; + } + } + } + } + return blendShapes.ToArray(); + } + + // This method is called whenever a public, non-static variable from this class (not the base BlendSystem class) is changed in the LipSync editor. + // It should check that any essential variables have valid values, and set isReady to true only if they do. + public override void OnVariableChanged () + { + isReady = true; + } + + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetBlendSystem.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetBlendSystem.cs.meta new file mode 100644 index 0000000..a8709ee --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetBlendSystem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d502a4a845676cd4d908dc90ba0e79ad +timeCreated: 1459956498 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetManager.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetManager.cs new file mode 100644 index 0000000..02892ae --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetManager.cs @@ -0,0 +1,46 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [System.Serializable] + public class TextureOffsetManager : MonoBehaviour + { + [SerializeField] + public MaterialTextureGroup[] materialGroups = new MaterialTextureGroup[0]; + [HideInInspector] + public TextureOffsetBlendSystem blendSystem; + + [System.Serializable] + public class MaterialTextureGroup + { + [SerializeField] + public string displayName; + [Space, SerializeField] + public Material material; + [SerializeField] + public string texturePropertyName; + [Space, SerializeField] + public Texture2D defaultTexture; + [SerializeField] + public Vector2 defaultTextureOffset; + [SerializeField] + public Vector2 defaultTextureScale = Vector2.one; + [Space, SerializeField] + public TextureSetting[] textureSettings; + } + + [System.Serializable] + public class TextureSetting + { + [SerializeField] + public string displayName; + [Space, SerializeField] + public Texture2D texture; + [SerializeField] + public Vector2 textureOffset; + [SerializeField] + public Vector2 textureScale = Vector2.one; + } + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetManager.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetManager.cs.meta new file mode 100644 index 0000000..8399a4b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/BlendSystems/TextureOffsetManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2f0f101662ef8964dac83d25b2d7832a +timeCreated: 1459956498 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes.meta new file mode 100644 index 0000000..19782fd --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: aac81e85bf710804b8a5f07550a84cc5 +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystem.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystem.cs new file mode 100644 index 0000000..a10ef3a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystem.cs @@ -0,0 +1,233 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [ExecuteInEditMode] + public class BlendSystem : MonoBehaviour + { + + // BlendSystem information + [System.NonSerialized] + public string blendableDisplayName = "Blendable"; + [System.NonSerialized] + public string blendableDisplayNamePlural = "Blendables"; + [System.NonSerialized] + public string noBlendablesMessage = "No Blendables found."; + [System.NonSerialized] + public string notReadyMessage = "Setup incomplete."; + [System.NonSerialized] + public float blendRangeLow = 0; + [System.NonSerialized] + public float blendRangeHigh = 100; + [System.NonSerialized] + public bool allowResyncing = false; + + /// + /// Is the Blend System ready to use? + /// + public bool isReady = false; + + /// + /// The components using this BlendSystem. + /// + public BlendSystemUser[] users = new BlendSystemUser[0]; + + /// + /// Gets the number of blendables associated with this Blend System. + /// + /// The blendable count. + public int blendableCount + { + get + { + if (_blendables == null) + _blendables = new List(); + return _blendables.Count; + } + } + + public BlendSystemGenericDelegate onBlendablesChanged; + public delegate void BlendSystemGenericDelegate (); + + [SerializeField, HideInInspector] + private List _blendables; + + public virtual void OnEnable () + { + hideFlags = HideFlags.HideInInspector; + + OnVariableChanged(); + GetBlendables(); + } + + // When in editor mode, watch for components being removed without unregistering themselves + // #if'd out in builds for performance, as components are able to unregister correctly in play mode. +#if UNITY_EDITOR + void Update () + { + for (int user = 0; user < users.Length; user++) + { + if (users[user] == null) + Unregister(users[user]); + } + } +#endif + /// + /// Register a BlendSystemUser as using this Blend System + /// + /// + public void Register (BlendSystemUser user) + { + List newUsers = new List(); + + for (int i = 0; i < users.Length; i++) + { + newUsers.Add(users[i]); + } + + if (newUsers.Contains(user)) + { + Debug.LogError("Could not register " + user.GetType().Name + " component to " + GetType().Name + ". BlendSystemUser is already registered."); + } + else + { + newUsers.Add(user); + user.blendSystem = this; + } + + users = newUsers.ToArray(); + } + + /// + /// Unregister a BlendSystemUser + /// + /// + public void Unregister (BlendSystemUser user) + { + List newUsers = new List(); + + for (int i = 0; i < users.Length; i++) + { + newUsers.Add(users[i]); + } + + if (newUsers.Contains(user)) + { + if (user != null) + user.blendSystem = null; + newUsers.Remove(user); + } + + users = newUsers.ToArray(); + + if (users.Length == 0) + { + OnBlendSystemRemoved(); + + if (Application.isPlaying) + { + Destroy(this); + } + else + { + DestroyImmediate(this); + } + } + } + + /// + /// Sets the value of a blendable. + /// + /// Blendable. + /// Value. + public virtual void SetBlendableValue (int blendable, float value) + { + } + + /// + /// Gets the value of a blendable. + /// + /// The blendable value. + /// Blendable. + public float GetBlendableValue (int blendable) + { + if (_blendables == null) + _blendables = new List(); + return _blendables[blendable].currentWeight; + } + + /// + /// Called when a BlendSystem variable is changed in a BlendSystemUser's editor. + /// + public virtual void OnVariableChanged () + { + } + + /// + /// Called just after a Blend System is added to the GameObject. + /// + public virtual void OnBlendSystemAdded () + { + } + + /// + /// Called just before a Blend System is removed from the GameObject. + /// + public virtual void OnBlendSystemRemoved () + { + } + + /// + /// Gets the blendables associated with this Blend System. + /// + /// The blendables. + public virtual string[] GetBlendables () + { + return null; + } + + /// + /// Called when a blendable is added to a pose on a BlendSystemUser using this blend system. + /// + /// + public virtual void OnBlendableAddedToPose (int blendable) + { + } + + /// + /// Called when a blendable is removed from a pose on a BlendSystemUser using this blend system. + /// + /// + public virtual void OnBlendableRemovedFromPose (int blendable) + { + } + + // Internal blendable list methods + public void AddBlendable (int blendable, float currentValue) + { + if (_blendables == null) + _blendables = new List(); + _blendables.Insert(blendable, new Blendable(blendable, currentValue)); + } + + public void ClearBlendables () + { + _blendables = new List(); + } + + public void SetInternalValue (int blendable, float value) + { + if (_blendables == null) + { + _blendables = new List(); + GetBlendables(); + } + + if (blendable >= _blendables.Count) + GetBlendables(); + + _blendables[blendable].currentWeight = value; + } + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystem.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystem.cs.meta new file mode 100644 index 0000000..e6daa89 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d503e520d4a1f1f43a396364969a8b5e +timeCreated: 1448112666 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemButton.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemButton.cs new file mode 100644 index 0000000..f8d5343 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemButton.cs @@ -0,0 +1,22 @@ +using System; + +namespace RogoDigital.Lipsync { + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class BlendSystemButton : Attribute { + public string displayName; + + public BlendSystemButton (string displayName) { + this.displayName = displayName; + } + + public struct Reference { + public string displayName; + public System.Reflection.MethodInfo method; + + public Reference (string displayName, System.Reflection.MethodInfo method) { + this.displayName = displayName; + this.method = method; + } + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemButton.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemButton.cs.meta new file mode 100644 index 0000000..79f848a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemButton.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e8aceb3cf6b77b9478d942cf010ec612 +timeCreated: 1452877593 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemUser.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemUser.cs new file mode 100644 index 0000000..9e3b735 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemUser.cs @@ -0,0 +1,29 @@ +using UnityEngine; + +namespace RogoDigital.Lipsync { + public class BlendSystemUser : MonoBehaviour { + /// + /// BlendSystem used + /// + public BlendSystem blendSystem; + + protected void OnDestroy () { + blendSystem.Unregister(this); + } + + /// + /// Used in situations where the BlendSystemUser may have been reset, or the reference to the BlendSystem lost without unregistering. + /// + protected void CleanUpBlendSystems () { + BlendSystem[] blendSystems = GetComponents(); + for (int b = 0; b < blendSystems.Length; b++) { + if(blendSystems[b].users != null) { + for (int u = 0; u < blendSystems[b].users.Length; u++) { + if (blendSystems[b].users[u] == this) blendSystems[b].Unregister(this); + } + } + } + } + + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemUser.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemUser.cs.meta new file mode 100644 index 0000000..8cbddf1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BlendSystemUser.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b24461c2be1232748bb7af23296e01ff +timeCreated: 1453858861 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Blendable.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Blendable.cs new file mode 100644 index 0000000..e68f67b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Blendable.cs @@ -0,0 +1,12 @@ +namespace RogoDigital.Lipsync { + [System.Serializable] + public class Blendable { + public int number; + public float currentWeight; + + public Blendable (int number, float currentWeight) { + this.number = number; + this.currentWeight = currentWeight; + } + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Blendable.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Blendable.cs.meta new file mode 100644 index 0000000..fa2c989 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Blendable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e52c835227bba9b4195e74ad211502e4 +timeCreated: 1452893883 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BoneShape.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BoneShape.cs new file mode 100644 index 0000000..87f9a26 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BoneShape.cs @@ -0,0 +1,51 @@ +using UnityEngine; + +namespace RogoDigital.Lipsync { + [System.Serializable] + public class BoneShape : System.Object { + [SerializeField] + public Transform bone; + [SerializeField] + public Vector3 endPosition; + [SerializeField] + public Vector3 endRotation; + [SerializeField] + public Vector3 endScale = Vector3.one; + + [SerializeField] + public bool lockPosition; + [SerializeField] + public bool lockRotation; + [SerializeField] + public bool lockScale; + + public Vector3 neutralPosition; + public Vector3 neutralRotation; + public Vector3 neutralScale = Vector3.one; + + public void SetNeutral () { + if (bone != null) { + neutralPosition = bone.localPosition; + neutralRotation = bone.localEulerAngles; + neutralScale = bone.localScale; + } + } + + public BoneShape (Transform bone, Vector3 endPosition, Vector3 endRotation, Vector3 endScale) { + this.bone = bone; + this.endPosition = endPosition; + this.endRotation = endRotation; + this.endScale = endScale; + } + + public BoneShape (Transform bone, Vector3 endPosition, Vector3 endRotation) { + this.bone = bone; + this.endPosition = endPosition; + this.endRotation = endRotation; + this.endScale = bone.localScale; + } + + public BoneShape () { + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BoneShape.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BoneShape.cs.meta new file mode 100644 index 0000000..e3ae3cc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/BoneShape.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fb2a4e4e17b4b9241a315678cabfb34f +timeCreated: 1442102948 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMarker.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMarker.cs new file mode 100644 index 0000000..7617343 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMarker.cs @@ -0,0 +1,98 @@ +using UnityEngine; + +namespace RogoDigital.Lipsync { + [System.Serializable] + public class EmotionMarker : System.Object { + [SerializeField] + public string emotion; + [SerializeField] + public bool isMixer; + [SerializeField] + public EmotionMixer mixer; + [SerializeField] + public float startTime; + [SerializeField] + public float endTime; + [SerializeField] + public float blendInTime; + [SerializeField] + public float blendOutTime; + [SerializeField] + public bool blendToMarker; + [SerializeField] + public bool blendFromMarker; + [SerializeField] + public bool customBlendIn; + [SerializeField] + public bool customBlendOut; + [SerializeField] + public float intensity = 1; + [SerializeField] + public bool continuousVariation = false; + [SerializeField] + public float variationFrequency = 0.5f; + [SerializeField] + public float intensityVariation = 0.35f; + [SerializeField] + public float blendableVariation = 0.1f; + [SerializeField] + public float bonePositionVariation = 0.1f; + [SerializeField] + public float boneRotationVariation = 0.1f; + + // Editor Only + public bool invalid = false; + + public EmotionMarker (string emotion, float startTime, float endTime, float blendInTime, float blendOutTime, bool blendToMarker, bool blendFromMarker, bool customBlendIn, bool customBlendOut) { + this.emotion = emotion; + this.startTime = startTime; + this.endTime = endTime; + this.blendInTime = blendInTime; + this.blendOutTime = blendOutTime; + this.blendToMarker = blendToMarker; + this.blendFromMarker = blendFromMarker; + this.customBlendIn = customBlendIn; + this.customBlendOut = customBlendOut; + } + + public EmotionMarker (EmotionMixer mixer, float startTime, float endTime, float blendInTime, float blendOutTime, bool blendToMarker, bool blendFromMarker, bool customBlendIn, bool customBlendOut) { + isMixer = true; + this.mixer = mixer; + this.startTime = startTime; + this.endTime = endTime; + this.blendInTime = blendInTime; + this.blendOutTime = blendOutTime; + this.blendToMarker = blendToMarker; + this.blendFromMarker = blendFromMarker; + this.customBlendIn = customBlendIn; + this.customBlendOut = customBlendOut; + } + + public EmotionMarker (string emotion, float startTime, float endTime, float blendInTime, float blendOutTime, bool blendToMarker, bool blendFromMarker, bool customBlendIn, bool customBlendOut, float intensity) { + this.emotion = emotion; + this.startTime = startTime; + this.endTime = endTime; + this.blendInTime = blendInTime; + this.blendOutTime = blendOutTime; + this.blendToMarker = blendToMarker; + this.blendFromMarker = blendFromMarker; + this.customBlendIn = customBlendIn; + this.customBlendOut = customBlendOut; + this.intensity = intensity; + } + + public EmotionMarker CreateCopy () { + EmotionMarker m = new EmotionMarker(emotion, startTime, endTime, blendInTime, blendOutTime, blendToMarker, blendFromMarker, customBlendIn, customBlendOut, intensity); + + m.isMixer = isMixer; + m.mixer = mixer; + m.blendableVariation = blendableVariation; + m.bonePositionVariation = bonePositionVariation; + m.boneRotationVariation = boneRotationVariation; + m.intensityVariation = intensityVariation; + m.continuousVariation = continuousVariation; + + return m; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMarker.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMarker.cs.meta new file mode 100644 index 0000000..9bcddaf --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMarker.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2d67049db76022f4e8eb8b07e0ac4990 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMixer.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMixer.cs new file mode 100644 index 0000000..fea4dbf --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMixer.cs @@ -0,0 +1,129 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync { + [System.Serializable] + public class EmotionMixer { + [SerializeField] + public List emotions; + [SerializeField] + public MixingMode mixingMode; + + // Editor Only + public Color displayColor; + + public EmotionMixer () { + emotions = new List(); + displayColor = new Color(0, 0, 0); + } + + public EmotionShape GetShape (LipSync character) { + EmotionShape shape = new EmotionShape("Mixed"); + + if (!character) return shape; + if (!character.blendSystem) return shape; + + // Cache Emotions + Dictionary emotionCache = new Dictionary(); + foreach (EmotionShape emotionShape in character.emotions) { + emotionCache.Add(emotionShape.emotion, emotionShape); + } + + for (int i = 0; i < emotions.Count; i++) { + if (emotionCache.ContainsKey(emotions[i].emotion)) { + EmotionShape subShape = emotionCache[emotions[i].emotion]; + + // Blendables + for (int b = 0; b < subShape.blendShapes.Count; b++) { + if (shape.blendShapes.Contains(subShape.blendShapes[b])) { + Mathf.Clamp(shape.weights[shape.blendShapes.IndexOf(subShape.blendShapes[b])] += subShape.weights[b] * emotions[i].weight, character.blendSystem.blendRangeLow, character.blendSystem.blendRangeHigh); + + } else { + shape.blendShapes.Add(subShape.blendShapes[b]); + shape.weights.Add(subShape.weights[b] * emotions[i].weight); + + } + } + + // Bones + for (int b = 0; b < subShape.bones.Count; b++) { + BoneShape bone = subShape.bones[b]; + + if (shape.HasBone(bone.bone)) { + shape.bones[shape.IndexOfBone(bone.bone)].endPosition += bone.endPosition * emotions[i].weight; + shape.bones[shape.IndexOfBone(bone.bone)].endRotation += bone.endRotation * emotions[i].weight; + } else { + shape.bones.Add(new BoneShape(bone.bone, bone.endPosition * emotions[i].weight, bone.endRotation * emotions[i].weight)); + } + } + } + } + + return shape; + } + + public void SetWeight (int index, float weight) { + SetWeight(index, weight, false); + } + + public void SetWeight (int index, float weight, bool bypassMinChecks) { + + if (mixingMode == MixingMode.Additive) { + emotions[index] = new EmotionComponent(emotions[index].emotion, weight); + return; + } + + if (!bypassMinChecks) weight = Mathf.Clamp(weight, 0.01f, 1); + + float totalWeight = 0; + float[] oldWeights = new float[emotions.Count]; + + if ((emotions.Count) == 1) { + emotions[index] = new EmotionComponent(emotions[index].emotion, 1); + return; + } + + for (int i = 0; i < emotions.Count; i++) { + oldWeights[i] = emotions[i].weight; + if (i != index) { + totalWeight += emotions[i].weight; + } + } + + emotions[index] = new EmotionComponent(emotions[index].emotion, weight); + float newTotalWeight = totalWeight - (weight - oldWeights[index]); + + for (int i = 0; i < emotions.Count; i++) { + if (i != index) { + float newWeight = newTotalWeight * (emotions[i].weight / totalWeight); + + if (newWeight > 0.02f || bypassMinChecks) { + emotions[i] = new EmotionComponent(emotions[i].emotion, newWeight); + } else { + for (int a = 0; a < emotions.Count; a++) { + emotions[a] = new EmotionComponent(emotions[a].emotion, oldWeights[a]); + } + break; + } + } + } + } + + [System.Serializable] + public struct EmotionComponent { + public string emotion; + public float weight; + + public EmotionComponent (string emotion, float weight) { + this.emotion = emotion; + this.weight = weight; + } + } + + public enum MixingMode { + Normal, + Additive, + } + } + +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMixer.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMixer.cs.meta new file mode 100644 index 0000000..597e16d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionMixer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 06df777f009a84f4abcdd4cfdb8aff61 +timeCreated: 1475847121 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionShape.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionShape.cs new file mode 100644 index 0000000..38a4070 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionShape.cs @@ -0,0 +1,21 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [System.Serializable] + public class EmotionShape : Shape + { + + [SerializeField] + public string emotion; + + public EmotionShape (string eEmotion) + { + emotion = eEmotion; + blendShapes = new List(); + weights = new List(); + bones = new List(); + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionShape.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionShape.cs.meta new file mode 100644 index 0000000..22ee23e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/EmotionShape.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3a36b245807290240826134f1464575f +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureInstance.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureInstance.cs new file mode 100644 index 0000000..19de0a6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureInstance.cs @@ -0,0 +1,26 @@ +using UnityEngine; + +[System.Serializable] +public class GestureInstance : System.Object { + [SerializeField] + public string gesture; + [SerializeField] + public AnimationClip clip; + [SerializeField] + public string triggerName; + + public GestureInstance (string gesture, AnimationClip clip, string triggerName) { + this.gesture = gesture; + this.clip = clip; + this.triggerName = triggerName; + } + + public bool IsValid (Animator animator) { + for (int a = 0; a < animator.parameters.Length; a++) { + if (animator.parameters[a].name == triggerName) { + return true; + } + } + return false; + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureInstance.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureInstance.cs.meta new file mode 100644 index 0000000..7561b82 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureInstance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 464dad5148455714e817b314eb7a3eb1 +timeCreated: 1454943097 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureMarker.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureMarker.cs new file mode 100644 index 0000000..52de499 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureMarker.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +namespace RogoDigital.Lipsync { + [System.Serializable] + public class GestureMarker : System.Object { + [SerializeField] + public string gesture; + [SerializeField] + public float time; + + public GestureMarker (string gesture, float time) { + this.gesture = gesture; + this.time = time; + } + + public GestureMarker CreateCopy () { + GestureMarker m = new GestureMarker(gesture, time); + return m; + } + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureMarker.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureMarker.cs.meta new file mode 100644 index 0000000..3549e48 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/GestureMarker.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1c9e391135ce11549a41779034de1050 +timeCreated: 1454766993 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncData.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncData.cs new file mode 100644 index 0000000..4a7b9c0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncData.cs @@ -0,0 +1,100 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [System.Serializable] + public class LipSyncData : ScriptableObject + { + public AudioClip clip; + public PhonemeMarker[] phonemeData; + public EmotionMarker[] emotionData; + public GestureMarker[] gestureData; + + public float version; + public float length; + public string transcript; + + public AnimationCurve[] phonemePoseCurves = new AnimationCurve[0]; + public AnimationCurve[] emotionPoseCurves = new AnimationCurve[0]; + + public int targetComponentID; + public bool isPreprocessed; + + public List indexBlendables; + public List animCurves; + + public List bones; + public List boneCurves; + + public List boneNeutralPositions; + public List boneNeutralScales; + public List boneNeutralRotations; + + public void GenerateCurves (int phonemeCount, int emotionCount) + { + phonemePoseCurves = new AnimationCurve[phonemeCount]; + emotionPoseCurves = new AnimationCurve[emotionCount]; + + // Create Phoneme Pose Curves + for (int i = 0; i < phonemePoseCurves.Length; i++) + { + phonemePoseCurves[i] = new AnimationCurve(new Keyframe[] { new Keyframe(0, 0), new Keyframe(1, 0) }); + } + + // Create Emotion Pose Curves + for (int i = 0; i < emotionPoseCurves.Length; i++) + { + emotionPoseCurves[i] = new AnimationCurve(new Keyframe[] { new Keyframe(0, 0), new Keyframe(1, 0) }); + } + + // Generate Phoneme Pose Keyframes + for (int i = 0; i < phonemeData.Length; i++) + { + for (int p = 0; p < phonemePoseCurves.Length; p++) + { + if (p == phonemeData[i].phonemeNumber) + continue; + + phonemePoseCurves[p].AddKey(phonemeData[i].time, 0); + } + + phonemePoseCurves[phonemeData[i].phonemeNumber].AddKey(phonemeData[i].time, phonemeData[i].intensity); + } + + // Generate Emotion Pose Keyframes + for (int i = 0; i < emotionData.Length; i++) + { + //emotionPoseCurves[emotionData[i].phonemeNumber].AddKey(phonemeData[i].time, phonemeData[i].intensity); + } + } + + public static explicit operator LipSyncData (TemporaryLipSyncData data) + { + var output = CreateInstance(); + output.phonemeData = new PhonemeMarker[data.phonemeData.Count]; + output.emotionData = new EmotionMarker[data.emotionData.Count]; + output.gestureData = new GestureMarker[data.gestureData.Count]; + + for (int i = 0; i < data.phonemeData.Count; i++) + { + output.phonemeData[i] = data.phonemeData[i].CreateCopy(); + } + for (int i = 0; i < data.emotionData.Count; i++) + { + output.emotionData[i] = data.emotionData[i].CreateCopy(); + } + for (int i = 0; i < data.gestureData.Count; i++) + { + output.gestureData[i] = data.gestureData[i].CreateCopy(); + } + + output.clip = data.clip; + output.version = data.version; + output.length = data.length; + output.transcript = data.transcript; + + return output; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncData.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncData.cs.meta new file mode 100644 index 0000000..172b12d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9f44607bd270d4f4eaa8869ed9b5b85c +timeCreated: 1440094664 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 391b972e71309ab45839fafd498a2df5, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncExtensions.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncExtensions.cs new file mode 100644 index 0000000..3fd82fc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncExtensions.cs @@ -0,0 +1,118 @@ +using UnityEngine; +using System.Collections.Generic; +using System.Xml; +using RogoDigital.Lipsync; + +namespace RogoDigital.Lipsync { + public static class LipSyncExtensions { + /// + /// Finds a named child or grandchild of a Transform. + /// + /// + /// + /// + public static Transform FindDeepChild (this Transform aParent, string aName) { + var result = aParent.Find(aName); + if (result != null) + return result; + foreach (Transform child in aParent) { + result = child.FindDeepChild(aName); + if (result != null) + return result; + } + return null; + } + + /// + /// Transforms an euler rotation in world space to one relative to a Transform. + /// + /// + /// + /// + public static Vector3 InverseTransformEulerAngle (this Transform transform, Vector3 eulerAngle) { + return (eulerAngle - transform.eulerAngles).ToPositiveEuler(); + } + + /// + /// Transforms an euler rotation relative to a Transform to one in world space. + /// + /// + /// + /// + public static Vector3 TransformEulerAngle (this Transform transform, Vector3 eulerAngle) { + return ClampRange(eulerAngle + transform.eulerAngles); + } + + /// + /// Converts an euler rotation in the -180 - 180 range to one in the 0 to 360 range. + /// + /// + /// + public static Vector3 ToPositiveEuler (this Vector3 eulerAngle) { + float x = eulerAngle.x; + float y = eulerAngle.y; + float z = eulerAngle.z; + + if (x < 0) x = 360 + x; + if (y < 0) y = 360 + y; + if (z < 0) z = 360 + z; + + return new Vector3(x, y, z); + } + + /// + /// Converts an euler rotation in the 0 - 360 range to one in the -180 to 180 range. + /// + /// + /// + public static Vector3 ToNegativeEuler (this Vector3 eulerAngle) { + float x = eulerAngle.x; + float y = eulerAngle.y; + float z = eulerAngle.z; + + if (x > 180) x -= 360; + if (y > 180) y -= 360; + if (z > 180) z -= 360; + + return new Vector3(x, y, z); + } + + private static Vector3 ClampRange (Vector3 eulerAngle) { + float x = eulerAngle.x; + float y = eulerAngle.y; + float z = eulerAngle.z; + + if (x > 360) x -= 360; + if (y > 360) y -= 360; + if (z > 360) z -= 360; + + return new Vector3(x, y, z).ToPositiveEuler(); + } + + /// + /// Returns the previous marker to current in a list of EmotionMarkers. + /// + /// + /// + /// + public static EmotionMarker PreviousMarker (this List list, EmotionMarker current) { + int index = list.IndexOf(current) - 1; + if (index >= 0) + return list[index]; + return null; + } + + /// + /// Returns the next marker to current in a list of EmotionMarkers. + /// + /// + /// + /// + public static EmotionMarker NextMarker (this List list, EmotionMarker current) { + int index = list.IndexOf(current) + 1; + if (index < list.Count) + return list[index]; + return null; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncExtensions.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncExtensions.cs.meta new file mode 100644 index 0000000..1500928 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8bd8207661b8def458d9fffb7896aec8 +timeCreated: 1457112900 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncPreset.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncPreset.cs new file mode 100644 index 0000000..b75d959 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncPreset.cs @@ -0,0 +1,276 @@ +using UnityEngine; +using System.IO; + +namespace RogoDigital.Lipsync +{ + public class LipSyncPreset : ScriptableObject + { + // Data + public string displayPath; + public bool isRelative; + [SerializeField] + public PhonemeShapeInfo[] phonemeShapes; + [SerializeField] + public EmotionShapeInfo[] emotionShapes; + +#if UNITY_EDITOR + private void OnEnable() + { + // Auto-update: Convert asset path to the displayPath field on old presets that didn't have one set. + if (string.IsNullOrEmpty(displayPath)) + { + string path = UnityEditor.AssetDatabase.GetAssetPath(this); + if (path.Contains("Presets/")) + { + var splitPath = path.Split('/'); + string newPath = ""; + bool adding = false; + for (int i = 0; i < splitPath.Length; i++) + { + if (adding) + { + if (i == splitPath.Length - 1) + { + newPath += Path.GetFileNameWithoutExtension(splitPath[i]); + } + else + { + newPath += splitPath[i] + "/"; + } + } + else + { + if (splitPath[i].ToLowerInvariant() == "presets") + { + adding = true; + } + } + } + displayPath = newPath; + } + else + { + displayPath = Path.GetFileNameWithoutExtension(path); + } + } + } +#endif + + // Functions + /// + /// Returns the index of the blendable in blendSystem that best matches the supplied BlendableInfo. + /// + /// + /// + /// The index of the blendable if found, or -1 if not. + public int FindBlendable(BlendableInfo blendable, BlendSystem blendSystem) + { + // First attempts to match based on name, then index. If both fail, returns -1. + if (!string.IsNullOrEmpty(blendable.blendableName)) + { + string cleanName = blendable.blendableName; + + if (cleanName.Contains("(" + blendable.blendableNumber.ToString() + ")")) + { + string[] parts = cleanName.Split(new string[] { "(" + blendable.blendableNumber.ToString() + ")" }, System.StringSplitOptions.RemoveEmptyEntries); + if (parts.Length > 0) + { + cleanName = parts[0]; + } + } + + string[] blendables = blendSystem.GetBlendables(); + + for (int a = 0; a < blendables.Length; a++) + { + string cleanBlendableName = blendables[a]; + if (cleanBlendableName.Contains("(" + a.ToString() + ")")) + { + string[] parts = cleanBlendableName.Split(new string[] { "(" + a.ToString() + ")" }, System.StringSplitOptions.RemoveEmptyEntries); + if (parts.Length > 0) + { + cleanBlendableName = parts[0]; + } + } + + if (cleanBlendableName == cleanName) + { + return a; + } + } + } + + if (blendable.blendableNumber < blendSystem.blendableCount) + { + if (!string.IsNullOrEmpty(blendable.blendableName)) + { + if (blendable.blendableName != blendSystem.GetBlendables()[blendable.blendableNumber]) + { + Debug.LogWarning("[LipSync] Blendable " + blendable.blendableName + " used in the '" + this.name + "' preset couldn't be matched based on name, and the blendable at the same index in the " + blendSystem.GetType().Name + " has a different name. This may not be the shape you were expecting."); + } + } + + return blendable.blendableNumber; + } + + return -1; + } + + /// + /// Returns the Transform that best matches the supplied BoneInfo, using /searchRoot/ as a base. + /// + /// + /// + /// The matching bone transform if found, or null if not. + public Transform FindBone(BoneInfo bone, Transform searchRoot) + { + // First attempts to find the transform at the same position in the hierarchy relative to searchRoot, then a transform anywhere under searchRoot with the same name. + // If both fail, returns null; + Transform fullMatch = searchRoot.Find(bone.path + bone.name); + if (fullMatch != null) return fullMatch; + + return searchRoot.FindDeepChild(bone.name); + } + + public void CreateFromShapes(PhonemeShape[] phonemes, EmotionShape[] emotions, BlendSystem blendSystem, bool relative) + { + isRelative = relative; + phonemeShapes = new PhonemeShapeInfo[phonemes.Length]; + emotionShapes = new EmotionShapeInfo[emotions.Length]; + + for (int s = 0; s < phonemeShapes.Length; s++) + { + phonemeShapes[s] = new PhonemeShapeInfo(); + phonemeShapes[s].phonemeName = phonemes[s].phonemeName; + + phonemeShapes[s].blendables = new BlendableInfo[phonemes[s].blendShapes.Count]; + for (int b = 0; b < phonemeShapes[s].blendables.Length; b++) + { + phonemeShapes[s].blendables[b].blendableNumber = phonemes[s].blendShapes[b]; + phonemeShapes[s].blendables[b].weight = phonemes[s].weights[b]; + + if (blendSystem != null) + { + phonemeShapes[s].blendables[b].blendableName = blendSystem.GetBlendables()[phonemes[s].blendShapes[b]]; + } + } + + phonemeShapes[s].bones = new BoneInfo[phonemes[s].bones.Count]; + for (int b = 0; b < phonemeShapes[s].bones.Length; b++) + { + phonemeShapes[s].bones[b].name = phonemes[s].bones[b].bone.name; + phonemeShapes[s].bones[b].lockPosition = phonemes[s].bones[b].lockPosition; + phonemeShapes[s].bones[b].lockRotation = phonemes[s].bones[b].lockRotation; + phonemeShapes[s].bones[b].lockScale = phonemes[s].bones[b].lockScale; + + if (relative) + { + phonemeShapes[s].bones[b].localPosition = phonemes[s].bones[b].neutralPosition - phonemes[s].bones[b].endPosition; + phonemeShapes[s].bones[b].localRotation = phonemes[s].bones[b].neutralRotation - phonemes[s].bones[b].endRotation; + phonemeShapes[s].bones[b].localScale = phonemes[s].bones[b].neutralScale - phonemes[s].bones[b].endScale; + } + else + { + phonemeShapes[s].bones[b].localPosition = phonemes[s].bones[b].endPosition; + phonemeShapes[s].bones[b].localRotation = phonemes[s].bones[b].endRotation; + phonemeShapes[s].bones[b].localScale = phonemes[s].bones[b].endScale; + } + } + } + + for (int s = 0; s < emotionShapes.Length; s++) + { + emotionShapes[s] = new EmotionShapeInfo(); + emotionShapes[s].emotion = emotions[s].emotion; + + emotionShapes[s].blendables = new BlendableInfo[emotions[s].blendShapes.Count]; + for (int b = 0; b < emotionShapes[s].blendables.Length; b++) + { + emotionShapes[s].blendables[b].blendableNumber = emotions[s].blendShapes[b]; + emotionShapes[s].blendables[b].weight = emotions[s].weights[b]; + + if (blendSystem != null) + { + emotionShapes[s].blendables[b].blendableName = blendSystem.GetBlendables()[emotions[s].blendShapes[b]]; + } + } + + emotionShapes[s].bones = new BoneInfo[emotions[s].bones.Count]; + for (int b = 0; b < emotionShapes[s].bones.Length; b++) + { + emotionShapes[s].bones[b].name = emotions[s].bones[b].bone.name; + emotionShapes[s].bones[b].lockPosition = emotions[s].bones[b].lockPosition; + emotionShapes[s].bones[b].lockRotation = emotions[s].bones[b].lockRotation; + emotionShapes[s].bones[b].lockScale = emotions[s].bones[b].lockScale; + + if (relative) + { + emotionShapes[s].bones[b].localPosition = emotions[s].bones[b].neutralPosition - phonemes[s].bones[b].endPosition; + emotionShapes[s].bones[b].localRotation = emotions[s].bones[b].neutralRotation - phonemes[s].bones[b].endRotation; + emotionShapes[s].bones[b].localScale = emotions[s].bones[b].neutralScale - emotions[s].bones[b].endScale; + } + else + { + emotionShapes[s].bones[b].localPosition = emotions[s].bones[b].endPosition; + emotionShapes[s].bones[b].localRotation = emotions[s].bones[b].endRotation; + emotionShapes[s].bones[b].localScale = emotions[s].bones[b].endScale; + } + } + } + } + + // Structures + [System.Serializable] + public struct PhonemeShapeInfo + { + [SerializeField] + public string phonemeName; + [SerializeField, System.Obsolete("Please use PhonemeShapeInfo.phonemeName")] + public Phoneme phoneme; + [SerializeField] + public BlendableInfo[] blendables; + [SerializeField] + public BoneInfo[] bones; + } + [System.Serializable] + public struct EmotionShapeInfo + { + [SerializeField] + public string emotion; + [SerializeField] + public BlendableInfo[] blendables; + [SerializeField] + public BoneInfo[] bones; + } + [System.Serializable] + public struct BlendableInfo + { + [SerializeField] + public int blendableNumber; + [SerializeField] + public string blendableName; + [SerializeField] + public float weight; + } + [System.Serializable] + public struct BoneInfo + { + [SerializeField] + public string path; + [SerializeField] + public string name; + [SerializeField] + public Vector3 localPosition; + [SerializeField] + public Vector3 localRotation; + [SerializeField] + public Vector3 localScale; + [SerializeField] + public bool lockPosition; + [SerializeField] + public bool lockRotation; + [SerializeField] + public bool lockScale; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncPreset.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncPreset.cs.meta new file mode 100644 index 0000000..86f7fbb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncPreset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: db07302a52ae0d84f8f0c1bf5a629241 +timeCreated: 1457092565 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 37706586c99b75f4bbc2a0e589e0be7d, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncProject.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncProject.cs new file mode 100644 index 0000000..5df146d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncProject.cs @@ -0,0 +1,32 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync { + /// + /// Stores per-project information and settings used by LipSync Pro. + /// + public class LipSyncProject : ScriptableObject { + /// + /// Master array of available emotion names. + /// + [SerializeField] + public string[] emotions; + /// + /// Array of Colors used to represent emotions in the editor. + /// + [SerializeField] + public Color[] emotionColors; + + /// + /// Master list of available gesture names + /// + [SerializeField] + public List gestures = new List(); + + /// + /// PhonemeSet used for this project + /// + [SerializeField] + public PhonemeSet phonemeSet; + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncProject.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncProject.cs.meta new file mode 100644 index 0000000..40bb592 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/LipSyncProject.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d88ce0f977278ac4590f827247ba60de +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeMarker.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeMarker.cs new file mode 100644 index 0000000..fcbe56d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeMarker.cs @@ -0,0 +1,64 @@ +using UnityEngine; + +namespace RogoDigital.Lipsync { + [System.Serializable] + public class PhonemeMarker : System.Object { + [SerializeField, System.Obsolete("Use PhonemeMarker.phonemeNumber instead.")] + public Phoneme phoneme; + [SerializeField] + public int phonemeNumber; + [SerializeField] + public float time; + [SerializeField] + public float intensity = 1; + [SerializeField] + public bool sustain = false; + [SerializeField] + public bool useRandomness = false; + [SerializeField] + public float intensityRandomness = 0.1f; + [SerializeField] + public float blendableRandomness = 0.3f; + [SerializeField] + public float bonePositionRandomness = 0.3f; + [SerializeField] + public float boneRotationRandomness = 0.3f; + + public PhonemeMarker (int phonemeNumber, float time, float intensity, bool sustain) { + this.phonemeNumber = phonemeNumber; + this.time = time; + this.intensity = intensity; + this.sustain = sustain; + } + + public PhonemeMarker (int phonemeNumber, float time) { + this.phonemeNumber = phonemeNumber; + this.time = time; + } + + [System.Obsolete("Use int constructors instead.")] + public PhonemeMarker (Phoneme phoneme, float time, float intensity, bool sustain) { + this.phoneme = phoneme; + this.time = time; + this.intensity = intensity; + this.sustain = sustain; + } + + [System.Obsolete("Use int constructors instead.")] + public PhonemeMarker (Phoneme phoneme, float time) { + this.phoneme = phoneme; + this.time = time; + } + + public PhonemeMarker CreateCopy () { + PhonemeMarker m = new PhonemeMarker(phonemeNumber, time, intensity, sustain); + m.blendableRandomness = blendableRandomness; + m.bonePositionRandomness = bonePositionRandomness; + m.boneRotationRandomness = boneRotationRandomness; + m.intensityRandomness = intensityRandomness; + m.useRandomness = useRandomness; + + return m; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeMarker.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeMarker.cs.meta new file mode 100644 index 0000000..0f09eec --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeMarker.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ec5b95362fc54e040a03bb63a4e3d527 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeSet.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeSet.cs new file mode 100644 index 0000000..f5c677b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeSet.cs @@ -0,0 +1,98 @@ +using UnityEngine; +using System.Collections.Generic; + +#pragma warning disable 618 + +namespace RogoDigital.Lipsync { + /// + /// Stores a collection of phonemes to be used on a project-wide basis. + /// + [System.Serializable, CreateAssetMenu(fileName = "New Phoneme Set", menuName = "LipSync Pro/Phoneme Set")] + public class PhonemeSet : ScriptableObject { + + public bool isLegacyFormat = true; + [SerializeField] + public string scriptingName; + [SerializeField, System.Obsolete("Use phonemeList instead.", false)] + public PhonemeCollection phonemes = new PhonemeCollection(); + [SerializeField] + public List phonemeList = new List(); + + [SerializeField, System.Obsolete("Use phonemeList[index].guideImage instead.", false)] + public Texture2D[] guideImages; + + public void UpdateFormat () + { + if (!isLegacyFormat) + return; + + phonemeList.Clear(); + + for (int i = 0; i < phonemes.Length; i++) + { + var newPhoneme = new Phoneme(phonemes[i].name, phonemes[i].number, phonemes[i].flag); + + if(i < guideImages.Length) + newPhoneme.guideImage = guideImages[i]; + + phonemeList.Add(newPhoneme); + } + + isLegacyFormat = false; + } + + [System.Serializable] + public class PhonemeCollection { + public List phonemeNames; + + public int Length { get { return phonemeNames.Count; } } + + public Phoneme this[int index] { + get { + return new Phoneme(phonemeNames[index], index, Mathf.RoundToInt(Mathf.Pow(2, index))); + } + } + + public PhonemeCollection () { + phonemeNames = new List(); + } + } + + [System.Serializable] + public class Phoneme { + /// + /// The name of the phoneme. + /// + public string name; + + /// + /// Sequential base-10 index of the phoneme + /// + public int number; + + /// + /// Sequential power of 2 identifier for this phoneme (for use in bitmasks) + /// + public int flag; + + /// + /// If a phoneme is marked as visually important, some actions in LipSync will avoid reducing its intensity/visibility. + /// In English, this would be sounds like F, L or P, where moving the lips or tongue out of position would make the sound impossible. + /// + public bool visuallyImportant; + + /// + /// Guide image to be displayed in the Scene View when editing this phoneme. + /// + public Texture2D guideImage; + + public Phoneme (string name, int number, int flag) { + this.name = name; + this.number = number; + this.flag = flag; + } + } + } + + #pragma warning restore 618 +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeSet.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeSet.cs.meta new file mode 100644 index 0000000..3ee1f57 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeSet.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5e19889bf5d1a7a4e9d54d7b076c7ebd +timeCreated: 1473424527 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeShape.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeShape.cs new file mode 100644 index 0000000..3e6d1cb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeShape.cs @@ -0,0 +1,32 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync +{ + [System.Serializable] + public class PhonemeShape : Shape + { + + [SerializeField] + public string phonemeName; + [SerializeField, System.Obsolete("Use phonemeName instead.")] + public Phoneme phoneme; + + public PhonemeShape (string phonemeName) + { + this.phonemeName = phonemeName; + blendShapes = new List(); + weights = new List(); + bones = new List(); + } + + [System.Obsolete("Use the new string constructor instead.")] + public PhonemeShape (Phoneme ePhoneme) + { + phoneme = ePhoneme; + blendShapes = new List(); + weights = new List(); + bones = new List(); + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeShape.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeShape.cs.meta new file mode 100644 index 0000000..17b67de --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/PhonemeShape.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c5a5ed4877f6dcb4aac4ae8a1ebbc2b8 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Shape.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Shape.cs new file mode 100644 index 0000000..362ba45 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Shape.cs @@ -0,0 +1,54 @@ +using UnityEngine; +using UnityEngine.Serialization; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync { + [System.Serializable] + public class Shape : System.Object { + + /// + /// The blendable indeces. + /// + [SerializeField] + public List blendShapes = new List(); + + /// + /// The blendable names. Used for re-syncing + /// + [SerializeField] + public List blendableNames = new List(); + + /// + /// The associated weights. + /// + [SerializeField] + public List weights = new List(); + + /// + /// List of bone shapes. + /// + [SerializeField] + public List bones = new List(); + + /// + /// Whether or not this shape exists in the project + /// Will always be true for phoneme shapes. + /// + [SerializeField] + public bool verified = true; + + public bool HasBone (Transform bone) { + for (int b = 0; b < bones.Count; b++) { + if (bones[b].bone == bone) return true; + } + return false; + } + + public int IndexOfBone (Transform bone) { + for (int b = 0; b < bones.Count; b++) { + if (bones[b].bone == bone) return b; + } + return -1; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Shape.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Shape.cs.meta new file mode 100644 index 0000000..533408d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/Shape.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 31ea8894ef359fa42948bf7c4020a051 +timeCreated: 1452554789 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TemporaryLipSyncData.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TemporaryLipSyncData.cs new file mode 100644 index 0000000..7dc0e76 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TemporaryLipSyncData.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace RogoDigital.Lipsync +{ + public class TemporaryLipSyncData : ScriptableObject + { + public AudioClip clip; + public List phonemeData; + public List emotionData; + public List gestureData; + + public float version; + public float length = 10; + public string transcript = ""; + + private void OnEnable() + { + hideFlags = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor; + } + + public static explicit operator TemporaryLipSyncData(LipSyncData data) + { + var output = CreateInstance(); + + // Data + output.phonemeData = new List(); + output.emotionData = new List(); + output.gestureData = new List(); + + if (data.phonemeData != null) + { + for (int i = 0; i < data.phonemeData.Length; i++) + { + output.phonemeData.Add(data.phonemeData[i].CreateCopy()); + } + } + + if (data.emotionData != null) + { + for (int i = 0; i < data.emotionData.Length; i++) + { + output.emotionData.Add(data.emotionData[i].CreateCopy()); + } + } + + if (data.gestureData != null) + { + for (int i = 0; i < data.gestureData.Length; i++) + { + output.gestureData.Add(data.gestureData[i].CreateCopy()); + } + } + + output.clip = data.clip; + output.version = data.version; + output.length = data.length; + output.transcript = data.transcript; + + return output; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TemporaryLipSyncData.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TemporaryLipSyncData.cs.meta new file mode 100644 index 0000000..a02baa8 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TemporaryLipSyncData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f175ba4d9aaaf1a4f8c42f121236253f +timeCreated: 1547822010 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TransformAnimationCurve.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TransformAnimationCurve.cs new file mode 100644 index 0000000..b9f67cb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TransformAnimationCurve.cs @@ -0,0 +1,338 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace RogoDigital.Lipsync { + [System.Serializable] + public class TransformAnimationCurve { + private AnimationCurve _posX; + private AnimationCurve _posY; + private AnimationCurve _posZ; + private AnimationCurve _rotX; + private AnimationCurve _rotY; + private AnimationCurve _rotZ; + private AnimationCurve _rotW; + private AnimationCurve _scaleX; + private AnimationCurve _scaleY; + private AnimationCurve _scaleZ; + + public AnimationCurve[] GetAnimationCurves () + { + return new AnimationCurve[] + { + _posX, + _posY, + _posZ, + _rotX, + _rotY, + _rotZ, + _rotW, + _scaleX, + _scaleY, + _scaleZ, + }; + } + + public TransformKeyframe[] keys { + get { + List keyframes = new List(); + var posXKeys = _posX.keys; + var posYKeys = _posY.keys; + var posZKeys = _posZ.keys; + var rotXKeys = _rotX.keys; + var rotYKeys = _rotY.keys; + var rotZKeys = _rotZ.keys; + var rotWKeys = _rotW.keys; + var scaXKeys = _scaleX.keys; + var scaYKeys = _scaleY.keys; + var scaZKeys = _scaleZ.keys; + + for (int k = 0; k < _posX.length; k++) { + keyframes.Add(new TransformKeyframe( + posXKeys[k].time, + new Vector3( + posXKeys[k].value, + posYKeys[k].value, + posZKeys[k].value + ), new Quaternion( + rotXKeys[k].value, + rotYKeys[k].value, + rotZKeys[k].value, + rotWKeys[k].value + ), new Vector3( + scaXKeys[k].value, + scaYKeys[k].value, + scaZKeys[k].value + ), + posXKeys[k].inTangent, + posXKeys[k].outTangent + )); + } + + return keyframes.ToArray(); + } + } + + public int length { + get { + return _posX.length; + } + } + + public WrapMode postWrapMode { + get { + return _posX.postWrapMode; + } + + set { + _posX.postWrapMode = value; + _posY.postWrapMode = value; + _posZ.postWrapMode = value; + _rotX.postWrapMode = value; + _rotY.postWrapMode = value; + _rotZ.postWrapMode = value; + _rotW.postWrapMode = value; + _scaleX.postWrapMode = value; + _scaleY.postWrapMode = value; + _scaleZ.postWrapMode = value; + } + } + + public WrapMode preWrapMode { + get { + return _posX.preWrapMode; + } + + set { + _posX.preWrapMode = value; + _posY.preWrapMode = value; + _posZ.preWrapMode = value; + _rotX.preWrapMode = value; + _rotY.preWrapMode = value; + _rotZ.preWrapMode = value; + _rotW.preWrapMode = value; + _scaleX.preWrapMode = value; + _scaleY.preWrapMode = value; + _scaleZ.preWrapMode = value; + } + } + + public int AddKey (float time, Vector3 position, Quaternion rotation, Vector3 scale, float inTangent, float outTangent) { + int index = _posX.AddKey(new Keyframe(time, position.x, inTangent, outTangent)); + _posY.AddKey(new Keyframe(time, position.y, inTangent, outTangent)); + _posZ.AddKey(new Keyframe(time, position.z, inTangent, outTangent)); + + Quaternion fixedRotation = Quaternion.Euler(CentreAngles(rotation.eulerAngles)); + + _rotX.AddKey(new Keyframe(time, fixedRotation.x, inTangent, outTangent)); + _rotY.AddKey(new Keyframe(time, fixedRotation.y, inTangent, outTangent)); + _rotZ.AddKey(new Keyframe(time, fixedRotation.z, inTangent, outTangent)); + _rotW.AddKey(new Keyframe(time, fixedRotation.w, inTangent, outTangent)); + + _scaleX.AddKey(new Keyframe(time, scale.x, inTangent, outTangent)); + _scaleY.AddKey(new Keyframe(time, scale.y, inTangent, outTangent)); + _scaleZ.AddKey(new Keyframe(time, scale.z, inTangent, outTangent)); + + return index; + } + + public int AddKey (float time, Vector3 position, Quaternion rotation, float inTangent, float outTangent) { + int index = _posX.AddKey(new Keyframe(time, position.x, inTangent, outTangent)); + _posY.AddKey(new Keyframe(time, position.y, inTangent, outTangent)); + _posZ.AddKey(new Keyframe(time, position.z, inTangent, outTangent)); + + Quaternion fixedRotation = Quaternion.Euler(CentreAngles(rotation.eulerAngles)); + + _rotX.AddKey(new Keyframe(time, fixedRotation.x, inTangent, outTangent)); + _rotY.AddKey(new Keyframe(time, fixedRotation.y, inTangent, outTangent)); + _rotZ.AddKey(new Keyframe(time, fixedRotation.z, inTangent, outTangent)); + _rotW.AddKey(new Keyframe(time, fixedRotation.w, inTangent, outTangent)); + + return index; + } + + public int AddKey (float time, Quaternion rotation, float inTangent, float outTangent) { + Quaternion fixedRotation = Quaternion.Euler(CentreAngles(rotation.eulerAngles)); + + int index = _rotX.AddKey(new Keyframe(time, fixedRotation.x, inTangent, outTangent)); + _rotY.AddKey(new Keyframe(time, fixedRotation.y, inTangent, outTangent)); + _rotZ.AddKey(new Keyframe(time, fixedRotation.z, inTangent, outTangent)); + _rotW.AddKey(new Keyframe(time, fixedRotation.w, inTangent, outTangent)); + + return index; + } + + public int AddKey (float time, Vector3 position, float inTangent, float outTangent) { + int index = _posX.AddKey(new Keyframe(time, position.x, inTangent, outTangent)); + _posY.AddKey(new Keyframe(time, position.y, inTangent, outTangent)); + _posZ.AddKey(new Keyframe(time, position.z, inTangent, outTangent)); + + return index; + } + + public int AddKey (float time, Vector3 position, Quaternion rotation, Vector3 scale) { + int index = _posX.AddKey(time, position.x); + _posY.AddKey(time, position.y); + _posZ.AddKey(time, position.z); + + Quaternion fixedRotation = Quaternion.Euler(CentreAngles(rotation.eulerAngles)); + + _rotX.AddKey(time, fixedRotation.x); + _rotY.AddKey(time, fixedRotation.y); + _rotZ.AddKey(time, fixedRotation.z); + _rotW.AddKey(time, fixedRotation.w); + + _scaleX.AddKey(time, scale.x); + _scaleY.AddKey(time, scale.y); + _scaleZ.AddKey(time, scale.z); + + return index; + } + + public int AddKey (float time, Vector3 position, Quaternion rotation) { + int index = _posX.AddKey(time, position.x); + _posY.AddKey(time, position.y); + _posZ.AddKey(time, position.z); + + Quaternion fixedRotation = Quaternion.Euler(CentreAngles(rotation.eulerAngles)); + + _rotX.AddKey(time, fixedRotation.x); + _rotY.AddKey(time, fixedRotation.y); + _rotZ.AddKey(time, fixedRotation.z); + _rotW.AddKey(time, fixedRotation.w); + + return index; + } + + public int AddKey (float time, Quaternion rotation) { + Quaternion fixedRotation = Quaternion.Euler(CentreAngles(rotation.eulerAngles)); + + int index = _rotX.AddKey(time, fixedRotation.x); + _rotY.AddKey(time, fixedRotation.y); + _rotZ.AddKey(time, fixedRotation.z); + _rotW.AddKey(time, fixedRotation.w); + + return index; + } + + public int AddKey (float time, Vector3 position) { + int index = _posX.AddKey(time, position.x); + _posY.AddKey(time, position.y); + _posZ.AddKey(time, position.z); + return index; + } + + public int AddKey (TransformKeyframe keyframe) { + int index = _posX.AddKey(new Keyframe(keyframe.time, keyframe.position.x, keyframe.inTangent, keyframe.outTangent)); + _posY.AddKey(new Keyframe(keyframe.time, keyframe.position.y, keyframe.inTangent, keyframe.outTangent)); + _posZ.AddKey(new Keyframe(keyframe.time, keyframe.position.z, keyframe.inTangent, keyframe.outTangent)); + + Quaternion fixedRotation = Quaternion.Euler(CentreAngles(keyframe.rotation.eulerAngles)); + + _rotX.AddKey(new Keyframe(keyframe.time, fixedRotation.x, keyframe.inTangent, keyframe.outTangent)); + _rotY.AddKey(new Keyframe(keyframe.time, fixedRotation.y, keyframe.inTangent, keyframe.outTangent)); + _rotZ.AddKey(new Keyframe(keyframe.time, fixedRotation.z, keyframe.inTangent, keyframe.outTangent)); + _rotW.AddKey(new Keyframe(keyframe.time, fixedRotation.w, keyframe.inTangent, keyframe.outTangent)); + + return index; + } + + public Vector3 EvaluateScale (float time) { + float x = _scaleX.Evaluate(time); + float y = _scaleY.Evaluate(time); + float z = _scaleZ.Evaluate(time); + + return new Vector3(x, y, z); + } + + public Vector3 EvaluatePosition (float time) { + float x = _posX.Evaluate(time); + float y = _posY.Evaluate(time); + float z = _posZ.Evaluate(time); + + return new Vector3(x, y, z); + } + + public Quaternion EvaluateRotation (float time) { + float x = _rotX.Evaluate(time); + float y = _rotY.Evaluate(time); + float z = _rotZ.Evaluate(time); + float w = _rotW.Evaluate(time); + + return new Quaternion(x, y, z, w); + } + + public TransformAnimationCurve () { + _posX = new AnimationCurve(); + _posY = new AnimationCurve(); + _posZ = new AnimationCurve(); + + _scaleX = new AnimationCurve(); + _scaleY = new AnimationCurve(); + _scaleZ = new AnimationCurve(); + + _rotX = new AnimationCurve(); + _rotY = new AnimationCurve(); + _rotZ = new AnimationCurve(); + _rotW = new AnimationCurve(); + } + + public struct TransformKeyframe { + public float time; + public Quaternion rotation; + public Vector3 position; + public Vector3 scale; + public float inTangent; + public float outTangent; + + public TransformKeyframe (float time, Vector3 position, Quaternion rotation, Vector3 scale, float inTangent, float outTangent) { + this.time = time; + this.position = position; + this.rotation = rotation; + this.scale = scale; + this.inTangent = inTangent; + this.outTangent = outTangent; + } + } + + private Vector3 CentreAngles (Vector3 euler) { + return euler.ToNegativeEuler(); + } + + // Quaternion interpolation fix by Chris Lewis + public void FixQuaternionContinuity () { + Keyframe[] keysX = _rotX.keys; + Keyframe[] keysY = _rotY.keys; + Keyframe[] keysZ = _rotZ.keys; + Keyframe[] keysW = _rotW.keys; + + if (keysX.Length == 0) { + return; + } + + Quaternion previousRotation = new Quaternion( + keysX[0].value, keysY[0].value, keysZ[0].value, keysW[0].value); + Quaternion currentRotation; + + for (int i = 0; i < keysX.Length; i++) { + currentRotation = new Quaternion( + keysX[i].value, keysY[i].value, keysZ[i].value, keysW[i].value); + + if (Quaternion.Dot(currentRotation, previousRotation) < 0.0f) { + currentRotation = Quaternion.Inverse(currentRotation); + } + + keysX[i].value = currentRotation.x; + keysY[i].value = currentRotation.y; + keysZ[i].value = currentRotation.z; + keysW[i].value = currentRotation.w; + + previousRotation = currentRotation; + } + + _rotX.keys = keysX; + _rotY.keys = keysY; + _rotZ.keys = keysZ; + _rotW.keys = keysW; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TransformAnimationCurve.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TransformAnimationCurve.cs.meta new file mode 100644 index 0000000..97a5017 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Classes/TransformAnimationCurve.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f75734a09994d86439cc29562ff66990 +timeCreated: 1454536142 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components.meta new file mode 100644 index 0000000..ad57986 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 96271442e6f3f7e44a2f9594482a7eef +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/EyeController.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/EyeController.cs new file mode 100644 index 0000000..3eb8b82 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/EyeController.cs @@ -0,0 +1,977 @@ +using UnityEngine; +using UnityEngine.Serialization; +using System.Collections; +using System.Collections.Generic; +using RogoDigital.Lipsync; + +namespace RogoDigital +{ + [AddComponentMenu("Rogo Digital/Eye Controller")] + + /// + /// Provides automatic randomised blinking and looking for characters. + /// Note: Component is due for a major overhaul next version. Expect better performance + cleaner code. + /// + public class EyeController : BlendSystemUser + { + + /// + /// Is blinking enabled. + /// + public bool blinkingEnabled = false; + + /// + /// Whether to use legacy-style single blendable blinking, or the new blinking pose. + /// + public ControlMode blinkingControlMode = ControlMode.Classic; + + /// + /// A generic pose for blinking. + /// + public Shape blinkingShape; + + /// + /// The left eye blink blendable index. + /// + [FormerlySerializedAs("leftEyeBlinkBlendshape")] + public int leftEyeBlinkBlendable = 0; + + /// + /// The right eye blink blendable index. + /// + [FormerlySerializedAs("rightEyeBlinkBlendshape")] + public int rightEyeBlinkBlendable = 1; + + /// + /// The minimum time between blinks. + /// + public float minimumBlinkGap = 1; + + /// + /// The maximum time between blinks. + /// + public float maximumBlinkGap = 4; + + /// + /// How long each blink takes. + /// + [FormerlySerializedAs("blinkSpeed")] + public float blinkDuration = 0.14f; + + /// + /// Keeps the eyes closed. + /// + public bool keepEyesClosed + { + get + { + return _keepEyesClosed; + } + set + { + if (value == true) + { + + if (_keepEyesClosed != value) + StartCoroutine(CloseEyes()); + } + else + { + if (_keepEyesClosed != value) + StartCoroutine(OpenEyes()); + } + + _keepEyesClosed = value; + } + } + + /// + /// Is random looking enabled. + /// + public bool randomLookingEnabled = false; + + /// + /// Whether to use legacy-style bone-based looking, or the new looking poses. + /// + public ControlMode lookingControlMode = ControlMode.Classic; + + /// + /// A generic pose for looking up. + /// + public Shape lookingUpShape; + + /// + /// A generic pose for looking down. + /// + public Shape lookingDownShape; + + /// + /// A generic pose for looking left. + /// + public Shape lookingLeftShape; + + /// + /// A generic pose for looking right. + /// + public Shape lookingRightShape; + + /// + /// Transform for the left eye. + /// + public Transform LeftEyeLookAtBone + { + get + { + return _leftEyeLookAtBone; + } + set + { + if (_leftEyeLookAtBone == value) + return; + _leftEyeLookAtBone = value; + if (Application.isPlaying) + FixDummyHierarchy(); + } + } + [SerializeField, FormerlySerializedAs("leftEyeLookAtBone")] + private Transform _leftEyeLookAtBone; + + /// + /// Transform for the right eye. + /// + public Transform RightEyeLookAtBone + { + get + { + return _rightEyeLookAtBone; + } + set + { + if (_rightEyeLookAtBone == value) + return; + _rightEyeLookAtBone = value; + if (Application.isPlaying) + FixDummyHierarchy(); + } + } + [SerializeField, FormerlySerializedAs("rightEyeLookAtBone")] + private Transform _rightEyeLookAtBone; + + /// + /// The eye rotation range along the X axis. + /// + public Vector2 eyeRotationRangeX = new Vector2(-6.5f, 6.5f); + + /// + /// The eye rotation range along the Y axis. + /// + public Vector2 eyeRotationRangeY = new Vector2(-17.2f, 17.2f); + + /// + /// The eye look offset. + /// + public Vector3 eyeLookOffset; + + /// + /// Vector3 describing the forward axis of the eye bones. + /// + public Axis eyeForwardAxis = Axis.Z_Positive; + + /// + /// The eye turn speed. + /// + public float eyeTurnSpeed = 18; + + /// + /// The minimum time between look direction changes. + /// + public float minimumChangeDirectionGap = 2; + + /// + /// The maximum time between look direction changes. + /// + public float maximumChangeDirectionGap = 10; + + /// + /// Is look targeting enabled. + /// + public bool targetEnabled = false; + + /// + /// Should targets be found automatically. + /// + public bool autoTarget = false; + + /// + /// Tag to use when looking for targets. + /// + public string autoTargetTag = "EyeControllerTarget"; + + /// + /// The maximum distance between a target and the character for it to be targeted. + /// + public float autoTargetDistance = 10; + + /// + /// Transform to look at. + /// + public Transform viewTarget; + + /// + /// The target weight. + /// + public float targetWeight = 1; + + /// + /// Used for deciding if/when to repose boneshapes in LateUpdate. + /// + public bool boneUpdateAnimation = false; + + // Blinking + private float blinkTimer; + private bool blinking = false; + + // keepEyesClosed backing field + private bool _keepEyesClosed = false; + private bool _asyncBlending = false; + + // Shared Looking + private Transform leftEyeDummy; + private Transform rightEyeDummy; + private Quaternion leftRotation; + private Quaternion rightRotation; + private Vector3[] axisOffsets = { new Vector3(0, -90, 0), new Vector3(0, 90, 0), new Vector3(90, 0, 0), new Vector3(-90, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 180, 0) }; + + // Random Look + private float lookTimer; + private Quaternion randomAngle; + private Vector2 randomBlend; + + // Look Target + private Transform target; + private Quaternion leftTargetAngle; + private Quaternion rightTargetAngle; + + private Transform[] markedTargets; + private Dictionary boneShapes; + + void Start () + { + // Get Starting Info + randomAngle = Quaternion.identity; + leftTargetAngle = Quaternion.identity; + rightTargetAngle = Quaternion.identity; + + if (LeftEyeLookAtBone != null && RightEyeLookAtBone != null) + { + leftRotation = LeftEyeLookAtBone.rotation; + rightRotation = RightEyeLookAtBone.rotation; + } + + if (targetEnabled && autoTarget) + { + FindTargets(); + } + + // Create dummy eye transforms + leftEyeDummy = new GameObject("Left Eye Dummy").transform; + rightEyeDummy = new GameObject("Right Eye Dummy").transform; + leftEyeDummy.gameObject.hideFlags = HideFlags.DontSave; + rightEyeDummy.gameObject.hideFlags = HideFlags.DontSave; + + FixDummyHierarchy(); + + // Populate BoneShapeInfo list + boneShapes = new Dictionary(); + + if (blinkingControlMode == ControlMode.PoseBased) + { + foreach (BoneShape bone in blinkingShape.bones) + { + if (!boneShapes.ContainsKey(bone.bone)) + boneShapes.Add(bone.bone, new BoneShapeInfo(bone)); + } + } + + if (lookingControlMode == ControlMode.PoseBased) + { + foreach (BoneShape bone in lookingUpShape.bones) + { + if (!boneShapes.ContainsKey(bone.bone)) + boneShapes.Add(bone.bone, new BoneShapeInfo(bone)); + } + foreach (BoneShape bone in lookingDownShape.bones) + { + if (!boneShapes.ContainsKey(bone.bone)) + boneShapes.Add(bone.bone, new BoneShapeInfo(bone)); + } + foreach (BoneShape bone in lookingLeftShape.bones) + { + if (!boneShapes.ContainsKey(bone.bone)) + boneShapes.Add(bone.bone, new BoneShapeInfo(bone)); + } + foreach (BoneShape bone in lookingRightShape.bones) + { + if (!boneShapes.ContainsKey(bone.bone)) + boneShapes.Add(bone.bone, new BoneShapeInfo(bone)); + } + } + } + + void LateUpdate () + { + if (!leftEyeDummy || !rightEyeDummy) + { + FixDummyHierarchy(); + } + + // Blinking + if (blinkingEnabled && blendSystem != null && !keepEyesClosed && !_asyncBlending) + { + if (blendSystem.isReady) + { + if (blinking) + { + float halfBlinkSpeed = blinkDuration / 2; + + if (blinkTimer < halfBlinkSpeed) + { + if (blinkingControlMode == ControlMode.Classic) + { + blendSystem.SetBlendableValue(leftEyeBlinkBlendable, Mathf.Lerp(0, 100, blinkTimer / halfBlinkSpeed)); + blendSystem.SetBlendableValue(rightEyeBlinkBlendable, Mathf.Lerp(0, 100, blinkTimer / halfBlinkSpeed)); + + } + else if (blinkingControlMode == ControlMode.PoseBased) + { + for (int b = 0; b < blinkingShape.blendShapes.Count; b++) + { + blendSystem.SetBlendableValue(blinkingShape.blendShapes[b], Mathf.Lerp(0, blinkingShape.weights[b], blinkTimer / halfBlinkSpeed)); + } + + for (int b = 0; b < blinkingShape.bones.Count; b++) + { + if (boneUpdateAnimation) + { + Vector3 newPos = Vector3.Lerp(boneShapes[blinkingShape.bones[b].bone].storedPosition, blinkingShape.bones[b].endPosition, blinkTimer / halfBlinkSpeed) - blinkingShape.bones[b].neutralPosition; + Vector3 newRot = Vector3.Lerp(boneShapes[blinkingShape.bones[b].bone].storedRotation.eulerAngles, blinkingShape.bones[b].endRotation, blinkTimer / halfBlinkSpeed) - blinkingShape.bones[b].neutralRotation; + + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition += newPos; + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles += newRot; + } + else + { + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition = Vector3.Lerp(boneShapes[blinkingShape.bones[b].bone].storedPosition, blinkingShape.bones[b].endPosition, blinkTimer / halfBlinkSpeed); + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles = Vector3.Lerp(boneShapes[blinkingShape.bones[b].bone].storedRotation.eulerAngles, blinkingShape.bones[b].endRotation, blinkTimer / halfBlinkSpeed); + } + } + } + } + else + { + if (blinkingControlMode == ControlMode.Classic) + { + blendSystem.SetBlendableValue(leftEyeBlinkBlendable, Mathf.Lerp(100, 0, (blinkTimer - halfBlinkSpeed) / halfBlinkSpeed)); + blendSystem.SetBlendableValue(rightEyeBlinkBlendable, Mathf.Lerp(100, 0, (blinkTimer - halfBlinkSpeed) / halfBlinkSpeed)); + } + else if (blinkingControlMode == ControlMode.PoseBased) + { + for (int b = 0; b < blinkingShape.blendShapes.Count; b++) + { + blendSystem.SetBlendableValue(blinkingShape.blendShapes[b], Mathf.Lerp(blinkingShape.weights[b], 0, (blinkTimer - halfBlinkSpeed) / halfBlinkSpeed)); + } + + for (int b = 0; b < blinkingShape.bones.Count; b++) + { + if (boneUpdateAnimation) + { + Vector3 newPos = Vector3.Lerp(blinkingShape.bones[b].endPosition, boneShapes[blinkingShape.bones[b].bone].storedPosition, (blinkTimer - halfBlinkSpeed) / halfBlinkSpeed) - blinkingShape.bones[b].neutralPosition; + Vector3 newRot = Vector3.Lerp(blinkingShape.bones[b].endRotation, boneShapes[blinkingShape.bones[b].bone].storedRotation.eulerAngles, (blinkTimer - halfBlinkSpeed) / halfBlinkSpeed) - blinkingShape.bones[b].neutralRotation; + + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition += newPos; + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles += newRot; + } + else + { + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition = Vector3.Lerp(blinkingShape.bones[b].endPosition, boneShapes[blinkingShape.bones[b].bone].storedPosition, (blinkTimer - halfBlinkSpeed) / halfBlinkSpeed); + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles = Vector3.Lerp(blinkingShape.bones[b].endRotation, boneShapes[blinkingShape.bones[b].bone].storedRotation.eulerAngles, (blinkTimer - halfBlinkSpeed) / halfBlinkSpeed); + } + } + } + + if (blinkTimer > blinkDuration) + { + blinking = false; + blinkTimer = Random.Range(minimumBlinkGap, maximumBlinkGap); + } + } + + blinkTimer += Time.deltaTime; + } + else + { + if (blinkTimer <= 0) + { + blinking = true; + blinkTimer = 0; + } + else + { + blinkTimer -= Time.deltaTime; + } + } + } + } + + // Look Target + if (targetEnabled && lookingControlMode != ControlMode.PoseBased && leftEyeDummy != null && rightEyeDummy != null) + { + // Auto Target + if (autoTarget) + { + try + { + float targetDistance = autoTargetDistance; + target = null; + for (int i = 0; i < markedTargets.Length; i++) + { + if (Vector3.Distance(transform.position, markedTargets[i].position) < targetDistance) + { + targetDistance = Vector3.Distance(transform.position, markedTargets[i].position); + target = markedTargets[i]; + } + } + } + catch (System.NullReferenceException) + { + FindTargets(); + } + } + else + { + target = viewTarget; + } + + if (target != null) + { + Vector3 llta = leftEyeDummy.parent.InverseTransformEulerAngle((Quaternion.LookRotation(target.position - leftEyeDummy.position)).eulerAngles).ToNegativeEuler(); + Vector3 lrta = rightEyeDummy.parent.InverseTransformEulerAngle((Quaternion.LookRotation(target.position - rightEyeDummy.position)).eulerAngles).ToNegativeEuler(); + + llta = new Vector3(Mathf.Clamp(llta.x, eyeRotationRangeX.x, eyeRotationRangeX.y), Mathf.Clamp(llta.y, eyeRotationRangeY.x, eyeRotationRangeY.y), 0) + eyeLookOffset; + lrta = new Vector3(Mathf.Clamp(lrta.x, eyeRotationRangeX.x, eyeRotationRangeX.y), Mathf.Clamp(lrta.y, eyeRotationRangeY.x, eyeRotationRangeY.y), 0) + eyeLookOffset; + + leftTargetAngle = Quaternion.Euler(leftEyeDummy.parent.TransformEulerAngle(llta)); + rightTargetAngle = Quaternion.Euler(rightEyeDummy.parent.TransformEulerAngle(lrta)); + } + } + else + { + targetWeight = 0; + } + + // Random Look + if (randomLookingEnabled && ((leftEyeDummy != null && rightEyeDummy != null && lookingControlMode == ControlMode.Classic) || lookingControlMode == ControlMode.PoseBased)) + { + if (lookTimer <= 0) + { + lookTimer = Random.Range(minimumChangeDirectionGap, maximumChangeDirectionGap); + if (lookingControlMode == ControlMode.Classic) + { + randomAngle = Quaternion.Euler(Random.Range(eyeRotationRangeX.x, eyeRotationRangeX.y), Random.Range(eyeRotationRangeY.x, eyeRotationRangeY.y), 0) * Quaternion.Euler(eyeLookOffset); + } + else if (lookingControlMode == ControlMode.PoseBased) + { + randomBlend = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f)); + } + } + else + { + lookTimer -= Time.deltaTime; + } + } + + // Shared Looking + if (leftEyeDummy != null && rightEyeDummy != null && (randomLookingEnabled || targetEnabled) || lookingControlMode == ControlMode.PoseBased) + { + if (lookingControlMode == ControlMode.Classic) + { + leftEyeDummy.rotation = leftRotation; + rightEyeDummy.rotation = rightRotation; + + Quaternion leftAngle = Quaternion.Lerp(leftEyeDummy.parent.rotation * randomAngle, leftTargetAngle, targetWeight); + Quaternion rightAngle = Quaternion.Lerp(rightEyeDummy.parent.rotation * randomAngle, rightTargetAngle, targetWeight); + + leftEyeDummy.rotation = Quaternion.Lerp(leftEyeDummy.rotation, leftAngle, Time.deltaTime * eyeTurnSpeed); + rightEyeDummy.rotation = Quaternion.Lerp(rightEyeDummy.rotation, rightAngle, Time.deltaTime * eyeTurnSpeed); + + // Keep eye bones in place to override any animation keys + LeftEyeLookAtBone.localPosition = RightEyeLookAtBone.localPosition = Vector3.zero; + + // Apply offsets + LeftEyeLookAtBone.localEulerAngles = axisOffsets[(int)eyeForwardAxis]; + RightEyeLookAtBone.localEulerAngles = axisOffsets[(int)eyeForwardAxis]; + + leftRotation = leftEyeDummy.rotation; + rightRotation = rightEyeDummy.rotation; + } + else if (lookingControlMode == ControlMode.PoseBased) + { + if (randomBlend.y >= 0) + { + // Looking Up Range + for (int b = 0; b < lookingUpShape.blendShapes.Count; b++) + { + if (blinkingControlMode == ControlMode.PoseBased) + { + if (!(blinkingShape.blendShapes.Contains(lookingUpShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingUpShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingUpShape.blendShapes[b]), Mathf.Lerp(0, lookingUpShape.weights[b], randomBlend.y), Time.deltaTime * eyeTurnSpeed)); + } + } + else + { + if (!((leftEyeBlinkBlendable == lookingUpShape.blendShapes[b] || rightEyeBlinkBlendable == lookingUpShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingUpShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingUpShape.blendShapes[b]), Mathf.Lerp(0, lookingUpShape.weights[b], randomBlend.y), Time.deltaTime * eyeTurnSpeed)); + } + } + } + + for (int b = 0; b < lookingUpShape.bones.Count; b++) + { + + if (blinkingControlMode == ControlMode.PoseBased) + { + if (blinkingShape.HasBone(lookingUpShape.bones[b].bone) && (blinking || keepEyesClosed)) + { + continue; + } + } + + Vector3 newPos = Vector3.Lerp(lookingUpShape.bones[b].neutralPosition, lookingUpShape.bones[b].endPosition, randomBlend.y); + Vector3 newRot = Vector3LerpAngle(lookingUpShape.bones[b].neutralRotation, lookingUpShape.bones[b].endRotation, randomBlend.y); + + if (boneUpdateAnimation) + { + if (!lookingUpShape.bones[b].lockPosition) + boneShapes[lookingUpShape.bones[b].bone].targetPosition = lookingUpShape.bones[b].bone.localPosition + (newPos - lookingUpShape.bones[b].neutralPosition); + if (!lookingUpShape.bones[b].lockRotation) + boneShapes[lookingUpShape.bones[b].bone].targetRotation = Quaternion.Euler(lookingUpShape.bones[b].bone.localEulerAngles + (newRot - lookingUpShape.bones[b].neutralRotation)); + } + else + { + if (!lookingUpShape.bones[b].lockPosition) + boneShapes[lookingUpShape.bones[b].bone].targetPosition = newPos; + if (!lookingUpShape.bones[b].lockRotation) + boneShapes[lookingUpShape.bones[b].bone].targetRotation = Quaternion.Euler(newRot); + } + + if (!lookingUpShape.bones[b].lockPosition) + boneShapes[lookingUpShape.bones[b].bone].storedPosition = Vector3.Lerp(boneShapes[lookingUpShape.bones[b].bone].storedPosition, boneShapes[lookingUpShape.bones[b].bone].targetPosition, Time.deltaTime * eyeTurnSpeed); + if (!lookingUpShape.bones[b].lockRotation) + boneShapes[lookingUpShape.bones[b].bone].storedRotation = Quaternion.Lerp(boneShapes[lookingUpShape.bones[b].bone].storedRotation, boneShapes[lookingUpShape.bones[b].bone].targetRotation, Time.deltaTime * eyeTurnSpeed); + } + } + else + { + // Looking Down Range + for (int b = 0; b < lookingDownShape.blendShapes.Count; b++) + { + if (blinkingControlMode == ControlMode.PoseBased) + { + if (!(blinkingShape.blendShapes.Contains(lookingDownShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingDownShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingDownShape.blendShapes[b]), Mathf.Lerp(0, lookingDownShape.weights[b], -randomBlend.y), Time.deltaTime * eyeTurnSpeed)); + } + } + else + { + if (!((leftEyeBlinkBlendable == lookingDownShape.blendShapes[b] || rightEyeBlinkBlendable == lookingDownShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingDownShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingDownShape.blendShapes[b]), Mathf.Lerp(0, lookingDownShape.weights[b], -randomBlend.y), Time.deltaTime * eyeTurnSpeed)); + } + } + } + + for (int b = 0; b < lookingDownShape.bones.Count; b++) + { + + if (blinkingControlMode == ControlMode.PoseBased) + { + if (blinkingShape.HasBone(lookingDownShape.bones[b].bone) && (blinking || keepEyesClosed)) + { + continue; + } + } + + Vector3 newPos = Vector3.Lerp(lookingDownShape.bones[b].neutralPosition, lookingDownShape.bones[b].endPosition, -randomBlend.y); + Vector3 newRot = Vector3LerpAngle(lookingDownShape.bones[b].neutralRotation, lookingDownShape.bones[b].endRotation, -randomBlend.y); + + if (boneUpdateAnimation) + { + if (!lookingDownShape.bones[b].lockPosition) + boneShapes[lookingDownShape.bones[b].bone].targetPosition = lookingDownShape.bones[b].bone.localPosition + (newPos - lookingDownShape.bones[b].neutralPosition); + if (!lookingDownShape.bones[b].lockRotation) + boneShapes[lookingDownShape.bones[b].bone].targetRotation = Quaternion.Euler(lookingDownShape.bones[b].bone.localEulerAngles + (newRot - lookingDownShape.bones[b].neutralRotation)); + } + else + { + if (!lookingDownShape.bones[b].lockPosition) + boneShapes[lookingDownShape.bones[b].bone].targetPosition = newPos; + if (!lookingDownShape.bones[b].lockRotation) + boneShapes[lookingDownShape.bones[b].bone].targetRotation = Quaternion.Euler(newRot); + } + + if (!lookingDownShape.bones[b].lockPosition) + boneShapes[lookingDownShape.bones[b].bone].storedPosition = Vector3.Lerp(boneShapes[lookingDownShape.bones[b].bone].storedPosition, boneShapes[lookingDownShape.bones[b].bone].targetPosition, Time.deltaTime * eyeTurnSpeed); + if (!lookingDownShape.bones[b].lockRotation) + boneShapes[lookingDownShape.bones[b].bone].storedRotation = Quaternion.Lerp(boneShapes[lookingDownShape.bones[b].bone].storedRotation, boneShapes[lookingDownShape.bones[b].bone].targetRotation, Time.deltaTime * eyeTurnSpeed); + } + } + + if (randomBlend.x >= 0) + { + // Looking Right Range + for (int b = 0; b < lookingRightShape.blendShapes.Count; b++) + { + if (blinkingControlMode == ControlMode.PoseBased) + { + if (!(blinkingShape.blendShapes.Contains(lookingRightShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingRightShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingRightShape.blendShapes[b]), Mathf.Lerp(0, lookingRightShape.weights[b], randomBlend.x), Time.deltaTime * eyeTurnSpeed)); + } + } + else + { + if (!((leftEyeBlinkBlendable == lookingRightShape.blendShapes[b] || rightEyeBlinkBlendable == lookingRightShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingRightShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingRightShape.blendShapes[b]), Mathf.Lerp(0, lookingRightShape.weights[b], randomBlend.x), Time.deltaTime * eyeTurnSpeed)); + } + } + } + + for (int b = 0; b < lookingRightShape.bones.Count; b++) + { + + if (blinkingControlMode == ControlMode.PoseBased) + { + if (blinkingShape.HasBone(lookingRightShape.bones[b].bone) && (blinking || keepEyesClosed)) + { + continue; + } + } + + Vector3 newPos = Vector3.Lerp(lookingRightShape.bones[b].neutralPosition, lookingRightShape.bones[b].endPosition, randomBlend.x) - lookingRightShape.bones[b].neutralPosition; + Vector3 newRot = Vector3LerpAngle(lookingRightShape.bones[b].neutralRotation, lookingRightShape.bones[b].endRotation, randomBlend.x) - lookingRightShape.bones[b].neutralRotation; + + if (!lookingRightShape.bones[b].lockPosition) + boneShapes[lookingRightShape.bones[b].bone].targetPosition = lookingRightShape.bones[b].bone.localPosition + newPos; + if (!lookingRightShape.bones[b].lockRotation) + boneShapes[lookingRightShape.bones[b].bone].targetRotation = Quaternion.Euler(lookingRightShape.bones[b].bone.localEulerAngles + newRot); + + if (!lookingRightShape.bones[b].lockPosition) + boneShapes[lookingRightShape.bones[b].bone].storedPosition = Vector3.Lerp(boneShapes[lookingRightShape.bones[b].bone].storedPosition, boneShapes[lookingRightShape.bones[b].bone].targetPosition, Time.deltaTime * eyeTurnSpeed); + if (!lookingRightShape.bones[b].lockRotation) + boneShapes[lookingRightShape.bones[b].bone].storedRotation = Quaternion.Lerp(boneShapes[lookingRightShape.bones[b].bone].storedRotation, boneShapes[lookingRightShape.bones[b].bone].targetRotation, Time.deltaTime * eyeTurnSpeed); + } + } + else + { + // Looking Left Range + for (int b = 0; b < lookingLeftShape.blendShapes.Count; b++) + { + if (blinkingControlMode == ControlMode.PoseBased) + { + if (!(blinkingShape.blendShapes.Contains(lookingLeftShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingLeftShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingRightShape.blendShapes[b]), Mathf.Lerp(0, lookingLeftShape.weights[b], -randomBlend.x), Time.deltaTime * eyeTurnSpeed)); + } + } + else + { + if (!((leftEyeBlinkBlendable == lookingLeftShape.blendShapes[b] || rightEyeBlinkBlendable == lookingLeftShape.blendShapes[b]) && (blinking || keepEyesClosed))) + { + blendSystem.SetBlendableValue(lookingLeftShape.blendShapes[b], Mathf.Lerp(blendSystem.GetBlendableValue(lookingRightShape.blendShapes[b]), Mathf.Lerp(0, lookingLeftShape.weights[b], -randomBlend.x), Time.deltaTime * eyeTurnSpeed)); + } + } + } + + for (int b = 0; b < lookingLeftShape.bones.Count; b++) + { + + if (blinkingControlMode == ControlMode.PoseBased) + { + if (blinkingShape.HasBone(lookingLeftShape.bones[b].bone) && (blinking || keepEyesClosed)) + { + continue; + } + } + + Vector3 newPos = Vector3.Lerp(lookingLeftShape.bones[b].neutralPosition, lookingLeftShape.bones[b].endPosition, -randomBlend.x) - lookingLeftShape.bones[b].neutralPosition; + Vector3 newRot = Vector3LerpAngle(lookingLeftShape.bones[b].neutralRotation, lookingLeftShape.bones[b].endRotation, -randomBlend.x) - lookingLeftShape.bones[b].neutralRotation; + + if (!lookingLeftShape.bones[b].lockPosition) + boneShapes[lookingLeftShape.bones[b].bone].targetPosition = lookingLeftShape.bones[b].bone.localPosition + newPos; + if (!lookingLeftShape.bones[b].lockRotation) + boneShapes[lookingLeftShape.bones[b].bone].targetRotation = Quaternion.Euler(lookingLeftShape.bones[b].bone.localEulerAngles + newRot); + + if (!lookingLeftShape.bones[b].lockPosition) + boneShapes[lookingLeftShape.bones[b].bone].storedPosition = Vector3.Lerp(boneShapes[lookingLeftShape.bones[b].bone].storedPosition, boneShapes[lookingLeftShape.bones[b].bone].targetPosition, Time.deltaTime * eyeTurnSpeed); + if (!lookingLeftShape.bones[b].lockRotation) + boneShapes[lookingLeftShape.bones[b].bone].storedRotation = Quaternion.Lerp(boneShapes[lookingLeftShape.bones[b].bone].storedRotation, boneShapes[lookingLeftShape.bones[b].bone].targetRotation, Time.deltaTime * eyeTurnSpeed); + } + } + } + } + } + + private IEnumerator CloseEyes () + { + bool end = false; + blinkTimer = 0; + _asyncBlending = true; + + while (end == false) + { + if (blinkingControlMode == ControlMode.Classic) + { + blendSystem.SetBlendableValue(leftEyeBlinkBlendable, Mathf.Lerp(0, 100, blinkTimer / blinkDuration)); + blendSystem.SetBlendableValue(rightEyeBlinkBlendable, Mathf.Lerp(0, 100, blinkTimer / blinkDuration)); + } + else + { + for (int b = 0; b < blinkingShape.blendShapes.Count; b++) + { + blendSystem.SetBlendableValue(blinkingShape.blendShapes[b], Mathf.Lerp(0, 100, blinkTimer / blinkDuration)); + } + + for (int b = 0; b < blinkingShape.bones.Count; b++) + { + if (boneUpdateAnimation) + { + Vector3 newPos = Vector3.Lerp(blinkingShape.bones[b].neutralPosition, blinkingShape.bones[b].endPosition, blinkTimer / blinkDuration) - blinkingShape.bones[b].neutralPosition; + Vector3 newRot = Vector3.Lerp(blinkingShape.bones[b].neutralRotation, blinkingShape.bones[b].endRotation, blinkTimer / blinkDuration) - blinkingShape.bones[b].neutralRotation; + + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition += newPos; + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles += newRot; + } + else + { + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition = Vector3.Lerp(blinkingShape.bones[b].neutralPosition, blinkingShape.bones[b].endPosition, blinkTimer / blinkDuration); + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles = Vector3.Lerp(blinkingShape.bones[b].neutralRotation, blinkingShape.bones[b].endRotation, blinkTimer / blinkDuration); + } + } + } + + if (blinkTimer > blinkDuration) + { + end = true; + _asyncBlending = false; + } + + blinkTimer += Time.deltaTime; + yield return null; + } + } + + private IEnumerator OpenEyes () + { + bool end = false; + blinkTimer = 0; + _asyncBlending = true; + + while (end == false) + { + if (blinkingControlMode == ControlMode.Classic) + { + blendSystem.SetBlendableValue(leftEyeBlinkBlendable, Mathf.Lerp(100, 0, blinkTimer / blinkDuration)); + blendSystem.SetBlendableValue(rightEyeBlinkBlendable, Mathf.Lerp(100, 0, blinkTimer / blinkDuration)); + } + else + { + for (int b = 0; b < blinkingShape.blendShapes.Count; b++) + { + blendSystem.SetBlendableValue(blinkingShape.blendShapes[b], Mathf.Lerp(100, 0, blinkTimer / blinkDuration)); + } + + for (int b = 0; b < blinkingShape.bones.Count; b++) + { + if (boneUpdateAnimation) + { + Vector3 newPos = Vector3.Lerp(blinkingShape.bones[b].endPosition, blinkingShape.bones[b].neutralPosition, blinkTimer / blinkDuration) - blinkingShape.bones[b].neutralPosition; + Vector3 newRot = Vector3.Lerp(blinkingShape.bones[b].endRotation, blinkingShape.bones[b].neutralRotation, blinkTimer / blinkDuration) - blinkingShape.bones[b].neutralRotation; + + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition += newPos; + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles += newRot; + } + else + { + if (!blinkingShape.bones[b].lockPosition) + blinkingShape.bones[b].bone.localPosition = Vector3.Lerp(blinkingShape.bones[b].endPosition, blinkingShape.bones[b].neutralPosition, blinkTimer / blinkDuration); + if (!blinkingShape.bones[b].lockRotation) + blinkingShape.bones[b].bone.localEulerAngles = Vector3.Lerp(blinkingShape.bones[b].endRotation, blinkingShape.bones[b].neutralRotation, blinkTimer / blinkDuration); + } + } + } + + if (blinkTimer > blinkDuration) + { + end = true; + _asyncBlending = false; + } + + blinkTimer += Time.deltaTime; + yield return null; + } + } + + private void FixDummyHierarchy () + { + if (LeftEyeLookAtBone == null || RightEyeLookAtBone == null) + return; + + if (!leftEyeDummy || !rightEyeDummy) + { + leftEyeDummy = new GameObject("Left Eye Dummy").transform; + leftEyeDummy.gameObject.hideFlags = HideFlags.DontSave; + } + + if(!rightEyeDummy) + { + rightEyeDummy = new GameObject("Right Eye Dummy").transform; + rightEyeDummy.gameObject.hideFlags = HideFlags.DontSave; + } + + // Restore original hierarchy + if (leftEyeDummy.childCount > 0) + { + for (int i = 0; i < leftEyeDummy.childCount; i++) + { + leftEyeDummy.GetChild(i).SetParent(leftEyeDummy.parent, true); + + } + } + + if (rightEyeDummy.childCount > 0) + { + for (int i = 0; i < rightEyeDummy.childCount; i++) + { + rightEyeDummy.GetChild(i).SetParent(rightEyeDummy.parent, true); + } + } + + // Reparent new bones + leftEyeDummy.SetParent(LeftEyeLookAtBone.parent, false); + rightEyeDummy.SetParent(RightEyeLookAtBone.parent, false); + leftEyeDummy.position = LeftEyeLookAtBone.position; + leftEyeDummy.rotation = LeftEyeLookAtBone.rotation; + rightEyeDummy.position = RightEyeLookAtBone.position; + rightEyeDummy.rotation = RightEyeLookAtBone.rotation; + LeftEyeLookAtBone.SetParent(leftEyeDummy, true); + RightEyeLookAtBone.SetParent(rightEyeDummy, true); + } + + /// + /// Finds potential look targets using the autoTargetTag. + /// + public void FindTargets () + { + GameObject[] gos = GameObject.FindGameObjectsWithTag(autoTargetTag); + markedTargets = new Transform[gos.Length]; + + for (int i = 0; i < markedTargets.Length; i++) + { + markedTargets[i] = gos[i].transform; + } + } + + public static Vector3 Vector3LerpAngle (Vector3 a, Vector3 b, float t) + { + return new Vector3( + Mathf.LerpAngle(a.x, b.x, t), + Mathf.LerpAngle(a.y, b.y, t), + Mathf.LerpAngle(a.z, b.z, t) + ); + } + + public void SetLookAtAmount (float amount) + { + targetWeight = amount; + } + + public enum ControlMode + { + Classic, + PoseBased + } + + public enum Axis + { + X_Positive, + X_Negative, + Y_Positive, + Y_Negative, + Z_Positive, + Z_Negative, + } + + public class BoneShapeInfo + { + private Transform bone; + + private Vector3 m_storedPosition; + private Quaternion m_storedRotation; + + public Vector3 storedPosition + { + get + { + return m_storedPosition; + } + + set + { + m_storedPosition = value; + bone.localPosition = value; + } + } + public Quaternion storedRotation + { + get + { + return m_storedRotation; + } + + set + { + m_storedRotation = value; + bone.localRotation = value; + } + } + + public Vector3 targetPosition; + public Quaternion targetRotation; + + public BoneShapeInfo (BoneShape boneShape) + { + bone = boneShape.bone; + m_storedPosition = boneShape.neutralPosition; + m_storedRotation = Quaternion.Euler(boneShape.neutralRotation); + } + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/EyeController.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/EyeController.cs.meta new file mode 100644 index 0000000..b281b2f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/EyeController.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c4c3c6345ee104b4695e6f7a2c098f3a +timeCreated: 1454011352 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 4958800ee87bc6240824ed379cf13e0b, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/LipSync.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/LipSync.cs new file mode 100644 index 0000000..9bdb49c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/LipSync.cs @@ -0,0 +1,2629 @@ +using UnityEngine; +using UnityEngine.Events; +using System.Collections; +using System.Collections.Generic; +using System.Xml; + +namespace RogoDigital.Lipsync +{ + + [AddComponentMenu("Rogo Digital/LipSync Pro")] + [DisallowMultipleComponent] + [UnityEngine.HelpURL("https://lipsync.rogodigital.com/documentation/lipsync.php")] + public class LipSync : BlendSystemUser + { +#pragma warning disable 618 + + // Public Variables + + /// + /// AudioSource used for playing dialogue + /// + public AudioSource audioSource; + + /// + /// Allow bones to be used in phoneme shapes. + /// + public bool useBones = false; + + /// + /// Used for deciding if/when to repose boneshapes in LateUpdate. + /// + public bool boneUpdateAnimation = false; + + /// + /// All PhonemeShapes on this LipSync instance. + /// PhonemeShapes are a list of blendables and + /// weights associated with a particular phoneme. + /// + [SerializeField] + public List phonemes = new List(); + + /// + /// All EmotionShapes on this LipSync instance. + /// EmotionShapes are simply PhonemeShapes, but + /// with a string identifier instead of a Phoneme. + /// Emotions are set up in the Project Settings. + /// + [SerializeField] + public List emotions = new List(); + + /// + /// If checked, the component will play defaultClip on awake. + /// + public bool playOnAwake = false; + + /// + /// If checked, the clip will play again when it finishes. + /// + public bool loop = false; + + /// + /// The clip to be played when playOnAwake is checked. + /// + public LipSyncData defaultClip = null; + + /// + /// The delay between calling Play() and the clip playing. + /// + public float defaultDelay = 0f; + + /// + /// If true, audio playback speed will match the timescale setting (allows slow or fast motion speech) + /// + public bool scaleAudioSpeed = true; + + [SerializeField] + private AnimationTimingMode m_animationTimingMode = AnimationTimingMode.AudioPlayback; + /// + /// How animation playback is timed. AudioPlayback is linked to the audio position. FixedFrameRate assumes a constant speed (useful for offline rendering). + /// + public AnimationTimingMode animationTimingMode + { + get + { + return m_animationTimingMode; + } + set + { +#if UNITY_WEBGL + if(value == AnimationTimingMode.AudioPlayback) { + Debug.LogError("AnimationTimingMode.AudioPlayback is not supported on WebGL. Falling back to AnimationTimingMode.CustomTimer"); + m_animationTimingMode = AnimationTimingMode.CustomTimer; + } else { + m_animationTimingMode = value; + } +#endif + m_animationTimingMode = value; + } + } + + /// + /// The framerate used for fixed framerate rendering. + /// + public int frameRate = 30; + + /// + /// If there are no phonemes within this many seconds + /// of the previous one, a rest will be inserted. + /// + public float restTime = 0.2f; + + /// + /// The time, in seconds, that a shape will be held for + /// before blending to neutral when a rest is inserted. + /// + public float restHoldTime = 0.4f; + + /// + /// The method used for generating curve tangents. Tight will ensure poses + /// are matched exactly, but can make movement robotic, Loose will look + /// more natural but can can cause poses to be over-emphasized. + /// + public CurveGenerationMode phonemeCurveGenerationMode = CurveGenerationMode.Loose; + + /// + /// The method used for generating curve tangents. Tight will ensure poses + /// are matched exactly, but can make movement robotic, Loose will look + /// more natural but can can cause poses to be over-emphasized. + /// + public CurveGenerationMode emotionCurveGenerationMode = CurveGenerationMode.Tight; + + /// + /// If true, any emotion marker that doesn't blend out before the end of the clip + /// will stay active when the clip finishes. + /// + public bool keepEmotionWhenFinished = false; + + /// + /// If true, will set the neutral position, rotation and scale for each bone (i.e. the transformation + /// used when a bone isn't used in the current pose) to the position, rotation and scale the bone is in + /// at the start of the scene. + /// + public bool setNeutralBonePosesOnStart = false; + + /// + /// Whether or not there is currently a LipSync animation playing. + /// + public bool IsPlaying + { + get; + private set; + } + + /// + /// Whether the currently playing animation is paused. + /// + public bool IsPaused + { + get; + private set; + } + + /// + /// Whether the currently playing animation is transitioning back to neutral. + /// + public bool IsStopping + { + get; + private set; + } + + /// + /// Gets the current playback time, in seconds. + /// + public float CurrentTime + { + get + { + if (!IsPlaying) + return 0; + + switch (animationTimingMode) + { + case AnimationTimingMode.AudioPlayback: + return audioSource.time; + default: + return customTimer; + } + } + } + + /// + /// The Animator component used for Gestures. + /// + public Animator gesturesAnimator; + + /// + /// The Gestures layer. + /// + public int gesturesLayer; + + /// + /// The animation clips used for gestures. + /// + public List gestures; + + /// + /// Called when a clip finished playing. + /// + public UnityEvent onFinishedPlaying; + +#if UNITY_EDITOR + /// + /// Used for updating Clip Editor previews. Only available in the editor. + /// + public BlendSystem.BlendSystemGenericDelegate onSettingsChanged; +#endif + + // Private Variables + + private AudioClip audioClip; + private bool ready = false; + private Dictionary emotionCache; + private int currentFileID = 0; + private LipSyncData lastClip; + + private float emotionBlendTime = 0; + private float emotionTimer = 0; + private bool changingEmotion = false; + private int customEmotion = -1; + private float customTimer = 0; + private bool isDelaying = false; + + // Marker Data + private List phonemeMarkers; + private List emotionMarkers; + private List gestureMarkers; + private float fileLength; + + private int nextGesture = 0; + + // Curves + private List indexBlendables; + private List animCurves; + private List bones; + private List boneCurves; + private List boneNeutralPositions; + private List boneNeutralScales; + private List boneNeutralRotations; + + // Used by the editor + public ResetDelegate reset; + public float lastUsedVersion = 0; + + public delegate void ResetDelegate(); + + void Reset() + { + CleanUpBlendSystems(); + if (reset != null) + reset.Invoke(); + } + + void Awake() + { + + // Get reference to attached AudioSource + if (audioSource == null) + audioSource = GetComponent(); + + // Ensure BlendSystem is set to allow animation + if (audioSource == null) + { + Debug.LogError("[LipSync - " + gameObject.name + "] No AudioSource specified or found."); + return; + } + else if (blendSystem == null) + { + Debug.LogError("[LipSync - " + gameObject.name + "] No BlendSystem set."); + return; + } + else if (blendSystem.isReady == false) + { + Debug.LogError("[LipSync - " + gameObject.name + "] BlendSystem is not set up."); + return; + } + else + { + ready = true; + } + + // Check for old-style settings + if (restTime < 0.1f) + { + Debug.LogWarning("[LipSync - " + gameObject.name + "] Rest Time and/or Hold Time are lower than recommended and may cause animation errors. From LipSync 0.6, Rest Time is recommended to be 0.2 and Hold Time is recommended to be 0.1"); + } + + // Cache Emotions for more performant cross-checking + emotionCache = new Dictionary(); + foreach (EmotionShape emotionShape in emotions) + { + if (emotionCache.ContainsKey(emotionShape.emotion)) + { + Debug.LogWarning("[LipSync - " + gameObject.name + "] Project Settings contains more than 1 emotion called \"" + emotionShape.emotion + "\". Duplicates will be ignored."); + } + else + { + if (setNeutralBonePosesOnStart) + { + foreach (BoneShape bone in emotionShape.bones) + { + bone.SetNeutral(); + } + } + + emotionCache.Add(emotionShape.emotion, emotionShape); + } + } + + // Check validity of Gestures + if (gesturesAnimator != null) + { + foreach (GestureInstance gesture in gestures) + { + if (!gesture.IsValid(gesturesAnimator)) + { + Debug.LogWarning("[LipSync - " + gameObject.name + "] Animator does not contain a trigger called '" + gesture.triggerName + "'. This Gesture will be ignored."); + } + } + } + + // Start Playing if playOnAwake is set + if (playOnAwake && defaultClip != null) + Play(defaultClip, defaultDelay); + } + + + void LateUpdate() + { + if ((IsPlaying && !IsPaused) || changingEmotion || IsStopping) + { + // Scale audio speed if set + if (scaleAudioSpeed && !changingEmotion) + audioSource.pitch = Time.timeScale; + + if (isDelaying) + { + customTimer -= Time.deltaTime; + if (customTimer <= 0) + isDelaying = false; + return; + } + + float normalisedTimer = 0; + + if (IsPlaying || IsStopping) + { + // Update timer based on animationTimingMode + if (animationTimingMode == AnimationTimingMode.AudioPlayback && audioClip != null && IsPlaying) + { + // Use AudioSource playback only if an audioClip is present. + normalisedTimer = audioSource.time / audioClip.length; + } + else if (animationTimingMode == AnimationTimingMode.CustomTimer || (animationTimingMode == AnimationTimingMode.AudioPlayback && audioClip == null) || IsStopping) + { + // Play at same rate, but don't tie to audioclip. Fallback for AnimationTimingMode.AudioPlayback when no clip is present. + customTimer += Time.deltaTime; + normalisedTimer = customTimer / (IsStopping ? restHoldTime : fileLength); + } + else if (animationTimingMode == AnimationTimingMode.FixedFrameRate) + { + // Play animation at a fixed framerate for offline rendering. + customTimer += 1f / frameRate; + normalisedTimer = customTimer / fileLength; + } + + + // Gesture cues + if (gestures.Count > 0 && nextGesture < gestureMarkers.Count && gesturesAnimator != null && !IsStopping) + { + if (normalisedTimer >= gestureMarkers[nextGesture].time) + { + // Gesture Cue has been reached + if (GetGesture(gestureMarkers[nextGesture].gesture) != null) + { + gesturesAnimator.SetTrigger(GetGesture(gestureMarkers[nextGesture].gesture).triggerName); + } + nextGesture++; + } + } + } + else + { + // Get normalised timer from custom timer + emotionTimer += Time.deltaTime; + normalisedTimer = emotionTimer / emotionBlendTime; + } + + // Go through each animCurve and update blendables + for (int curve = 0; curve < animCurves.Count; curve++) + { + blendSystem.SetBlendableValue(indexBlendables[curve], animCurves[curve].Evaluate(normalisedTimer)); + } + + // Do the same for bones + if (useBones && boneCurves != null) + { + for (int curve = 0; curve < boneCurves.Count; curve++) + { + if (boneUpdateAnimation == false) + { + bones[curve].localPosition = boneCurves[curve].EvaluatePosition(normalisedTimer); + bones[curve].localRotation = boneCurves[curve].EvaluateRotation(normalisedTimer); + bones[curve].localScale = boneCurves[curve].EvaluateScale(normalisedTimer); + } + else + { + // Get transform relative to current animation frame + Vector3 newPos = boneCurves[curve].EvaluatePosition(normalisedTimer) - boneNeutralPositions[curve]; + Vector3 newRot = boneCurves[curve].EvaluateRotation(normalisedTimer).eulerAngles - boneNeutralRotations[curve].eulerAngles; + Vector3 newScale = boneCurves[curve].EvaluateScale(normalisedTimer) - boneNeutralScales[curve]; + + bones[curve].localPosition += newPos; + bones[curve].localEulerAngles += newRot; + bones[curve].localScale += newScale; + } + } + } + + if (changingEmotion && normalisedTimer > 1) + changingEmotion = false; + + if ((normalisedTimer >= 0.98f) && !changingEmotion) + { + if (IsStopping) + { + IsStopping = false; + } + else + { + if (loop) + { + Stop(false); + Play(lastClip); + } + else + { + Stop(false); + } + } + } + } + } + + // Public Functions + + /// + /// Sets the emotion. + /// Only works when not playing an animation. + /// + /// Emotion. + /// Blend time. + public void SetEmotion(string emotion, float blendTime) + { + if (!IsPlaying && ready && enabled) + { + EmotionShape emote = null; + + if (emotion == "") + { + emote = new EmotionShape("temp"); + } + else + { + if (emotions.IndexOf(emotionCache[emotion]) == customEmotion) + return; + + // Get Blendables + emote = emotionCache[emotion]; + } + + // Init Curves + animCurves = new List(); + indexBlendables = new List(); + + if (useBones) + { + boneCurves = new List(); + bones = new List(); + } + + for (int b = 0; b < emote.blendShapes.Count; b++) + { + indexBlendables.Add(emote.blendShapes[b]); + animCurves.Add(new AnimationCurve()); + } + + if (useBones) + { + for (int b = 0; b < emote.bones.Count; b++) + { + bones.Add(emote.bones[b].bone); + boneCurves.Add(new TransformAnimationCurve()); + } + } + + if (customEmotion > -1) + { + // Add Previous Emotion blendables + for (int b = 0; b < emotions[customEmotion].blendShapes.Count; b++) + { + if (!indexBlendables.Contains(emotions[customEmotion].blendShapes[b])) + { + indexBlendables.Add(emotions[customEmotion].blendShapes[b]); + animCurves.Add(new AnimationCurve()); + } + } + + if (useBones) + { + for (int b = 0; b < emotions[customEmotion].bones.Count; b++) + { + if (!bones.Contains(emotions[customEmotion].bones[b].bone)) + { + bones.Add(emotions[customEmotion].bones[b].bone); + boneCurves.Add(new TransformAnimationCurve()); + } + } + } + } + + // Get Keys + if (customEmotion > -1) + { + for (int b = 0; b < emotions[customEmotion].blendShapes.Count; b++) + { + int matchingCurve = indexBlendables.IndexOf(emotions[customEmotion].blendShapes[b]); + animCurves[matchingCurve].AddKey(new Keyframe(0, blendSystem.GetBlendableValue(emotions[customEmotion].blendShapes[b]), 90, 0)); + } + + for (int b = 0; b < animCurves.Count; b++) + { + if (animCurves[b].keys.Length > 0) + { + if (emote.blendShapes.Contains(indexBlendables[b])) + { + animCurves[b].AddKey(new Keyframe(1, emote.weights[emote.blendShapes.IndexOf(indexBlendables[b])], 0, 90)); + } + else + { + animCurves[b].AddKey(new Keyframe(1, 0, 0, 90)); + } + } + else + { + animCurves[b].AddKey(new Keyframe(0, blendSystem.GetBlendableValue(indexBlendables[b]), 90, 0)); + int match = emote.blendShapes.IndexOf(indexBlendables[b]); + animCurves[b].AddKey(new Keyframe(1, emote.weights[match], 0, 90)); + } + } + + if (useBones && boneCurves != null) + { + for (int b = 0; b < emotions[customEmotion].bones.Count; b++) + { + int matchingCurve = bones.IndexOf(emotions[customEmotion].bones[b].bone); + boneCurves[matchingCurve].AddKey(0, emotions[customEmotion].bones[b].bone.localPosition, emotions[customEmotion].bones[b].bone.localRotation, emotions[customEmotion].bones[b].bone.localScale, 90, 0); + } + + for (int b = 0; b < boneCurves.Count; b++) + { + if (boneCurves[b].length > 0) + { + if (emote.HasBone(bones[b])) + { + boneCurves[b].AddKey(1, emote.bones[emote.IndexOfBone(bones[b])].endPosition, Quaternion.Euler(emote.bones[emote.IndexOfBone(bones[b])].endRotation), emote.bones[emote.IndexOfBone(bones[b])].endScale, 0, 90); + } + else + { + boneCurves[b].AddKey(1, emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(bones[b])].neutralPosition, Quaternion.Euler(emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(bones[b])].neutralRotation), emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(bones[b])].neutralScale, 0, 90); + } + } + else + { + boneCurves[b].AddKey(0, bones[b].localPosition, bones[b].localRotation, bones[b].localScale, 90, 0); + int match = emote.IndexOfBone(bones[b]); + boneCurves[b].AddKey(1, emote.bones[match].endPosition, Quaternion.Euler(emote.bones[match].endRotation), emote.bones[match].endScale, 0, 90); + } + } + } + } + else + { + for (int b = 0; b < animCurves.Count; b++) + { + animCurves[b].AddKey(new Keyframe(0, blendSystem.GetBlendableValue(indexBlendables[b]), 90, 0)); + animCurves[b].AddKey(new Keyframe(1, emote.weights[b], 0, 90)); + } + + if (useBones && boneCurves != null) + { + for (int b = 0; b < boneCurves.Count; b++) + { + boneCurves[b].AddKey(0, bones[b].localPosition, bones[b].localRotation, bones[b].localScale, 90, 0); + boneCurves[b].AddKey(1, emote.bones[b].endPosition, Quaternion.Euler(emote.bones[b].endRotation), emote.bones[b].endScale, 0, 90); + } + } + } + + // Fix Quaternion rotations (Credit: Chris Lewis) + foreach (TransformAnimationCurve curve in boneCurves) + { + curve.FixQuaternionContinuity(); + } + + emotionTimer = 0; + emotionBlendTime = blendTime; + customEmotion = emotions.IndexOf(emote); + changingEmotion = true; + } + } + + /// + /// Resets a custom set emotion back to neutral. + /// + /// + public void ResetEmotion(float blendTime) + { + SetEmotion("", blendTime); + } + + private void PlayPP(LipSyncData data, float delay, float time) + { + if (data.targetComponentID != GetInstanceID()) + { + Debug.LogWarning("Playing pre-processed clip on a different character. The animation may look incorrect or not play at all. You can remove the pre-processed data by selecting the clip in the Project window."); + } + + // Standard Data + phonemeMarkers = new List(data.phonemeData); + emotionMarkers = new List(data.emotionData); + gestureMarkers = new List(data.gestureData); + gestureMarkers.Sort(SortTime); + + lastClip = data; + currentFileID = data.GetInstanceID(); + audioClip = data.clip; + fileLength = data.length; + if (audioSource) + audioSource.clip = audioClip; + + // Processed Data + animCurves = new List(data.animCurves); + indexBlendables = data.indexBlendables; + bones = data.bones; + boneCurves = new List(data.boneCurves); + boneNeutralPositions = data.boneNeutralPositions; + boneNeutralRotations = data.boneNeutralRotations; + boneNeutralScales = data.boneNeutralScales; + + if (gesturesAnimator != null && gestures != null) + { + if (gestures.Count > 0) + { + gesturesAnimator.SetLayerWeight(gesturesLayer, 1); + } + } + else + { + if (data.gestureData.Length > 0) + { + Debug.Log("[LipSync - " + gameObject.name + "] Animator or Gestures are not set up. Gestures from this clip won't be played."); + } + } + + IsPlaying = true; + IsPaused = false; + nextGesture = 0; + IsStopping = false; + + if (audioClip && delay > 0) + { + isDelaying = true; + customTimer = time + delay; + } + else + { + isDelaying = false; + customTimer = time; + } + + // Play audio + if (audioClip && audioSource) + audioSource.PlayDelayed(time + delay); + } + + /// + /// Loads a LipSyncData file if necessary and + /// then plays it on the current LipSync component. + /// + public void Play(LipSyncData dataFile, float delay) + { + if (ready && enabled) + { + if (dataFile.isPreprocessed) + { + PlayPP(dataFile, delay, 0); + return; + } + + // Load File if not already loaded + bool loadSuccessful = true; + if (dataFile.GetInstanceID() != currentFileID || customEmotion > -1) + { + loadSuccessful = LoadData(dataFile); + } + if (!loadSuccessful) + return; + + ProcessData(); + + if (gesturesAnimator != null && gestures != null) + { + if (gestures.Count > 0) + { + gesturesAnimator.SetLayerWeight(gesturesLayer, 1); + } + } + else + { + if (dataFile.gestureData.Length > 0) + { + Debug.Log("[LipSync - " + gameObject.name + "] Animator or Gestures are not set up. Gestures from this clip won't be played."); + } + } + + // Set variables + IsPlaying = true; + IsPaused = false; + nextGesture = 0; + IsStopping = false; + + if (audioClip && delay > 0) + { + isDelaying = true; + customTimer = delay; + } + else + { + isDelaying = false; + customTimer = 0; + } + + // Play audio + if (audioClip && audioSource) + audioSource.PlayDelayed(delay); + } + } + + /// + /// Overload of Play with no delay specified. For compatibility with pre 0.4 scripts. + /// + public void Play(LipSyncData dataFile) + { + Play(dataFile, 0); + } + + /// + /// Loads an XML file and parses LipSync data from it, + /// then plays it on the current LipSync component. + /// + public void Play(TextAsset xmlFile, AudioClip clip, float delay) + { + if (ready && enabled) + { + // Load File + LoadXML(xmlFile, clip); + + if (gesturesAnimator != null) + gesturesAnimator.SetLayerWeight(gesturesLayer, 1); + + // Set variables + IsPlaying = true; + IsPaused = false; + nextGesture = 0; + IsStopping = false; + + ProcessData(); + + if (audioClip && delay > 0) + { + isDelaying = true; + customTimer = delay; + } + else + { + isDelaying = false; + customTimer = 0; + } + + // Play audio + audioSource.PlayDelayed(delay); + } + } + + /// + /// Overload of Play with no delay specified. For compatibility with pre 0.4 scripts. + /// + public void Play(TextAsset xmlFile, AudioClip clip) + { + Play(xmlFile, clip, 0); + } + + /// + /// Loads a LipSyncData file if necessary and + /// then plays it on the current LipSync component + /// from a certain point in seconds. + /// + public void PlayFromTime(LipSyncData dataFile, float delay, float time) + { + if (ready && enabled) + { + if (dataFile.isPreprocessed) + { + PlayPP(dataFile, delay, time); + return; + } + + // Load File if not already loaded + bool loadSuccessful = true; + if (dataFile.GetInstanceID() != currentFileID || customEmotion > -1) + { + loadSuccessful = LoadData(dataFile); + } + if (!loadSuccessful) + return; + + // Check that time is within range + if (time >= fileLength) + { + Debug.LogError("[LipSync - " + gameObject.name + "] Couldn't play animation. Time parameter is greater than clip length."); + return; + } + + ProcessData(); + + if (gesturesAnimator != null) + gesturesAnimator.SetLayerWeight(gesturesLayer, 1); + + // Set variables + IsPlaying = true; + IsPaused = false; + isDelaying = false; + customTimer = 0; + nextGesture = 0; + IsStopping = false; + + // Play audio + audioSource.Play(); + audioSource.time = time + delay; + } + } + + /// + /// Overload of PlayFromTime with no delay specified. + /// + public void PlayFromTime(LipSyncData dataFile, float time) + { + PlayFromTime(dataFile, 0, time); + } + + /// + /// Loads an XML file and parses LipSync data from it, + /// then plays it on the current LipSync component + /// from a certain point in seconds. + /// + public void PlayFromTime(TextAsset xmlFile, AudioClip clip, float delay, float time) + { + if (ready && enabled) + { + // Load File + LoadXML(xmlFile, clip); + + // Check that time is within range + if (time >= fileLength) + { + Debug.LogError("[LipSync - " + gameObject.name + "] Couldn't play animation. Time parameter is greater than clip length."); + return; + } + + if (gesturesAnimator != null) + gesturesAnimator.SetLayerWeight(gesturesLayer, 1); + + // Set variables + IsPlaying = true; + IsPaused = false; + isDelaying = false; + customTimer = 0; + nextGesture = 0; + IsStopping = false; + + ProcessData(); + + // Play audio + audioSource.Play(); + audioSource.time = time + delay; + } + } + + /// + /// Overload of PlayFromTime with no delay specified. + /// + public void PlayFromTime(TextAsset xmlFile, AudioClip clip, float time) + { + PlayFromTime(xmlFile, clip, 0, time); + } + + /// + /// Pauses the currently playing animation. + /// + public void Pause() + { + if (IsPlaying && !IsPaused && enabled) + { + IsPaused = true; + audioSource.Pause(); + } + } + + /// + /// Resumes the current animation after pausing. + /// + public void Resume() + { + if (IsPlaying && IsPaused && enabled) + { + IsPaused = false; + audioSource.UnPause(); + } + } + + /// + /// Completely stops the current animation to be + /// started again from the begining. + /// + public void Stop(bool stopAudio) + { + if (IsPlaying && enabled) + { + IsPlaying = false; + IsPaused = false; + isDelaying = false; + IsStopping = true; + customTimer = 0; + + // Blend out + for (int c = 0; c < animCurves.Count; c++) + { + float finalValue = animCurves[c].Evaluate(1); + float startingValue = blendSystem.GetBlendableValue(indexBlendables[c]); + + animCurves[c] = new AnimationCurve(new Keyframe[] { new Keyframe(0, startingValue), new Keyframe(1, finalValue) }); + } + + if (useBones) + { + for (int b = 0; b < boneCurves.Count; b++) + { + Vector3 finalPosition = boneCurves[b].EvaluatePosition(1); + Vector3 finalScale = boneCurves[b].EvaluateScale(1); + Quaternion finalRotation = boneCurves[b].EvaluateRotation(1); + Vector3 startingPosition = bones[b].localPosition; + Vector3 startingScale = bones[b].localScale; + Quaternion startingRotation = bones[b].localRotation; + + boneCurves[b] = new TransformAnimationCurve(); + boneCurves[b].AddKey(0, startingPosition, startingRotation, startingScale); + boneCurves[b].AddKey(1, finalPosition, finalRotation, finalScale); + } + } + + // Stop Audio + if (stopAudio) + audioSource.Stop(); + + //Invoke Callback + onFinishedPlaying.Invoke(); + } + } + + /// + /// Sets blendables to their state at a certain time in the animation. + /// ProcessData must have already been called. + /// + /// Time. + public void PreviewAtTime(float time) + { + if (!IsPlaying && enabled && animCurves != null) + { + // Sanity check + if (indexBlendables == null || animCurves == null) + { + // Data hasn't been loaded + if (phonemeMarkers == null || emotionMarkers == null) + return; + + // Otherwise, recreate animation data + ProcessData(); + } + else if (indexBlendables.Count != animCurves.Count) + { + // Data hasn't been loaded + if (phonemeMarkers == null || emotionMarkers == null) + return; + + // Otherwise, recreate animation data + ProcessData(); + } + + // Go through each animCurve and update blendables + for (int curve = 0; curve < animCurves.Count; curve++) + { + blendSystem.SetBlendableValue(indexBlendables[curve], animCurves[curve].Evaluate(time)); + } + + if (useBones && boneCurves != null) + { + for (int curve = 0; curve < boneCurves.Count; curve++) + { + if (bones[curve] != null) + bones[curve].localPosition = boneCurves[curve].EvaluatePosition(time); + if (bones[curve] != null) + bones[curve].localRotation = boneCurves[curve].EvaluateRotation(time); + } + } + } + } + + public void DisplayEmotionPose(int emotion, float intensity) + { + if (useBones) + { + foreach (BoneShape boneshape in emotions[emotion].bones) + { + if (boneshape.bone != null) + { + boneshape.bone.localPosition = Vector3.Lerp(boneshape.neutralPosition, boneshape.endPosition, intensity); + boneshape.bone.localEulerAngles = Quaternion.Slerp(Quaternion.Euler(boneshape.neutralRotation), Quaternion.Euler(boneshape.endRotation), intensity).eulerAngles; + boneshape.bone.localScale = Vector3.Lerp(boneshape.neutralScale, boneshape.endScale, intensity); + } + } + } + + for (int b = 0; b < emotions[emotion].blendShapes.Count; b++) + { + blendSystem.SetBlendableValue(emotions[emotion].blendShapes[b], emotions[emotion].weights[b] * intensity); + } + } + + public void ResetDisplayedEmotions() + { + foreach (EmotionShape shape in emotions) + { + if (useBones) + { + foreach (BoneShape boneshape in shape.bones) + { + if (boneshape.bone != null) + { + boneshape.bone.localPosition = boneshape.neutralPosition; + boneshape.bone.localEulerAngles = boneshape.neutralRotation; + boneshape.bone.localScale = boneshape.neutralScale; + } + } + } + + foreach (int blendable in shape.blendShapes) + { + blendSystem.SetBlendableValue(blendable, 0); + } + } + } + + public void PreviewAudioAtTime(float time, float length) + { + if (IsPlaying || !audioSource) + return; + + if (!audioSource.isPlaying) + { + audioSource.PlayOneShot(audioClip); + if (time <= 1) + audioSource.time = time * audioClip.length; + StartCoroutine(StopAudioSource(length)); + } + } + + /// + /// Loads raw data instead of using a serialised asset. + /// Used for previewing animations in the editor. + /// + /// Phoneme data. + /// Emotion data. + /// Audio Clip. + /// File Duration. + public void TempLoad(List pData, List eData, AudioClip clip, float duration) + { + TempLoad(pData.ToArray(), eData.ToArray(), clip, duration); + } + + /// + /// Loads raw data instead of using a serialised asset. + /// Used for previewing animations in the editor. + /// + /// Phoneme data. + /// Emotion data. + /// Audio Clip. + /// File Duration. + public void TempLoad(PhonemeMarker[] pData, EmotionMarker[] eData, AudioClip clip, float duration) + { + if (enabled) + { + if (emotionCache == null) + { + // Cache Emotions for more performant cross-checking + emotionCache = new Dictionary(); + foreach (EmotionShape emotionShape in emotions) + { + emotionCache.Add(emotionShape.emotion, emotionShape); + } + } + + // Clear/define marker lists, to overwrite any previous file + phonemeMarkers = new List(); + emotionMarkers = new List(); + + // Copy data from file into new lists + foreach (PhonemeMarker marker in pData) + { + phonemeMarkers.Add(marker); + } + foreach (EmotionMarker marker in eData) + { + emotionMarkers.Add(marker); + } + + // Phonemes are stored out of sequence in the file, for depth sorting in the editor + // Sort them by timestamp to make finding the current one faster + phonemeMarkers.Sort(SortTime); + + audioClip = clip; + fileLength = duration; + } + } + + /// + /// Processes the data into readable animation curves. + /// Do not call before loading data. + /// + public void ProcessData(bool emotionOnly = false) + { + if (enabled) + { + + #region Setup/Definition + + boneNeutralPositions = null; + boneNeutralRotations = null; + boneNeutralScales = null; + + List tempEmotionBones = null; + List tempEmotionBoneCurves = null; + + List tempBones = null; + List tempBoneCurves = null; + + List tempEmotionIndexBlendables = new List(); + List tempEmotionCurves = new List(); + + List tempIndexBlendables = new List(); + List tempCurves = new List(); + + Dictionary blendableNeutralValues = new Dictionary(); + PhonemeShape restPhoneme = null; + for (int i = 0; i < phonemes.Count; i++) + { + if (phonemes[i].phonemeName.ToLowerInvariant() == "rest") + restPhoneme = phonemes[i]; + } + + indexBlendables = new List(); + animCurves = new List(); + + phonemeMarkers.Sort(SortTime); + + if (useBones) + { + boneNeutralPositions = new List(); + boneNeutralRotations = new List(); + boneNeutralScales = new List(); + + bones = new List(); + boneCurves = new List(); + + tempBones = new List(); + tempBoneCurves = new List(); + + tempEmotionBones = new List(); + tempEmotionBoneCurves = new List(); + } + + List shapes = new List(); + #endregion + + if (!emotionOnly) + { + #region Get Phoneme Info + // Add phonemes used + foreach (PhonemeMarker marker in phonemeMarkers) + { + if (shapes.Count == phonemes.Count) + { + break; + } + + if (!shapes.Contains(phonemes[marker.phonemeNumber])) + { + shapes.Add(phonemes[marker.phonemeNumber]); + + foreach (int blendable in phonemes[marker.phonemeNumber].blendShapes) + { + if (!tempIndexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempCurves.Add(curve); + tempIndexBlendables.Add(blendable); + } + + if (!indexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + animCurves.Add(curve); + indexBlendables.Add(blendable); + } + + if (!blendableNeutralValues.ContainsKey(blendable)) + { + blendableNeutralValues.Add(blendable, 0); + } + } + + if (useBones && boneCurves != null) + { + foreach (BoneShape boneShape in phonemes[marker.phonemeNumber].bones) + { + if (!tempBones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempBoneCurves.Add(curve); + tempBones.Add(boneShape.bone); + } + + if (!bones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + boneCurves.Add(curve); + bones.Add(boneShape.bone); + + boneNeutralPositions.Add(boneShape.neutralPosition); + boneNeutralRotations.Add(Quaternion.Euler(boneShape.neutralRotation.ToNegativeEuler())); + boneNeutralScales.Add(boneShape.neutralScale); + } + } + } + } + } + #endregion + } + + #region Get Emotion Info + // Add emotions used + foreach (EmotionMarker marker in emotionMarkers) + { + + if (marker.isMixer) + { + for (int i = 0; i < marker.mixer.emotions.Count; i++) + { + if (!shapes.Contains(emotionCache[marker.mixer.emotions[i].emotion])) + { + if (emotionCache.ContainsKey(marker.mixer.emotions[i].emotion)) + { + shapes.Add(emotionCache[marker.mixer.emotions[i].emotion]); + + foreach (int blendable in emotionCache[marker.mixer.emotions[i].emotion].blendShapes) + { + if (!tempEmotionIndexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempEmotionCurves.Add(curve); + tempEmotionIndexBlendables.Add(blendable); + } + + if (!indexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + animCurves.Add(curve); + indexBlendables.Add(blendable); + } + + if (!blendableNeutralValues.ContainsKey(blendable)) + { + blendableNeutralValues.Add(blendable, 0); + } + } + + if (useBones && boneCurves != null) + { + foreach (BoneShape boneShape in emotionCache[marker.mixer.emotions[i].emotion].bones) + { + if (!tempEmotionBones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempEmotionBoneCurves.Add(curve); + tempEmotionBones.Add(boneShape.bone); + } + + if (!bones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + boneCurves.Add(curve); + bones.Add(boneShape.bone); + + boneNeutralPositions.Add(boneShape.neutralPosition); + boneNeutralRotations.Add(Quaternion.Euler(boneShape.neutralRotation.ToNegativeEuler())); + boneNeutralScales.Add(boneShape.neutralScale); + } + } + } + } + } + } + } + else if (emotionCache.ContainsKey(marker.emotion)) + { + if (emotionCache.ContainsKey(marker.emotion)) + { + if (!shapes.Contains(emotionCache[marker.emotion])) + { + shapes.Add(emotionCache[marker.emotion]); + + foreach (int blendable in emotionCache[marker.emotion].blendShapes) + { + if (!tempEmotionIndexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempEmotionCurves.Add(curve); + tempEmotionIndexBlendables.Add(blendable); + } + + if (!indexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + animCurves.Add(curve); + indexBlendables.Add(blendable); + } + + if (!blendableNeutralValues.ContainsKey(blendable)) + { + blendableNeutralValues.Add(blendable, 0); + } + } + + if (useBones && boneCurves != null) + { + foreach (BoneShape boneShape in emotionCache[marker.emotion].bones) + { + if (!tempEmotionBones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempEmotionBoneCurves.Add(curve); + tempEmotionBones.Add(boneShape.bone); + } + + if (!bones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + boneCurves.Add(curve); + bones.Add(boneShape.bone); + + boneNeutralPositions.Add(boneShape.neutralPosition); + boneNeutralRotations.Add(Quaternion.Euler(boneShape.neutralRotation.ToNegativeEuler())); + boneNeutralScales.Add(boneShape.neutralScale); + } + } + } + } + } + } + else + { + emotionMarkers.Remove(marker); + break; + } + } + #endregion + + if (!emotionOnly) + { + #region Extras (SetEmotion, Rest pose) + // Add current set emotion if applicable + if (customEmotion > -1) + { + if (!shapes.Contains(emotions[customEmotion])) + { + shapes.Add(emotions[customEmotion]); + + foreach (int blendable in emotions[customEmotion].blendShapes) + { + if (!tempEmotionIndexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempEmotionCurves.Add(curve); + tempEmotionIndexBlendables.Add(blendable); + } + + if (!indexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + animCurves.Add(curve); + indexBlendables.Add(blendable); + } + + if (!blendableNeutralValues.ContainsKey(blendable)) + { + blendableNeutralValues.Add(blendable, 0); + } + } + + if (useBones && boneCurves != null) + { + foreach (BoneShape boneShape in emotions[customEmotion].bones) + { + if (!tempEmotionBones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempEmotionBoneCurves.Add(curve); + tempEmotionBones.Add(boneShape.bone); + } + + if (!bones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + boneCurves.Add(curve); + bones.Add(boneShape.bone); + + boneNeutralPositions.Add(boneShape.neutralPosition); + boneNeutralRotations.Add(Quaternion.Euler(boneShape.neutralRotation.ToNegativeEuler())); + boneNeutralScales.Add(boneShape.neutralScale); + } + } + } + } + } + + // Add any blendable not otherwise used, that appear in the rest phoneme + if (restPhoneme != null) + { + foreach (int blendable in restPhoneme.blendShapes) + { + if (!tempIndexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempCurves.Add(curve); + tempIndexBlendables.Add(blendable); + } + + if (!indexBlendables.Contains(blendable)) + { + AnimationCurve curve = new AnimationCurve(); + curve.postWrapMode = WrapMode.Once; + animCurves.Add(curve); + indexBlendables.Add(blendable); + } + + if (!blendableNeutralValues.ContainsKey(blendable)) + { + blendableNeutralValues.Add(blendable, 0); + } + } + + if (useBones && boneCurves != null) + { + foreach (BoneShape boneShape in restPhoneme.bones) + { + if (!tempBones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + tempBoneCurves.Add(curve); + tempBones.Add(boneShape.bone); + } + + if (!bones.Contains(boneShape.bone)) + { + TransformAnimationCurve curve = new TransformAnimationCurve(); + curve.postWrapMode = WrapMode.Once; + boneCurves.Add(curve); + bones.Add(boneShape.bone); + + boneNeutralPositions.Add(boneShape.neutralPosition); + boneNeutralRotations.Add(Quaternion.Euler(boneShape.neutralRotation.ToNegativeEuler())); + boneNeutralScales.Add(boneShape.neutralScale); + } + } + } + } + + // Get neutral values + for (int i = 0; i < indexBlendables.Count; i++) + { + if (restPhoneme != null) + { + if (restPhoneme.blendShapes.Contains(indexBlendables[i])) + { + blendableNeutralValues[indexBlendables[i]] = restPhoneme.weights[restPhoneme.blendShapes.IndexOf(indexBlendables[i])]; + } + else + { + blendableNeutralValues[indexBlendables[i]] = 0; + } + } + else + { + blendableNeutralValues[indexBlendables[i]] = 0; + } + } + + if (useBones && boneCurves != null) + { + for (int i = 0; i < bones.Count; i++) + { + if (restPhoneme != null) + { + if (restPhoneme.HasBone(bones[i])) + { + boneNeutralPositions[i] = restPhoneme.bones[restPhoneme.IndexOfBone(bones[i])].endPosition; + boneNeutralRotations[i] = Quaternion.Euler(restPhoneme.bones[restPhoneme.IndexOfBone(bones[i])].endRotation); + boneNeutralScales[i] = restPhoneme.bones[restPhoneme.IndexOfBone(bones[i])].endScale; + } + } + } + } + #endregion + + #region Add Start & End Keys + // Add neutral start and end keys, or get keys from current custom emotion + for (int index = 0; index < tempCurves.Count; index++) + { + if (customEmotion == -1) + tempCurves[index].AddKey(0, blendableNeutralValues[tempIndexBlendables[index]]); + if (!keepEmotionWhenFinished) + tempCurves[index].AddKey(1, blendableNeutralValues[tempIndexBlendables[index]]); + } + + for (int index = 0; index < tempEmotionCurves.Count; index++) + { + if (customEmotion > -1) + { + if (emotions[customEmotion].blendShapes.Contains(tempEmotionIndexBlendables[index])) + { + tempEmotionCurves[index].AddKey(0, emotions[customEmotion].weights[emotions[customEmotion].blendShapes.IndexOf(tempEmotionIndexBlendables[index])]); + } + else + { + tempEmotionCurves[index].AddKey(0, blendableNeutralValues[tempEmotionIndexBlendables[index]]); + } + } + else + { + tempEmotionCurves[index].AddKey(0, blendableNeutralValues[tempEmotionIndexBlendables[index]]); + } + + // Only add end emotion key if keepEmotionWhenFinished is false + if (!keepEmotionWhenFinished) + { + tempEmotionCurves[index].AddKey(1, blendableNeutralValues[tempEmotionIndexBlendables[index]]); + } + else if (customEmotion > -1) + { + if (emotions[customEmotion].blendShapes.Contains(tempEmotionIndexBlendables[index])) + { + tempEmotionCurves[index].AddKey(1, emotions[customEmotion].weights[emotions[customEmotion].blendShapes.IndexOf(tempEmotionIndexBlendables[index])]); + } + } + } + + if (useBones && boneCurves != null) + { + for (int index = 0; index < tempBoneCurves.Count; index++) + { + if (customEmotion == -1) + tempBoneCurves[index].AddKey(0, boneNeutralPositions[bones.IndexOf(tempBones[index])], boneNeutralRotations[bones.IndexOf(tempBones[index])], boneNeutralScales[bones.IndexOf(tempBones[index])], 0, 0); + if (!keepEmotionWhenFinished) + tempBoneCurves[index].AddKey(1, boneNeutralPositions[bones.IndexOf(tempBones[index])], boneNeutralRotations[bones.IndexOf(tempBones[index])], boneNeutralScales[bones.IndexOf(tempBones[index])], 0, 0); + } + + for (int index = 0; index < tempEmotionBoneCurves.Count; index++) + { + if (customEmotion > -1) + { + if (emotions[customEmotion].HasBone(tempEmotionBones[index])) + { + tempEmotionBoneCurves[index].AddKey( + 0, + emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(tempEmotionBones[index])].endPosition, + Quaternion.Euler(emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(tempEmotionBones[index])].endRotation), + emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(tempEmotionBones[index])].endScale, + 0, + 0 + ); + } + else + { + tempEmotionBoneCurves[index].AddKey(0, boneNeutralPositions[bones.IndexOf(tempEmotionBones[index])], boneNeutralRotations[bones.IndexOf(tempEmotionBones[index])], boneNeutralScales[bones.IndexOf(tempEmotionBones[index])], 0, 0); + } + } + else + { + tempEmotionBoneCurves[index].AddKey(0, boneNeutralPositions[bones.IndexOf(tempEmotionBones[index])], boneNeutralRotations[bones.IndexOf(tempEmotionBones[index])], boneNeutralScales[bones.IndexOf(tempEmotionBones[index])], 0, 0); + } + + if (!keepEmotionWhenFinished) + { + tempEmotionBoneCurves[index].AddKey(1, boneNeutralPositions[bones.IndexOf(tempEmotionBones[index])], boneNeutralRotations[bones.IndexOf(tempEmotionBones[index])], boneNeutralScales[bones.IndexOf(tempEmotionBones[index])], 0, 0); + } + else if (customEmotion > -1) + { + if (emotions[customEmotion].HasBone(tempEmotionBones[index])) + { + tempEmotionBoneCurves[index].AddKey( + 1, + emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(tempEmotionBones[index])].endPosition, + Quaternion.Euler(emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(tempEmotionBones[index])].endRotation), + emotions[customEmotion].bones[emotions[customEmotion].IndexOfBone(tempEmotionBones[index])].endScale, + 0, + 0 + ); + } + } + } + } + #endregion + } + + #region Add Emotion Marker Keys + // Get temp keys from emotion markers + foreach (EmotionMarker marker in emotionMarkers) + { + EmotionShape shape = null; + + int variationPoints = marker.continuousVariation ? Mathf.Clamp(Mathf.FloorToInt((((marker.endTime - marker.startTime) - (marker.blendInTime - marker.blendOutTime)) * fileLength) / marker.variationFrequency), 2, 128) : 2; + float[] intensityMod = new float[variationPoints]; + float[] blendableMod = new float[variationPoints]; + float[] bonePosMod = new float[variationPoints]; + float[] boneRotMod = new float[variationPoints]; + + // Get Random Modifiers + for (int i = 0; i < variationPoints; i++) + { + if (marker.continuousVariation) + { + intensityMod[i] = Random.Range(1 - (marker.intensityVariation / 2), 1 + (marker.intensityVariation / 2)); + } + else + { + intensityMod[i] = 1; + blendableMod[i] = 1; + bonePosMod[i] = 1; + boneRotMod[i] = 1; + } + } + + if (marker.isMixer) + { + shape = marker.mixer.GetShape(this); + } + else + { + shape = emotionCache[marker.emotion]; + } + + for (int index = 0; index < tempEmotionCurves.Count; index++) + { + if (shape.blendShapes.Contains(tempEmotionIndexBlendables[index])) + { + int b = shape.blendShapes.IndexOf(tempEmotionIndexBlendables[index]); + + float startWeight = blendableNeutralValues[tempEmotionIndexBlendables[index]]; + float endWeight = blendableNeutralValues[tempEmotionIndexBlendables[index]]; + + if (marker.continuousVariation) + { + for (int i = 0; i < variationPoints; i++) + { + blendableMod[i] = Random.Range(1 - (marker.blendableVariation / 2), 1 + (marker.blendableVariation / 2)); + } + } + if (marker.blendFromMarker) + { + EmotionMarker prevMarker = emotionMarkers[emotionMarkers.IndexOf(marker) - 1]; + EmotionShape prevShape = null; + + if (prevMarker.isMixer) + { + prevShape = prevMarker.mixer.GetShape(this); + } + else + { + prevShape = emotionCache[prevMarker.emotion]; + } + + // Check if previous emotion used this blendable. + if (prevShape.blendShapes.Contains(tempEmotionIndexBlendables[index])) + { + startWeight = prevShape.weights[prevShape.blendShapes.IndexOf(tempEmotionIndexBlendables[index])] * prevMarker.intensity; + } + } + + if (marker.blendToMarker) + { + EmotionMarker nextMarker = emotionMarkers[emotionMarkers.IndexOf(marker) + 1]; + EmotionShape nextShape = null; + + if (nextMarker.isMixer) + { + nextShape = nextMarker.mixer.GetShape(this); + } + else + { + nextShape = emotionCache[nextMarker.emotion]; + } + + // Check if next emotion uses this blendable. + if (nextShape.blendShapes.Contains(tempEmotionIndexBlendables[index])) + { + endWeight = nextShape.weights[nextShape.blendShapes.IndexOf(tempEmotionIndexBlendables[index])] * nextMarker.intensity; + } + } + + if (emotionCurveGenerationMode == CurveGenerationMode.Tight) + { + tempEmotionCurves[index].AddKey(new Keyframe(marker.startTime, startWeight, 0, 0)); + for (int i = 0; i < variationPoints; i++) + { + float time = Mathf.Lerp(marker.startTime + marker.blendInTime, marker.endTime + marker.blendOutTime, (float)i / (float)(variationPoints - 1)); + tempEmotionCurves[index].AddKey(new Keyframe(time, shape.weights[b] * marker.intensity * intensityMod[i] * blendableMod[i], 0, 0)); + } + tempEmotionCurves[index].AddKey(new Keyframe(marker.endTime, endWeight, 0, 0)); + } + else if (emotionCurveGenerationMode == CurveGenerationMode.Loose) + { + tempEmotionCurves[index].AddKey(marker.startTime, startWeight); + for (int i = 0; i < variationPoints; i++) + { + float time = Mathf.Lerp(marker.startTime + marker.blendInTime, marker.endTime + marker.blendOutTime, (float)i / (float)(variationPoints - 1)); + tempEmotionCurves[index].AddKey(time, shape.weights[b] * marker.intensity * intensityMod[i] * blendableMod[i]); + } + tempEmotionCurves[index].AddKey(marker.endTime, endWeight); + } + + } + else + { + if (emotionCurveGenerationMode == CurveGenerationMode.Tight) + { + tempEmotionCurves[index].AddKey(new Keyframe(marker.startTime + marker.blendInTime, 0, 0, 0)); + tempEmotionCurves[index].AddKey(new Keyframe(marker.endTime + marker.blendOutTime, 0, 0, 0)); + } + else if (emotionCurveGenerationMode == CurveGenerationMode.Loose) + { + tempEmotionCurves[index].AddKey(marker.startTime + marker.blendInTime, 0); + tempEmotionCurves[index].AddKey(marker.endTime + marker.blendOutTime, 0); + } + + if (marker.blendToMarker) + { + EmotionMarker nextMarker = emotionMarkers[emotionMarkers.IndexOf(marker) + 1]; + EmotionShape nextShape = null; + + if (nextMarker.isMixer) + { + nextShape = nextMarker.mixer.GetShape(this); + } + else + { + nextShape = emotionCache[nextMarker.emotion]; + } + + // Check if next emotion uses this blendable. + if (nextShape.blendShapes.Contains(tempEmotionIndexBlendables[index])) + { + if (emotionCurveGenerationMode == CurveGenerationMode.Tight) + { + tempEmotionCurves[index].AddKey(new Keyframe(marker.endTime, nextShape.weights[nextShape.blendShapes.IndexOf(tempEmotionIndexBlendables[index])] * nextMarker.intensity, 0, 0)); + } + else if (emotionCurveGenerationMode == CurveGenerationMode.Loose) + { + tempEmotionCurves[index].AddKey(marker.endTime, nextShape.weights[nextShape.blendShapes.IndexOf(tempEmotionIndexBlendables[index])] * nextMarker.intensity); + } + } + } + } + } + + if (useBones && boneCurves != null) + { + for (int index = 0; index < tempEmotionBoneCurves.Count; index++) + { + if (shape.HasBone(tempEmotionBones[index])) + { + int b = shape.IndexOfBone(tempEmotionBones[index]); + + if (marker.continuousVariation) + { + for (int i = 0; i < variationPoints; i++) + { + bonePosMod[i] = Random.Range(1 - (marker.bonePositionVariation / 2), 1 + (marker.bonePositionVariation / 2)); + boneRotMod[i] = Random.Range(1 - (marker.boneRotationVariation / 2), 1 + (marker.boneRotationVariation / 2)); + } + } + + Vector3 startPosition = shape.bones[b].neutralPosition; + Quaternion startRotation = Quaternion.Euler(shape.bones[b].neutralRotation); + Vector3 startScale = shape.bones[b].neutralScale; + Vector3 endPosition = shape.bones[b].neutralPosition; + Quaternion endRotation = Quaternion.Euler(shape.bones[b].neutralRotation); + Vector3 endScale = shape.bones[b].neutralScale; + + if (marker.blendFromMarker) + { + EmotionMarker prevMarker = emotionMarkers[emotionMarkers.IndexOf(marker) - 1]; + EmotionShape prevShape = null; + + if (prevMarker.isMixer) + { + prevShape = prevMarker.mixer.GetShape(this); + } + else + { + prevShape = emotionCache[prevMarker.emotion]; + } + + // Check if previous emotion used this blendable. + if (prevShape.HasBone(tempEmotionBones[index])) + { + startPosition = Vector3.Lerp(startPosition, prevShape.bones[prevShape.IndexOfBone(tempEmotionBones[index])].endPosition, prevMarker.intensity); + startRotation = Quaternion.Slerp(startRotation, Quaternion.Euler(prevShape.bones[prevShape.IndexOfBone(tempEmotionBones[index])].endRotation), prevMarker.intensity); + startScale = Vector3.Lerp(startScale, prevShape.bones[prevShape.IndexOfBone(tempEmotionBones[index])].endScale, prevMarker.intensity); + } + } + + if (marker.blendToMarker) + { + EmotionMarker nextMarker = emotionMarkers[emotionMarkers.IndexOf(marker) + 1]; + EmotionShape nextShape = null; + + if (nextMarker.isMixer) + { + nextShape = nextMarker.mixer.GetShape(this); + } + else + { + nextShape = emotionCache[nextMarker.emotion]; + } + + // Check if next emotion uses this blendable. + if (nextShape.HasBone(tempEmotionBones[index])) + { + endPosition = Vector3.Lerp(endPosition, nextShape.bones[nextShape.IndexOfBone(tempEmotionBones[index])].endPosition, nextMarker.intensity); + endRotation = Quaternion.Slerp(endRotation, Quaternion.Euler(nextShape.bones[nextShape.IndexOfBone(tempEmotionBones[index])].endRotation), nextMarker.intensity); + endScale = Vector3.Lerp(endScale, nextShape.bones[nextShape.IndexOfBone(tempEmotionBones[index])].endScale, nextMarker.intensity); + } + } + + tempEmotionBoneCurves[index].AddKey(marker.startTime, startPosition, startRotation, startScale, 0, 0); + for (int i = 0; i < variationPoints; i++) + { + float time = Mathf.Lerp(marker.startTime + marker.blendInTime, marker.endTime + marker.blendOutTime, (float)i / (float)(variationPoints - 1)); + tempEmotionBoneCurves[index].AddKey(time, Vector3.Lerp(shape.bones[b].neutralPosition, shape.bones[b].endPosition * bonePosMod[i], marker.intensity * intensityMod[i]), Quaternion.Slerp(Quaternion.Euler(shape.bones[b].neutralRotation), Quaternion.Euler(shape.bones[b].endRotation * boneRotMod[i]), marker.intensity * intensityMod[i]), Vector3.Lerp(shape.bones[b].neutralScale, shape.bones[b].endScale, marker.intensity * intensityMod[i]), 0, 0); + } + tempEmotionBoneCurves[index].AddKey(marker.endTime, endPosition, endRotation, endScale, 0, 0); + + } + else + { + tempEmotionBoneCurves[index].AddKey(marker.startTime + marker.blendInTime, boneNeutralPositions[bones.IndexOf(tempEmotionBones[index])], boneNeutralRotations[bones.IndexOf(tempEmotionBones[index])], boneNeutralScales[bones.IndexOf(tempEmotionBones[index])], 0, 0); + tempEmotionBoneCurves[index].AddKey(marker.endTime + marker.blendOutTime, boneNeutralPositions[bones.IndexOf(tempEmotionBones[index])], boneNeutralRotations[bones.IndexOf(tempEmotionBones[index])], boneNeutralScales[bones.IndexOf(tempEmotionBones[index])], 0, 0); + + if (marker.blendToMarker) + { + EmotionMarker nextMarker = emotionMarkers[emotionMarkers.IndexOf(marker) + 1]; + EmotionShape nextShape = null; + + if (nextMarker.isMixer) + { + nextShape = nextMarker.mixer.GetShape(this); + } + else + { + nextShape = emotionCache[nextMarker.emotion]; + } + + // Check if next emotion uses this blendable. + if (nextShape.HasBone(tempEmotionBones[index])) + { + BoneShape b = nextShape.bones[nextShape.IndexOfBone(tempEmotionBones[index])]; + tempEmotionBoneCurves[index].AddKey(marker.endTime, Vector3.Lerp(b.neutralPosition, b.endPosition, nextMarker.intensity), Quaternion.Slerp(Quaternion.Euler(b.neutralRotation), Quaternion.Euler(b.endRotation), nextMarker.intensity), Vector3.Lerp(b.neutralScale, b.endScale, nextMarker.intensity), 0, 0); + } + } + } + } + } + } + #endregion + + if (!emotionOnly) + { + #region Add Phoneme Marker Keys + // Get keys from phoneme track + for (int m = 0; m < phonemeMarkers.Count; m++) + { + PhonemeMarker marker = phonemeMarkers[m]; + PhonemeShape shape = phonemes[marker.phonemeNumber]; + + float intensityMod = 1; + float blendableMod = 1; + float bonePosMod = 1; + float boneRotMod = 1; + + // Get Random Modifier + if (marker.useRandomness) + { + intensityMod = Random.Range(1 - (marker.intensityRandomness / 2), 1 + (marker.intensityRandomness / 2)); + } + + bool addRest = false; + + // Check for rests + if (!marker.sustain) + { + if (m + 1 < phonemeMarkers.Count) + { + if (phonemeMarkers[m + 1].time > marker.time + (restTime / fileLength) + (restHoldTime / fileLength)) + { + addRest = true; + } + } + else + { + // Last marker, add rest after hold time + addRest = true; + } + } + + for (int index = 0; index < tempCurves.Count; index++) + { + if (shape.blendShapes.Contains(tempIndexBlendables[index])) + { + int b = shape.blendShapes.IndexOf(tempIndexBlendables[index]); + + // Get Random Other Modifiers + if (marker.useRandomness) + { + blendableMod = Random.Range(1 - (marker.blendableRandomness / 2), 1 + (marker.blendableRandomness / 2)); + } + + if (phonemeCurveGenerationMode == CurveGenerationMode.Tight) + { + tempCurves[index].AddKey(new Keyframe(marker.time, shape.weights[b] * marker.intensity * intensityMod * blendableMod, 0, 0)); + + //Check for pre-rest + if (m == 0) + { + tempCurves[index].AddKey(new Keyframe(phonemeMarkers[m].time - (restHoldTime / fileLength), blendableNeutralValues[tempIndexBlendables[index]], 0, 0)); + } + + if (addRest) + { + // Add rest + tempCurves[index].AddKey(new Keyframe(marker.time + (restHoldTime / fileLength), shape.weights[b] * marker.intensity * intensityMod * blendableMod, 0, 0)); + tempCurves[index].AddKey(new Keyframe(marker.time + ((restHoldTime / fileLength) * 2), blendableNeutralValues[tempIndexBlendables[index]], 0, 0)); + if (m + 1 < phonemeMarkers.Count) + { + tempCurves[index].AddKey(new Keyframe(phonemeMarkers[m + 1].time - (restHoldTime / fileLength), blendableNeutralValues[tempIndexBlendables[index]], 0, 0)); + } + } + } + else if (phonemeCurveGenerationMode == CurveGenerationMode.Loose) + { + tempCurves[index].AddKey(marker.time, shape.weights[b] * marker.intensity); + + //Check for pre-rest + if (m == 0) + { + tempCurves[index].AddKey(phonemeMarkers[m].time - (restHoldTime / fileLength), blendableNeutralValues[tempIndexBlendables[index]]); + } + + if (addRest) + { + // Add rest + tempCurves[index].AddKey(marker.time + (restHoldTime / fileLength), shape.weights[b] * marker.intensity * intensityMod * blendableMod); + tempCurves[index].AddKey(marker.time + ((restHoldTime / fileLength) * 2), blendableNeutralValues[tempIndexBlendables[index]]); + if (m + 1 < phonemeMarkers.Count) + { + tempCurves[index].AddKey(phonemeMarkers[m + 1].time - (restHoldTime / fileLength), blendableNeutralValues[tempIndexBlendables[index]]); + } + } + } + + } + else + { + // Blendable isn't in this marker + if (phonemeCurveGenerationMode == CurveGenerationMode.Tight) + { + tempCurves[index].AddKey(new Keyframe(marker.time, blendableNeutralValues[tempIndexBlendables[index]], 0, 0)); + } + else if (phonemeCurveGenerationMode == CurveGenerationMode.Loose) + { + tempCurves[index].AddKey(marker.time, blendableNeutralValues[tempIndexBlendables[index]]); + } + if (addRest) + { + if (m + 1 < phonemeMarkers.Count) + { + if (phonemeCurveGenerationMode == CurveGenerationMode.Tight) + { + tempCurves[index].AddKey(new Keyframe(phonemeMarkers[m + 1].time - (restHoldTime / fileLength), blendableNeutralValues[tempIndexBlendables[index]], 0, 0)); + } + else if (phonemeCurveGenerationMode == CurveGenerationMode.Loose) + { + tempCurves[index].AddKey(phonemeMarkers[m + 1].time - (restHoldTime / fileLength), blendableNeutralValues[tempIndexBlendables[index]]); + } + } + } + } + } + + if (useBones && boneCurves != null) + { + for (int index = 0; index < tempBoneCurves.Count; index++) + { + if (shape.HasBone(bones[index])) + { + int b = shape.IndexOfBone(bones[index]); + + // Get Random Other Modifiers + if (marker.useRandomness) + { + bonePosMod = Random.Range(1 - (marker.bonePositionRandomness / 2), 1 + (marker.bonePositionRandomness / 2)); + boneRotMod = Random.Range(1 - (marker.boneRotationRandomness / 2), 1 + (marker.boneRotationRandomness / 2)); + } + + tempBoneCurves[index].AddKey(marker.time, Vector3.Lerp(shape.bones[b].neutralPosition, shape.bones[b].endPosition * bonePosMod, marker.intensity * intensityMod), Quaternion.Slerp(Quaternion.Euler(shape.bones[b].neutralRotation), Quaternion.Euler(shape.bones[b].endRotation * boneRotMod), marker.intensity), Vector3.Lerp(shape.bones[b].neutralScale, shape.bones[b].endScale, marker.intensity * intensityMod), 0, 0); + + //Check for pre-rest + if (m == 0) + { + tempBoneCurves[index].AddKey(phonemeMarkers[m].time - (restHoldTime / fileLength), boneNeutralPositions[index], boneNeutralRotations[index], boneNeutralScales[index], 0, 0); + } + + if (addRest) + { + // Add rest + tempBoneCurves[index].AddKey(marker.time + (restHoldTime / fileLength), boneNeutralPositions[index], boneNeutralRotations[index], boneNeutralScales[index], 0, 0); + if (m + 1 < phonemeMarkers.Count) + { + tempBoneCurves[index].AddKey(phonemeMarkers[m + 1].time - (restHoldTime / fileLength), boneNeutralPositions[index], boneNeutralRotations[index], boneNeutralScales[index], 0, 0); + } + } + } + else + { + // Blendable isn't in this marker, get value from matching emotion curve if available + + tempBoneCurves[index].AddKey(marker.time, boneNeutralPositions[index], boneNeutralRotations[index], boneNeutralScales[index], 0, 0); + + if (addRest) + { + if (m + 1 < phonemeMarkers.Count) + { + tempBoneCurves[index].AddKey(phonemeMarkers[m + 1].time - (restHoldTime / fileLength), boneNeutralPositions[index], boneNeutralRotations[index], boneNeutralScales[index], 0, 0); + } + } + } + } + } + } + #endregion + } + + #region Composite Animation + // Merge curve sets + for (int c = 0; c < animCurves.Count; c++) + { + if (tempIndexBlendables.Contains(indexBlendables[c]) && tempEmotionIndexBlendables.Contains(indexBlendables[c])) + { + int pIndex = tempIndexBlendables.IndexOf(indexBlendables[c]); + int eIndex = tempEmotionIndexBlendables.IndexOf(indexBlendables[c]); + + for (int k = 0; k < tempCurves[pIndex].keys.Length; k++) + { + Keyframe key = tempCurves[pIndex].keys[k]; + animCurves[c].AddKey(key); + } + + for (int k = 0; k < tempEmotionCurves[eIndex].keys.Length; k++) + { + Keyframe eKey = tempEmotionCurves[eIndex].keys[k]; + animCurves[c].AddKey(eKey); + } + + } + else if (tempIndexBlendables.Contains(indexBlendables[c])) + { + int pIndex = tempIndexBlendables.IndexOf(indexBlendables[c]); + + for (int k = 0; k < tempCurves[pIndex].keys.Length; k++) + { + Keyframe key = tempCurves[pIndex].keys[k]; + animCurves[c].AddKey(key); + } + + } + else + { + int eIndex = tempEmotionIndexBlendables.IndexOf(indexBlendables[c]); + + for (int k = 0; k < tempEmotionCurves[eIndex].keys.Length; k++) + { + Keyframe eKey = tempEmotionCurves[eIndex].keys[k]; + animCurves[c].AddKey(eKey); + } + } + } + + if (useBones && boneCurves != null) + { + for (int c = 0; c < boneCurves.Count; c++) + { + if (tempBones.Contains(bones[c]) && tempEmotionBones.Contains(bones[c])) + { + int pIndex = tempBones.IndexOf(bones[c]); + int eIndex = tempEmotionBones.IndexOf(bones[c]); + + foreach (TransformAnimationCurve.TransformKeyframe key in tempBoneCurves[pIndex].keys) + { + boneCurves[c].AddKey(key.time, key.position, key.rotation, key.scale, 0, 0); + } + + foreach (TransformAnimationCurve.TransformKeyframe key in tempEmotionBoneCurves[eIndex].keys) + { + boneCurves[c].AddKey(key.time, key.position, key.rotation, key.scale, 0, 0); + } + + } + else if (tempBones.Contains(bones[c])) + { + int pIndex = tempBones.IndexOf(bones[c]); + + foreach (TransformAnimationCurve.TransformKeyframe key in tempBoneCurves[pIndex].keys) + { + boneCurves[c].AddKey(key.time, key.position, key.rotation, key.scale, 0, 0); + } + } + else + { + int eIndex = tempEmotionBones.IndexOf(bones[c]); + + foreach (TransformAnimationCurve.TransformKeyframe key in tempEmotionBoneCurves[eIndex].keys) + { + boneCurves[c].AddKey(key.time, key.position, key.rotation, key.scale, 0, 0); + } + } + } + + // Fix Quaternion rotations (Credit: Chris Lewis) + foreach (TransformAnimationCurve curve in boneCurves) + { + curve.FixQuaternionContinuity(); + } + } + #endregion + } + + if (!emotionOnly && customEmotion > -1) + { + ClearDataCache(); + customEmotion = -1; + } + } + + public void GetCurveDataOut(out List indexBlendables, out List animCurves, out List bones, out List boneCurves, out List boneNeutralPositions, out List boneNeutralRotations, out List boneNeutralScales) + { + indexBlendables = this.indexBlendables; + animCurves = this.animCurves; + bones = this.bones; + boneCurves = this.boneCurves; + boneNeutralPositions = this.boneNeutralPositions; + boneNeutralRotations = this.boneNeutralRotations; + boneNeutralScales = this.boneNeutralScales; + } + + /// + /// Clears the data cache, forcing the animation curves to be recalculated. + /// + public void ClearDataCache() + { + currentFileID = 0; + } + + // ----------------- + // Private Functions + // ----------------- + + private EmotionMixer GetTransitionMixer(string oldEmotion, string newEmotion, float t) + { + var mixer = new EmotionMixer(); + + mixer.mixingMode = EmotionMixer.MixingMode.Additive; + mixer.emotions.Add(new EmotionMixer.EmotionComponent(oldEmotion, 1f - t)); + mixer.emotions.Add(new EmotionMixer.EmotionComponent(newEmotion, t)); + + return mixer; + } + + void FixEmotionBlends(ref List data) + { + EmotionMarker[] markers = data.ToArray(); + FixEmotionBlends(ref markers); + data.Clear(); + + foreach (EmotionMarker marker in markers) + { + data.Add(marker); + } + } + + void FixEmotionBlends(ref EmotionMarker[] data) + { + + foreach (EmotionMarker eMarker in data) + { + eMarker.blendFromMarker = false; + eMarker.blendToMarker = false; + if (!eMarker.customBlendIn) + eMarker.blendInTime = 0; + if (!eMarker.customBlendOut) + eMarker.blendOutTime = 0; + eMarker.invalid = false; + } + + foreach (EmotionMarker eMarker in data) + { + foreach (EmotionMarker tMarker in data) + { + if (eMarker != tMarker) + { + if (eMarker.startTime > tMarker.startTime && eMarker.startTime < tMarker.endTime) + { + if (eMarker.customBlendIn) + { + eMarker.customBlendIn = false; + FixEmotionBlends(ref data); + return; + } + eMarker.blendFromMarker = true; + + if (eMarker.endTime > tMarker.startTime && eMarker.endTime < tMarker.endTime) + { + eMarker.invalid = true; + } + else + { + eMarker.blendInTime = tMarker.endTime - eMarker.startTime; + } + } + + if (eMarker.endTime > tMarker.startTime && eMarker.endTime < tMarker.endTime) + { + if (eMarker.customBlendOut) + { + eMarker.customBlendOut = false; + FixEmotionBlends(ref data); + return; + } + eMarker.blendToMarker = true; + + if (eMarker.startTime > tMarker.startTime && eMarker.startTime < tMarker.endTime) + { + eMarker.invalid = true; + } + else + { + eMarker.blendOutTime = tMarker.startTime - eMarker.endTime; + } + } + } + } + } + } + + private void LoadXML(TextAsset xmlFile, AudioClip linkedClip) + { +#if UNITY_WP_8_1 || UNITY_WSA + Debug.LogWarning("[LipSync - " + gameObject.name + "] XML loading is not supported on Windows Store platforms."); +#else + XmlDocument document = new XmlDocument(); + document.LoadXml(xmlFile.text); + + // Clear/define marker lists, to overwrite any previous file + phonemeMarkers = new List(); + emotionMarkers = new List(); + gestureMarkers = new List(); + + audioClip = linkedClip; + audioSource.clip = audioClip; + + string version = ReadXML(document, "LipSyncData", "version"); + + if (float.Parse(version) < 1.321f) + { + Debug.LogError("Cannot load pre-1.321 XML file. Run the converter from Window/Rogo Digital/LipSync Pro/Update XML files."); + return; + } + + try + { + fileLength = float.Parse(ReadXML(document, "LipSyncData", "length")); + + //Phonemes + XmlNode phonemesNode = document.SelectSingleNode("//LipSyncData//phonemes"); + if (phonemesNode != null) + { + XmlNodeList phonemeNodes = phonemesNode.ChildNodes; + + for (int p = 0; p < phonemeNodes.Count; p++) + { + XmlNode node = phonemeNodes[p]; + + if (node.LocalName == "marker") + { + int phoneme = int.Parse(node.Attributes["phonemeNumber"].Value); + float time = float.Parse(node.Attributes["time"].Value) / fileLength; + float intensity = float.Parse(node.Attributes["intensity"].Value); + bool sustain = bool.Parse(node.Attributes["sustain"].Value); + + phonemeMarkers.Add(new PhonemeMarker(phoneme, time, intensity, sustain)); + } + } + } + + //Emotions + XmlNode emotionsNode = document.SelectSingleNode("//LipSyncData//emotions"); + if (emotionsNode != null) + { + XmlNodeList emotionNodes = emotionsNode.ChildNodes; + + for (int p = 0; p < emotionNodes.Count; p++) + { + XmlNode node = emotionNodes[p]; + + if (node.LocalName == "marker") + { + string emotion = node.Attributes["emotion"].Value; + float startTime = float.Parse(node.Attributes["start"].Value) / fileLength; + float endTime = float.Parse(node.Attributes["end"].Value) / fileLength; + float blendInTime = float.Parse(node.Attributes["blendIn"].Value); + float blendOutTime = float.Parse(node.Attributes["blendOut"].Value); + bool blendTo = bool.Parse(node.Attributes["blendToMarker"].Value); + bool blendFrom = bool.Parse(node.Attributes["blendFromMarker"].Value); + bool customBlendIn = bool.Parse(node.Attributes["customBlendIn"].Value); + bool customBlendOut = bool.Parse(node.Attributes["customBlendOut"].Value); + float intensity = float.Parse(node.Attributes["intensity"].Value); + + emotionMarkers.Add(new EmotionMarker(emotion, startTime, endTime, blendInTime, blendOutTime, blendTo, blendFrom, customBlendIn, customBlendOut, intensity)); + } + } + } + + //Gestures + XmlNode gesturesNode = document.SelectSingleNode("//LipSyncData//gestures"); + if (gesturesNode != null) + { + XmlNodeList gestureNodes = gesturesNode.ChildNodes; + + for (int p = 0; p < gestureNodes.Count; p++) + { + XmlNode node = gestureNodes[p]; + + if (node.LocalName == "marker") + { + string gesture = node.Attributes["gesture"].Value; + float time = float.Parse(node.Attributes["time"].Value) / fileLength; + + gestureMarkers.Add(new GestureMarker(gesture, time)); + } + } + } + } + catch + { + Debug.LogError("[LipSync - " + gameObject.name + "] Malformed XML file. See console for details. \nFor the sake of simplicity, LipSync Pro is unable to handle errors in XML files. The clip editor often can, however. Import this XML file into the clip editor and re-export to fix."); + } + + phonemeMarkers.Sort(SortTime); + gestureMarkers.Sort(SortTime); +#endif + } + + private bool LoadData(LipSyncData dataFile) + { + // Check that the referenced file contains data + if (dataFile.phonemeData.Length > 0 || dataFile.emotionData.Length > 0 || dataFile.gestureData.Length > 0) + { + // Store reference to the associated AudioClip. + audioClip = dataFile.clip; + fileLength = dataFile.length; + + // Update file to current format if needed + bool updated = false; + + if (dataFile.version < 1) + { + // Pre 1.0 - update emotion blends to new format. + updated = true; + + for (int e = 0; e < dataFile.emotionData.Length; e++) + { + if (dataFile.emotionData[e].blendFromMarker) + { + dataFile.emotionData[e].startTime -= dataFile.emotionData[e].blendInTime; + dataFile.emotionData[e - 1].endTime += dataFile.emotionData[e].blendInTime; + } + else + { + dataFile.emotionData[e].customBlendIn = true; + } + + if (dataFile.emotionData[e].blendToMarker) + { + dataFile.emotionData[e + 1].startTime -= dataFile.emotionData[e].blendOutTime; + dataFile.emotionData[e].endTime += dataFile.emotionData[e].blendOutTime; + } + else + { + dataFile.emotionData[e].customBlendOut = true; + dataFile.emotionData[e].blendOutTime = -dataFile.emotionData[e].blendOutTime; + } + } + + FixEmotionBlends(ref dataFile.emotionData); + + if (dataFile.length == 0) + { + fileLength = audioClip.length; + } + } + + if (dataFile.version < 1.3f) + { + // Pre 1.3 - update enum-based phoneme IDs + updated = true; + for (int p = 0; p < dataFile.phonemeData.Length; p++) + { + dataFile.phonemeData[p].phonemeNumber = (int)dataFile.phonemeData[p].phoneme; + } + } + + if (updated) + Debug.LogWarning("[LipSync - " + gameObject.name + "] Loading data from an old format LipSyncData file. For better performance, open this clip in the Clip Editor and re-save to update."); + + // Clear/define marker lists, to overwrite any previous file + phonemeMarkers = new List(); + emotionMarkers = new List(); + gestureMarkers = new List(); + + // Copy data from file into new lists + foreach (PhonemeMarker marker in dataFile.phonemeData) + { + phonemeMarkers.Add(marker); + } + foreach (EmotionMarker marker in dataFile.emotionData) + { + emotionMarkers.Add(marker); + } + foreach (GestureMarker marker in dataFile.gestureData) + { + gestureMarkers.Add(marker); + } + + // Phonemes are stored out of sequence in the file, for depth sorting in the editor + // Sort them by timestamp to make finding the current one faster + emotionMarkers.Sort(EmotionSort); + phonemeMarkers.Sort(SortTime); + gestureMarkers.Sort(SortTime); + + // Set current AudioClip in the AudioSource + audioSource.clip = audioClip; + + // Save file InstanceID for later, to skip loading data that is already loaded + currentFileID = dataFile.GetInstanceID(); + lastClip = dataFile; + + return true; + } + else + { + return false; + } + } + + private IEnumerator StopAudioSource(float delay) + { + yield return new WaitForSeconds(delay); + audioSource.Stop(); + } + + GestureInstance GetGesture(string name) + { + for (int a = 0; a < gestures.Count; a++) + { + if (gestures[a].gesture == name) + return gestures[a]; + } + return null; + } + + public LipSync() + { + // Constructor used to set version value on new component + this.lastUsedVersion = 1.531f; + } + + // Sort PhonemeMarker by timestamp + public static int SortTime(PhonemeMarker a, PhonemeMarker b) + { + float sa = a.time; + float sb = b.time; + + return sa.CompareTo(sb); + } + + public static int SortTime(GestureMarker a, GestureMarker b) + { + float sa = a.time; + float sb = b.time; + + return sa.CompareTo(sb); + } + + static int EmotionSort(EmotionMarker a, EmotionMarker b) + { + return a.startTime.CompareTo(b.startTime); + } + + public static string ReadXML(XmlDocument xml, string parentElement, string elementName) + { +#if UNITY_WP_8_1 || UNITY_WSA + return null; +#else + XmlNode node = xml.SelectSingleNode("//" + parentElement + "//" + elementName); + + if (node == null) + { + return null; + } + + return node.InnerText; +#endif + } + + public enum AnimationTimingMode + { + AudioPlayback, + CustomTimer, + FixedFrameRate, + } + + public enum CurveGenerationMode + { + Tight, + Loose, + } + } + + // Old Phoneme List + public enum Phoneme + { + AI, + E, + U, + O, + CDGKNRSThYZ, + FV, + L, + MBP, + WQ, + Rest + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/LipSync.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/LipSync.cs.meta new file mode 100644 index 0000000..1f70240 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Components/LipSync.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 60953a4eedd70a246ab4eadbed9f0591 +timeCreated: 1440094602 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: fe75762bf2ad668439cf1aa644a0e5bf, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Editor.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Editor.meta new file mode 100644 index 0000000..23840a8 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fbc8a6848554fd14f8ad86c28dd98fcf +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples.meta new file mode 100644 index 0000000..505252c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 24dd9dc70ce7c2444bcfcf1155502ab9 +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio.meta new file mode 100644 index 0000000..5b378ea --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fe28bba1332a61a469324a9dc08d4275 +folderAsset: yes +timeCreated: 1465219893 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.asset new file mode 100644 index 0000000..1c05a66 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.asset @@ -0,0 +1,18487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9f44607bd270d4f4eaa8869ed9b5b85c, type: 3} + m_Name: Gettysburg + m_EditorClassIdentifier: + clip: {fileID: 8300000, guid: f2d6afe568dab594199362b87ce57820, type: 3} + phonemeData: + - phoneme: 0 + phonemeNumber: 5 + time: 0.015948424 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.03407163 + intensity: 0.8109256 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.047482807 + intensity: 0.6206269 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.05726934 + intensity: 0.8636345 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.06524355 + intensity: 0.6203176 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.07466762 + intensity: 0.7016734 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.08916619 + intensity: 0.6703603 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.09677793 + intensity: 0.60069734 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.101127505 + intensity: 0.6205453 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.106202 + intensity: 0.7545509 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.113088824 + intensity: 0.8658314 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.1182616 + intensity: 0.81883407 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 5 + time: 0.12620518 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.1311814 + intensity: 0.61902225 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.14254668 + intensity: 0.6632284 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.15295988 + intensity: 0.72558343 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.16238394 + intensity: 0.7037525 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.16818337 + intensity: 0.5872291 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.17325787 + intensity: 0.6986254 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 3 + time: 0.18595451 + intensity: 0.6368613 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 8 + time: 0.1962284 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.232702 + intensity: 0.67331016 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.24430084 + intensity: 0.6647285 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 5 + time: 0.25263754 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.2642364 + intensity: 0.6633493 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.2722106 + intensity: 0.59847844 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.27873495 + intensity: 0.6338947 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.28670916 + intensity: 0.6465526 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.29395846 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.3004828 + intensity: 0.6980899 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.30809453 + intensity: 0.67447144 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.31606877 + intensity: 0.5433263 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 5 + time: 0.32549283 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.33564183 + intensity: 0.6950116 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.3418037 + intensity: 0.586827 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.3479656 + intensity: 0.54931206 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.35557735 + intensity: 0.6115168 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.3610143 + intensity: 0.5963584 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.36463895 + intensity: 0.62398934 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.369351 + intensity: 0.6206607 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.37478796 + intensity: 0.7076422 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.3813123 + intensity: 0.56643236 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.38928652 + intensity: 0.6800481 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.39436102 + intensity: 0.58201075 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.39798567 + intensity: 0.76553357 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.40197277 + intensity: 0.5809015 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.40523493 + intensity: 0.6026973 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.40958452 + intensity: 0.60796946 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.41429654 + intensity: 0.5662177 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.4237206 + intensity: 0.5598155 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.43531945 + intensity: 0.5891728 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.44148135 + intensity: 0.5677483 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.4472808 + intensity: 0.63686156 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 3 + time: 0.45271775 + intensity: 0.61186254 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.46359167 + intensity: 0.5830675 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.47482806 + intensity: 0.5931138 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.48316473 + intensity: 0.7025295 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.48968908 + intensity: 0.5544618 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.49657592 + intensity: 0.5308515 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.52376074 + intensity: 0.5482627 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.5284728 + intensity: 0.5922226 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.53318477 + intensity: 0.5851524 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.54260886 + intensity: 0.8387351 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.5552951 + intensity: 0.65453863 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 5 + time: 0.5632693 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.5687063 + intensity: 0.6016595 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.57414323 + intensity: 0.67442715 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.57994264 + intensity: 0.6067289 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 6 + time: 0.5879169 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.5937163 + intensity: 0.6135407 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.59856397 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.60350287 + intensity: 0.5869563 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.6093023 + intensity: 0.6011886 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.6180014 + intensity: 0.56522506 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.64881086 + intensity: 0.56021744 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.65606016 + intensity: 0.6075497 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.662222 + intensity: 0.52439 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.66802144 + intensity: 0.61353296 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.67309594 + intensity: 0.65454555 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.67744553 + intensity: 0.6524367 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.6821576 + intensity: 0.5640141 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.68759453 + intensity: 0.60335386 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.69411886 + intensity: 0.6576884 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.7002808 + intensity: 0.6232331 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.7046303 + intensity: 0.6579682 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.71079224 + intensity: 0.52020204 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.7162292 + intensity: 0.6068503 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.7202163 + intensity: 0.5901864 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.72456586 + intensity: 0.58271116 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.727828 + intensity: 0.5534066 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.73398995 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.7416017 + intensity: 0.57837343 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.74703866 + intensity: 0.5524908 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.7517507 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.7568252 + intensity: 0.6015541 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.763712 + intensity: 0.716563 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.7698739 + intensity: 0.61075675 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.77639824 + intensity: 0.6822306 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.78219765 + intensity: 0.6328358 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.7883596 + intensity: 0.5993833 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.794159 + intensity: 0.5681366 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.79887104 + intensity: 0.5513522 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.80684525 + intensity: 0.52285135 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.8209813 + intensity: 0.62329733 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 6 + time: 0.8336676 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.8459914 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.85940254 + intensity: 0.6369091 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.8728137 + intensity: 0.5904071 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.88549995 + intensity: 0.56074935 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.8916619 + intensity: 0.5562531 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.8981862 + intensity: 0.54541266 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.90507305 + intensity: 0.5526099 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.91304725 + intensity: 0.6572771 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.91993403 + intensity: 0.6233517 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.92392117 + intensity: 0.5960733 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.92899567 + intensity: 0.6405162 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.9369699 + intensity: 0.52184093 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.9492937 + intensity: 0.53276664 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.9590802 + intensity: 0.5465585 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.194 + blendableRandomness: 0.066 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 8 + time: 0.9645172 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 6 + time: 0.9753911 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0 + blendableRandomness: 0.14 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 9 + time: 0.9853372 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.104 + blendableRandomness: 0.1 + bonePositionRandomness: 0 + boneRotationRandomness: 0 + emotionData: + - emotion: Serious + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.014863804 + endTime: 0.15023647 + blendInTime: 0.03251382 + blendOutTime: -0.069679685 + blendToMarker: 1 + blendFromMarker: 0 + customBlendIn: 1 + customBlendOut: 0 + intensity: 0.527 + continuousVariation: 1 + variationFrequency: 0.5 + intensityVariation: 0.129 + blendableVariation: 0.039 + bonePositionVariation: 0.047 + boneRotationVariation: 0.043 + invalid: 0 + - emotion: Eyebrows Up + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.08055679 + endTime: 0.24857658 + blendInTime: 0.069679685 + blendOutTime: -0.03312271 + blendToMarker: 0 + blendFromMarker: 1 + customBlendIn: 0 + customBlendOut: 1 + intensity: 0.713 + continuousVariation: 1 + variationFrequency: 0.5 + intensityVariation: 0.125 + blendableVariation: 0.032 + bonePositionVariation: 0.032 + boneRotationVariation: 0.036 + invalid: 0 + - emotion: Eyebrows Up + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.38446212 + endTime: 0.5057769 + blendInTime: 0.030472375 + blendOutTime: -0.04262948 + blendToMarker: 1 + blendFromMarker: 0 + customBlendIn: 1 + customBlendOut: 0 + intensity: 1 + continuousVariation: 1 + variationFrequency: 0.5 + intensityVariation: 0.104 + blendableVariation: 0.043 + bonePositionVariation: 0.043 + boneRotationVariation: 0.039 + invalid: 0 + - emotion: Serious + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.4631474 + endTime: 0.7262764 + blendInTime: 0.04262948 + blendOutTime: -0.07013029 + blendToMarker: 1 + blendFromMarker: 1 + customBlendIn: 0 + customBlendOut: 0 + intensity: 1 + continuousVariation: 1 + variationFrequency: 0.5 + intensityVariation: 0.108 + blendableVariation: 0.032 + bonePositionVariation: 0.029 + boneRotationVariation: 0.032 + invalid: 0 + - emotion: Serious + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.6561461 + endTime: 0.82669324 + blendInTime: 0.07013029 + blendOutTime: -0.027888417 + blendToMarker: 1 + blendFromMarker: 1 + customBlendIn: 0 + customBlendOut: 0 + intensity: 0.724 + continuousVariation: 1 + variationFrequency: 0.5 + intensityVariation: 0.111 + blendableVariation: 0.029 + bonePositionVariation: 0.036 + boneRotationVariation: 0.032 + invalid: 0 + - emotion: Eyebrows Up + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.7988048 + endTime: 0.95455945 + blendInTime: 0.027888417 + blendOutTime: -0.04471931 + blendToMarker: 0 + blendFromMarker: 1 + customBlendIn: 0 + customBlendOut: 1 + intensity: 1 + continuousVariation: 1 + variationFrequency: 0.5 + intensityVariation: 0.09 + blendableVariation: 0.032 + bonePositionVariation: 0.029 + boneRotationVariation: 0.032 + invalid: 0 + gestureData: [] + version: 1.51 + length: 13.794467 + transcript: Four score and seven years ago, our fathers brought forth on this continent + a new nation, conceived in liberty and dedicated to the proposition that all men + are created equal. + phonemePoseCurves: [] + emotionPoseCurves: [] + targetComponentID: 5114 + isPreprocessed: 0 + indexBlendables: 160000001c000000290000002a0000002f0000002300000021000000220000001d0000002d0000001e000000200000002e00000027000000020000000300000008000000090000000700000006000000 + animCurves: + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.0014498571 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 337.821 + outSlope: 337.821 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 9.061153 + inSlope: 519.086 + outSlope: 519.086 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 12.609064 + inSlope: -41.479782 + outSlope: -41.479782 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 9.056637 + inSlope: -703.2505 + outSlope: -703.2505 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: -142.98065 + outSlope: -142.98065 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 9.787261 + inSlope: -305.38022 + outSlope: -305.38022 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 398.57153 + outSlope: 398.57153 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 9.059962 + inSlope: 1234.2528 + outSlope: 1234.2528 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 11.016443 + inSlope: 310.73273 + outSlope: 310.73273 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 12.641138 + inSlope: -1103.9348 + outSlope: -1103.9348 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: -1221.8916 + outSlope: -1221.8916 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: 425.99634 + outSlope: 425.99634 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 9.683135 + inSlope: -38.948883 + outSlope: -38.948883 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 80.19064 + outSlope: 80.19064 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 10.274787 + inSlope: -340.70905 + outSlope: -340.70905 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 119.17322 + outSlope: 119.17322 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 10.199931 + inSlope: 603.3397 + outSlope: 603.3397 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: -401.6784 + outSlope: -401.6784 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 418.3624 + outSlope: 418.3624 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 9.705037 + inSlope: -163.70517 + outSlope: -163.70517 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: -582.06757 + outSlope: -582.06757 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 547.878 + outSlope: 547.878 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 8.737785 + inSlope: -121.75037 + outSlope: -121.75037 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: -77.74078 + outSlope: -77.74078 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 9.439669 + inSlope: -59.187317 + outSlope: -59.187317 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 130.00726 + outSlope: 130.00726 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 10.192113 + inSlope: 111.58099 + outSlope: 111.58099 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: -172.11414 + outSlope: -172.11414 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 7.9325643 + inSlope: 76.51938 + outSlope: 76.51938 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: -420.86765 + outSlope: -420.86765 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 695.21716 + outSlope: 695.21716 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 8.567674 + inSlope: 650.7733 + outSlope: 650.7733 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 8.019957 + inSlope: -571.258 + outSlope: -571.258 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 273.89417 + outSlope: 273.89417 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 8.706833 + inSlope: 856.35675 + outSlope: 856.35675 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 9.110245 + inSlope: -911.0491 + outSlope: -911.0491 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: -16.57257 + outSlope: -16.57257 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 10.331576 + inSlope: 792.12744 + outSlope: 792.12744 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 8.269913 + inSlope: -676.53894 + outSlope: -676.53894 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 318.719 + outSlope: 318.719 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 8.497357 + inSlope: 1206.8733 + outSlope: 1206.8733 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 11.17679 + inSlope: -1032.0049 + outSlope: -1032.0049 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: -52.91382 + outSlope: -52.91382 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 8.799381 + inSlope: 337.18524 + outSlope: 337.18524 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: -134.31659 + outSlope: -134.31659 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 8.266779 + inSlope: 872.2428 + outSlope: 872.2428 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 8.173306 + inSlope: -357.29172 + outSlope: -357.29172 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 320.27887 + outSlope: 320.27887 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 8.289125 + inSlope: 759.60706 + outSlope: 759.60706 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 9.298179 + inSlope: -768.0946 + outSlope: -768.0946 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: -463.6588 + outSlope: -463.6588 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 8.512785 + inSlope: 12.627563 + outSlope: 12.627563 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 236.36603 + outSlope: 236.36603 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 10.25693 + inSlope: -170.87952 + outSlope: -170.87952 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: -223.35077 + outSlope: -223.35077 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 7.750432 + inSlope: 567.3742 + outSlope: 567.3742 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 8.004636 + inSlope: -844.7047 + outSlope: -844.7047 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 57.161743 + outSlope: 57.161743 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 8.543225 + inSlope: 1102.9697 + outSlope: 1102.9697 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 12.245533 + inSlope: -286.20218 + outSlope: -286.20218 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: -482.63004 + outSlope: -482.63004 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: 807.8258 + outSlope: 807.8258 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 8.784228 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: -44.106934 + outSlope: -44.106934 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 8.858242 + inSlope: 208.29218 + outSlope: 208.29218 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: -555.4267 + outSlope: -555.4267 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: 756.7451 + outSlope: 756.7451 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 8.777354 + inSlope: 252.24838 + outSlope: 252.24838 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: -504.49673 + outSlope: -504.49673 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 611.79913 + outSlope: 611.79913 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 8.870226 + inSlope: 513.27936 + outSlope: 513.27936 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 7.656094 + inSlope: 13.688782 + outSlope: 13.688782 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 8.9575815 + inSlope: -770.39856 + outSlope: -770.39856 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 212.38995 + outSlope: 212.38995 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 9.525576 + inSlope: 84.22839 + outSlope: 84.22839 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: -200.66785 + outSlope: -200.66785 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 8.808967 + inSlope: 135.01434 + outSlope: 135.01434 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 63.25409 + outSlope: 63.25409 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 9.099203 + inSlope: -307.65796 + outSlope: -307.65796 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: -429.7182 + outSlope: -429.7182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 7.59495 + inSlope: 732.61975 + outSlope: 732.61975 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 8.860015 + inSlope: -994.753 + outSlope: -994.753 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: -133.11688 + outSlope: -133.11688 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 8.507584 + inSlope: -326.00372 + outSlope: -326.00372 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: -1303.9792 + outSlope: -1303.9792 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: 554.6852 + outSlope: 554.6852 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 8.444252 + inSlope: -221.8753 + outSlope: -221.8753 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: -776.5605 + outSlope: -776.5605 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: 759.5581 + outSlope: 759.5581 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 10.46182 + inSlope: -89.34985 + outSlope: -89.34985 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: -85.56714 + outSlope: -85.56714 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 9.9605665 + inSlope: -95.41565 + outSlope: -95.41565 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: -148.6706 + outSlope: -148.6706 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 8.750997 + inSlope: 670.7541 + outSlope: 670.7541 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 8.294794 + inSlope: -919.501 + outSlope: -919.501 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: -401.52414 + outSlope: -401.52414 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 7.63363 + inSlope: 208.6398 + outSlope: 208.6398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: -270.00525 + outSlope: -270.00525 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: 321.37195 + outSlope: 321.37195 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 8.619944 + inSlope: -18.363678 + outSlope: -18.363678 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 319.25412 + outSlope: 319.25412 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 8.121295 + inSlope: 646.86053 + outSlope: 646.86053 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 7.963025 + inSlope: -4.5001984 + outSlope: -4.5001984 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 8.068105 + inSlope: -498.25854 + outSlope: -498.25854 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: -505.88757 + outSlope: -505.88757 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 1091.3444 + outSlope: 1091.3444 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 8.702671 + inSlope: 233.85406 + outSlope: 233.85406 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: -379.77023 + outSlope: -379.77023 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 7.618878 + inSlope: 168.6076 + outSlope: 168.6076 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 98.577576 + outSlope: 98.577576 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 7.9797544 + inSlope: -326.15378 + outSlope: -326.15378 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: -733.8438 + outSlope: -733.8438 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.0014498571 + value: 0 + inSlope: 3448.6167 + outSlope: 3448.6167 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 100 + inSlope: 689.72314 + outSlope: 689.72314 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: -2758.8936 + outSlope: -2758.8936 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: 6294.3926 + outSlope: 6294.3926 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 100 + inSlope: -3753.379 + outSlope: -3753.379 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: -10047.771 + outSlope: -10047.771 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 5997.582 + outSlope: 5997.582 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 100 + inSlope: 1686.812 + outSlope: 1686.812 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: -4310.77 + outSlope: -4310.77 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 4786.672 + outSlope: 4786.672 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 69.4 + inSlope: -531.8623 + outSlope: -531.8623 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: -5318.534 + outSlope: -5318.534 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 5305.569 + outSlope: 5305.569 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 100 + inSlope: 378.97607 + outSlope: 378.97607 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: -4926.593 + outSlope: -4926.593 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: 6270.216 + outSlope: 6270.216 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 100 + inSlope: -2926.1055 + outSlope: -2926.1055 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: -9196.321 + outSlope: -9196.321 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 7158.114 + outSlope: 7158.114 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 69.4 + inSlope: 132.2583 + outSlope: 132.2583 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: -7025.8555 + outSlope: -7025.8555 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 5631.3545 + outSlope: 5631.3545 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 69.4 + inSlope: 1072.6138 + outSlope: 1072.6138 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: -4558.7407 + outSlope: -4558.7407 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 7364.106 + outSlope: 7364.106 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 69.4 + inSlope: 525.9951 + outSlope: 525.9951 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: -6838.111 + outSlope: -6838.111 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 2815.6907 + outSlope: 2815.6907 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 69.4 + inSlope: 228.29419 + outSlope: 228.29419 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: -2587.3965 + outSlope: -2587.3965 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.0014498571 + value: 0 + inSlope: 758.6957 + outSlope: 758.6957 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 22 + inSlope: 151.73907 + outSlope: 151.73907 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: -606.9566 + outSlope: -606.9566 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 3395.4685 + outSlope: 3395.4685 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 35.127983 + inSlope: 2569.1416 + outSlope: 2569.1416 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 22 + inSlope: -3036.8367 + outSlope: -3036.8367 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: -2210.5098 + outSlope: -2210.5098 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 1319.468 + outSlope: 1319.468 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 22 + inSlope: 371.09857 + outSlope: 371.09857 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: -948.36945 + outSlope: -948.36945 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 1167.2251 + outSlope: 1167.2251 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 22 + inSlope: 83.37463 + outSlope: 83.37463 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: -1083.8505 + outSlope: -1083.8505 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 1106.6982 + outSlope: 1106.6982 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 28.079708 + inSlope: 725.4874 + outSlope: 725.4874 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 22 + inSlope: -2404.4014 + outSlope: -2404.4014 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: -2023.1906 + outSlope: -2023.1906 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 1393.7133 + outSlope: 1393.7133 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 24.248156 + inSlope: 1429.5911 + outSlope: 1429.5911 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6325 + value: 25.28851 + inSlope: -6941.1123 + outSlope: -6941.1123 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: -6976.99 + outSlope: -6976.99 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6469985 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 2766.7751 + outSlope: 2766.7751 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 28.080006 + inSlope: -461.11646 + outSlope: -461.11646 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: -3227.8916 + outSlope: -3227.8916 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 1018.6812 + outSlope: 1018.6812 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 27.323402 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: -1018.6812 + outSlope: -1018.6812 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 1768.0245 + outSlope: 1768.0245 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 28.19719 + inSlope: -279.17224 + outSlope: -279.17224 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: -2047.1968 + outSlope: -2047.1968 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 927.2991 + outSlope: 927.2991 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 22.85569 + inSlope: -240.41064 + outSlope: -240.41064 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: -1167.7097 + outSlope: -1167.7097 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.0014498571 + value: 0 + inSlope: 1272.5396 + outSlope: 1272.5396 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 36.9 + inSlope: 254.50781 + outSlope: 254.50781 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: -1018.03174 + outSlope: -1018.03174 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 3253.001 + outSlope: 3253.001 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 33.65408 + inSlope: 3457.312 + outSlope: 3457.312 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 36.9 + inSlope: -3503.3167 + outSlope: -3503.3167 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: -3707.6277 + outSlope: -3707.6277 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 2213.108 + outSlope: 2213.108 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 36.9 + inSlope: 622.4336 + outSlope: 622.4336 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: -1590.6743 + outSlope: -1590.6743 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 1957.7549 + outSlope: 1957.7549 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 36.9 + inSlope: 139.84204 + outSlope: 139.84204 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: -1817.9128 + outSlope: -1817.9128 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 1060.2633 + outSlope: 1060.2633 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 26.901537 + inSlope: 1687.1886 + outSlope: 1687.1886 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 36.9 + inSlope: -2766.5173 + outSlope: -2766.5173 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: -3393.4426 + outSlope: -3393.4426 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 1335.2357 + outSlope: 1335.2357 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 23.23075 + inSlope: 1370.3813 + outSlope: 1370.3813 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6325 + value: 24.249874 + inSlope: -6655.29 + outSlope: -6655.29 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: -6690.4355 + outSlope: -6690.4355 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6469985 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 2650.6863 + outSlope: 2650.6863 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 26.901821 + inSlope: -441.76904 + outSlope: -441.76904 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: -3092.4553 + outSlope: -3092.4553 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 975.9393 + outSlope: 975.9393 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 26.176964 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: -975.9393 + outSlope: -975.9393 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 1693.8416 + outSlope: 1693.8416 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 27.014088 + inSlope: -267.45874 + outSlope: -267.45874 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: -1961.3003 + outSlope: -1961.3003 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 888.3913 + outSlope: 888.3913 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 21.896708 + inSlope: -230.32343 + outSlope: -230.32343 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: -1118.7147 + outSlope: -1118.7147 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.0014498571 + value: 0 + inSlope: 3448.6167 + outSlope: 3448.6167 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 100 + inSlope: 689.72314 + outSlope: 689.72314 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: -2758.8936 + outSlope: -2758.8936 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 2777.8845 + outSlope: 2777.8845 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 42.289093 + inSlope: -2083.4065 + outSlope: -2083.4065 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: -4861.291 + outSlope: -4861.291 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 1654.2025 + outSlope: 1654.2025 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 17.113632 + inSlope: 6871.396 + outSlope: 6871.396 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 100 + inSlope: -451.84277 + outSlope: -451.84277 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 43.579166 + inSlope: -7586.242 + outSlope: -7586.242 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 535.5017 + outSlope: 535.5017 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 51.081074 + inSlope: -257.4336 + outSlope: -257.4336 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 854.0835 + outSlope: 854.0835 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 41.340927 + inSlope: -509.17334 + outSlope: -509.17334 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: -4073.3982 + outSlope: -4073.3982 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 5997.582 + outSlope: 5997.582 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 100 + inSlope: 1686.812 + outSlope: 1686.812 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: -4310.77 + outSlope: -4310.77 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 3419.9697 + outSlope: 3419.9697 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 44.626186 + inSlope: 621.8115 + outSlope: 621.8115 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: -2798.1582 + outSlope: -2798.1582 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 5305.569 + outSlope: 5305.569 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 100 + inSlope: 378.97607 + outSlope: 378.97607 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: -4926.593 + outSlope: -4926.593 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 5128.468 + outSlope: 5128.468 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 40.895466 + inSlope: -1139.6855 + outSlope: -1139.6855 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: -1348.0278 + outSlope: -1348.0278 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 42.801052 + inSlope: 378.43262 + outSlope: 378.43262 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: -4541.693 + outSlope: -4541.693 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 1788.0111 + outSlope: 1788.0111 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 41.477764 + inSlope: -1577.6532 + outSlope: -1577.6532 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: -3365.6643 + outSlope: -3365.6643 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 2991.4158 + outSlope: 2991.4158 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 39.03411 + inSlope: 157.4519 + outSlope: 157.4519 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: -2833.9639 + outSlope: -2833.9639 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 4424.0312 + outSlope: 4424.0312 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 41.69247 + inSlope: -0.056152344 + outSlope: -0.056152344 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: -4424.0874 + outSlope: -4424.0874 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 539.1607 + outSlope: 539.1607 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 13.679857 + inSlope: 5951.6196 + outSlope: 5951.6196 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 100 + inSlope: -3783.8623 + outSlope: -3783.8623 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: -9196.321 + outSlope: -9196.321 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 4183.292 + outSlope: 4183.292 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 41.321728 + inSlope: 620.7134 + outSlope: 620.7134 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: -2883.59 + outSlope: -2883.59 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 11.813204 + inSlope: 703.19336 + outSlope: 703.19336 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6325 + value: 12.515076 + inSlope: -3428.6504 + outSlope: -3428.6504 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: -3452.8552 + outSlope: -3452.8552 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6469985 + value: 0 + inSlope: 10880.776 + outSlope: 10880.776 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 39.43931 + inSlope: 8160.5596 + outSlope: 8160.5596 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: -2720.2166 + outSlope: -2720.2166 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 1347.9159 + outSlope: 1347.9159 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 13.680001 + inSlope: -224.64648 + outSlope: -224.64648 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 2640.745 + outSlope: 2640.745 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 39.706593 + inSlope: 561.76196 + outSlope: 561.76196 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: -3651.5457 + outSlope: -3651.5457 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 5324.8247 + outSlope: 5324.8247 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 46.320965 + inSlope: 1566.1826 + outSlope: 1566.1826 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: -3758.642 + outSlope: -3758.642 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 5210.4785 + outSlope: 5210.4785 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 41.549126 + inSlope: 434.2661 + outSlope: 434.2661 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 1195.2603 + outSlope: 1195.2603 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 38.959824 + inSlope: 2810.139 + outSlope: 2810.139 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: -3161.3337 + outSlope: -3161.3337 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 4172.766 + outSlope: 4172.766 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 42.34941 + inSlope: 1098.0774 + outSlope: 1098.0774 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: -3074.6887 + outSlope: -3074.6887 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 3841.0479 + outSlope: 3841.0479 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 44.551643 + inSlope: 225.97461 + outSlope: 225.97461 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: -3615.0732 + outSlope: -3615.0732 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 4118.7207 + outSlope: 4118.7207 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 38.815197 + inSlope: 1684.9241 + outSlope: 1684.9241 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: -2433.7966 + outSlope: -2433.7966 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 496.28058 + outSlope: 496.28058 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 13.3114 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: -496.28058 + outSlope: -496.28058 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 861.3452 + outSlope: 861.3452 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 13.737091 + inSlope: -136.00702 + outSlope: -136.00702 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: -997.35223 + outSlope: -997.35223 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 451.76105 + outSlope: 451.76105 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 11.134823 + inSlope: -117.12317 + outSlope: -117.12317 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: -568.8842 + outSlope: -568.8842 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 955.3089 + outSlope: 955.3089 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 34.626522 + inSlope: -335.64886 + outSlope: -335.64886 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: -1290.9578 + outSlope: -1290.9578 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 1589.6243 + outSlope: 1589.6243 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 29.961454 + inSlope: 556.36865 + outSlope: 556.36865 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: -54.68274 + outSlope: -54.68274 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 14.897293 + inSlope: -733.92725 + outSlope: -733.92725 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: -1712.5001 + outSlope: -1712.5001 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 1931.222 + outSlope: 1931.222 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 19.979551 + inSlope: 673.6306 + outSlope: 673.6306 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 284.91748 + outSlope: 284.91748 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 15.351751 + inSlope: 867.1295 + outSlope: 867.1295 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 188.6427 + outSlope: 188.6427 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 17.994469 + inSlope: -90.68677 + outSlope: -90.68677 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 300.87024 + outSlope: 300.87024 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 14.56328 + inSlope: -179.36792 + outSlope: -179.36792 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 112.48401 + outSlope: 112.48401 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 39.294346 + inSlope: -364.90942 + outSlope: -364.90942 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: -1912.3405 + outSlope: -1912.3405 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 991.48956 + outSlope: 991.48956 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 28.750345 + inSlope: -247.87335 + outSlope: -247.87335 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: -1239.3629 + outSlope: -1239.3629 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 1221.0262 + outSlope: 1221.0262 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 28.325014 + inSlope: -555.0132 + outSlope: -555.0132 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: -571.27747 + outSlope: -571.27747 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 15.720588 + inSlope: 219.04724 + outSlope: 219.04724 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: -985.7147 + outSlope: -985.7147 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 1891.8145 + outSlope: 1891.8145 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 28.79993 + inSlope: 86.00342 + outSlope: 86.00342 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: -1805.811 + outSlope: -1805.811 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 1462.0647 + outSlope: 1462.0647 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 29.676996 + inSlope: -946.052 + outSlope: -946.052 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: -2408.1167 + outSlope: -2408.1167 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 1715.2272 + outSlope: 1715.2272 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 26.111767 + inSlope: -686.0946 + outSlope: -686.0946 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: -2401.3218 + outSlope: -2401.3218 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 2812.1772 + outSlope: 2812.1772 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 26.502213 + inSlope: 374.94873 + outSlope: 374.94873 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: -2437.2285 + outSlope: -2437.2285 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 1820.7487 + outSlope: 1820.7487 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 29.038055 + inSlope: -1040.4249 + outSlope: -1040.4249 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: -2861.1736 + outSlope: -2861.1736 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 1806.6193 + outSlope: 1806.6193 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 14.406357 + inSlope: -401.4801 + outSlope: -401.4801 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: -474.8734 + outSlope: -474.8734 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 15.077642 + inSlope: 133.31152 + outSlope: 133.31152 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: -1599.9144 + outSlope: -1599.9144 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 629.86755 + outSlope: 629.86755 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 14.611485 + inSlope: -555.76416 + outSlope: -555.76416 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: -1185.6317 + outSlope: -1185.6317 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 3471.7876 + outSlope: 3471.7876 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 37.75192 + inSlope: 1735.8938 + outSlope: 1735.8938 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: -608.9332 + outSlope: -608.9332 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 25.325958 + inSlope: -391.99 + outSlope: -391.99 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: -465.1565 + outSlope: -465.1565 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 13.750651 + inSlope: 55.466003 + outSlope: 55.466003 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: -998.32806 + outSlope: -998.32806 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 1558.4655 + outSlope: 1558.4655 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 14.6871195 + inSlope: -0.01977539 + outSlope: -0.01977539 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: -1558.4852 + outSlope: -1558.4852 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 629.45074 + outSlope: 629.45074 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 15.970742 + inSlope: -371.94922 + outSlope: -371.94922 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: -1001.39996 + outSlope: -1001.39996 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 2648.36 + outSlope: 2648.36 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 28.79804 + inSlope: 165.51904 + outSlope: 165.51904 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: -507.7379 + outSlope: -507.7379 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 31.5 + inSlope: 1518.0042 + outSlope: 1518.0042 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 26.198189 + inSlope: -3159.2546 + outSlope: -3159.2546 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: -1228.4961 + outSlope: -1228.4961 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 14.556517 + inSlope: 218.66052 + outSlope: 218.66052 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: -462.30444 + outSlope: -462.30444 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 13.7914915 + inSlope: 828.5205 + outSlope: 828.5205 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6325 + value: 14.8303385 + inSlope: -4055.8005 + outSlope: -4055.8005 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: -4091.6262 + outSlope: -4091.6262 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6469985 + value: 0 + inSlope: 3833.001 + outSlope: 3833.001 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 13.893393 + inSlope: 2874.743 + outSlope: 2874.743 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: -958.2581 + outSlope: -958.2581 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 1573.6434 + outSlope: 1573.6434 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 15.970911 + inSlope: -262.26672 + outSlope: -262.26672 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: -351.67688 + outSlope: -351.67688 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 13.987549 + inSlope: 197.89343 + outSlope: 197.89343 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 865.8596 + outSlope: 865.8596 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 28.083294 + inSlope: -126.57544 + outSlope: -126.57544 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: -402.98462 + outSlope: -402.98462 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 16.317612 + inSlope: 551.72327 + outSlope: 551.72327 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: -1324.067 + outSlope: -1324.067 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 1835.5093 + outSlope: 1835.5093 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 14.636622 + inSlope: 152.9801 + outSlope: 152.9801 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 421.05774 + outSlope: 421.05774 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 13.7244835 + inSlope: 989.9352 + outSlope: 989.9352 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: -1113.6517 + outSlope: -1113.6517 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 2169.5369 + outSlope: 2169.5369 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 23.591356 + inSlope: -333.76636 + outSlope: -333.76636 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: -1033.3517 + outSlope: -1033.3517 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 14.918541 + inSlope: 386.82263 + outSlope: 386.82263 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 1033.0361 + outSlope: 1033.0361 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 26.079313 + inSlope: 117.543335 + outSlope: 117.543335 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: -645.5254 + outSlope: -645.5254 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 15.694327 + inSlope: 79.60474 + outSlope: 79.60474 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: -1273.4916 + outSlope: -1273.4916 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 1450.913 + outSlope: 1450.913 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 13.673534 + inSlope: 593.55286 + outSlope: 593.55286 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 84.01837 + outSlope: 84.01837 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 26.614796 + inSlope: 1133.9177 + outSlope: 1133.9177 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 31.5 + inSlope: -1085.476 + outSlope: -1085.476 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: -698.6255 + outSlope: -698.6255 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 15.540583 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 364.30884 + outSlope: 364.30884 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 23.943998 + inSlope: -999.1996 + outSlope: -999.1996 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: -1942.8982 + outSlope: -1942.8982 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 1005.58966 + outSlope: 1005.58966 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 16.037561 + inSlope: 1773.6958 + outSlope: 1773.6958 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 26.617117 + inSlope: -2569.77 + outSlope: -2569.77 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: -643.0259 + outSlope: -643.0259 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 27.350042 + inSlope: 979.9437 + outSlope: 979.9437 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: -1187.4918 + outSlope: -1187.4918 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 12.999506 + inSlope: -136.73706 + outSlope: -136.73706 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: -664.15186 + outSlope: -664.15186 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 1448.4205 + outSlope: 1448.4205 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 31.5 + inSlope: -135.11353 + outSlope: -135.11353 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: -1583.534 + outSlope: -1583.534 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 1684.8817 + outSlope: 1684.8817 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 25.649776 + inSlope: -1263.6569 + outSlope: -1263.6569 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: -2948.5386 + outSlope: -2948.5386 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 2655.852 + outSlope: 2655.852 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 26.432251 + inSlope: 1493.0011 + outSlope: 1493.0011 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 324.79993 + outSlope: 324.79993 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 30.982412 + inSlope: -156.14221 + outSlope: -156.14221 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 518.0309 + outSlope: 518.0309 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 25.074682 + inSlope: -308.83105 + outSlope: -308.83105 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: -664.9009 + outSlope: -664.9009 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 45.854015 + inSlope: 3934.7427 + outSlope: 3934.7427 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 89.6 + inSlope: 2138.6428 + outSlope: 2138.6428 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21072696 + value: 89.879944 + inSlope: -6001.193 + outSlope: -6001.193 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: -6010.847 + outSlope: -6010.847 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.22522554 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 2074.3281 + outSlope: 2074.3281 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 27.067303 + inSlope: 377.1499 + outSlope: 377.1499 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: -1697.1782 + outSlope: -1697.1782 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 3110.5906 + outSlope: 3110.5906 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 24.804495 + inSlope: -691.2583 + outSlope: -691.2583 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: -817.625 + outSlope: -817.625 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 25.960297 + inSlope: 229.53247 + outSlope: 229.53247 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: -2754.6914 + outSlope: -2754.6914 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 1084.4897 + outSlope: 1084.4897 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 25.157679 + inSlope: -956.9005 + outSlope: -956.9005 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: -2041.3903 + outSlope: -2041.3903 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 4051.3567 + outSlope: 4051.3567 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 44.054104 + inSlope: 2025.6783 + outSlope: 2025.6783 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: -2025.6783 + outSlope: -2025.6783 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 1814.3955 + outSlope: 1814.3955 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 23.675518 + inSlope: 95.49988 + outSlope: 95.49988 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: -1718.8956 + outSlope: -1718.8956 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 2683.3257 + outSlope: 2683.3257 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 25.287905 + inSlope: -0.033935547 + outSlope: -0.033935547 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: -2683.3596 + outSlope: -2683.3596 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 2537.3093 + outSlope: 2537.3093 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 25.063036 + inSlope: 376.4839 + outSlope: 376.4839 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: -2160.8254 + outSlope: -2160.8254 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 824.952 + outSlope: 824.952 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 23.921286 + inSlope: -824.952 + outSlope: -824.952 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: -1649.904 + outSlope: -1649.904 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 2555.5146 + outSlope: 2555.5146 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 24.0834 + inSlope: 340.72778 + outSlope: 340.72778 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: -2214.7869 + outSlope: -2214.7869 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 3229.6875 + outSlope: 3229.6875 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 28.095243 + inSlope: 949.9431 + outSlope: 949.9431 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: -2279.7444 + outSlope: -2279.7444 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 3160.3328 + outSlope: 3160.3328 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 25.20096 + inSlope: 263.39722 + outSlope: 263.39722 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 724.9663 + outSlope: 724.9663 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 23.630463 + inSlope: 1704.4451 + outSlope: 1704.4451 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: -1917.4568 + outSlope: -1917.4568 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 2530.9246 + outSlope: 2530.9246 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 25.68636 + inSlope: 666.02124 + outSlope: 666.02124 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: -1864.9033 + outSlope: -1864.9033 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 2329.7263 + outSlope: 2329.7263 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 27.022089 + inSlope: 137.06128 + outSlope: 137.06128 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: -2192.665 + outSlope: -2192.665 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 2498.1445 + outSlope: 2498.1445 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 23.54274 + inSlope: 1021.964 + outSlope: 1021.964 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: -1476.1805 + outSlope: -1476.1805 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: 8239.903 + outSlope: 8239.903 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 89.6 + inSlope: 4119.9517 + outSlope: 4119.9517 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: -4119.9517 + outSlope: -4119.9517 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 1724.3403 + outSlope: 1724.3403 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 26.250475 + inSlope: -1293.2507 + outSlope: -1293.2507 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: -3017.591 + outSlope: -3017.591 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 2718.05 + outSlope: 2718.05 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 27.051273 + inSlope: 1527.9661 + outSlope: 1527.9661 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 332.40662 + outSlope: 332.40662 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 31.707996 + inSlope: -159.79895 + outSlope: -159.79895 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 530.1626 + outSlope: 530.1626 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 25.661911 + inSlope: -316.06348 + outSlope: -316.06348 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: -722.7615 + outSlope: -722.7615 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 45.854015 + inSlope: 3944.4763 + outSlope: 3944.4763 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 89.8 + inSlope: 2290.7803 + outSlope: 2290.7803 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21072696 + value: 94.20925 + inSlope: -6148.318 + outSlope: -6148.318 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: -6300.376 + outSlope: -6300.376 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.22522554 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 2122.9072 + outSlope: 2122.9072 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 27.701199 + inSlope: 385.9823 + outSlope: 385.9823 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: -1736.9249 + outSlope: -1736.9249 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 3183.4382 + outSlope: 3183.4382 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 25.385397 + inSlope: -707.447 + outSlope: -707.447 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: -836.7732 + outSlope: -836.7732 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 26.568266 + inSlope: 234.90796 + outSlope: 234.90796 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: -2819.204 + outSlope: -2819.204 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 1109.8876 + outSlope: 1109.8876 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 25.746851 + inSlope: -979.3104 + outSlope: -979.3104 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: -2089.198 + outSlope: -2089.198 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 4051.3567 + outSlope: 4051.3567 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 44.054104 + inSlope: 2025.6783 + outSlope: 2025.6783 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: -2025.6783 + outSlope: -2025.6783 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 1856.8872 + outSlope: 1856.8872 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 24.22998 + inSlope: 97.73633 + outSlope: 97.73633 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: -1759.1509 + outSlope: -1759.1509 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 2746.167 + outSlope: 2746.167 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 25.880127 + inSlope: -0.03491211 + outSlope: -0.03491211 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: -2746.202 + outSlope: -2746.202 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 2596.731 + outSlope: 2596.731 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 25.649992 + inSlope: 385.30078 + outSlope: 385.30078 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: -2211.4302 + outSlope: -2211.4302 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 844.2717 + outSlope: 844.2717 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 24.481503 + inSlope: -844.2717 + outSlope: -844.2717 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: -1688.5435 + outSlope: -1688.5435 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 2615.3628 + outSlope: 2615.3628 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 24.647415 + inSlope: 348.70752 + outSlope: 348.70752 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: -2266.6553 + outSlope: -2266.6553 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 3305.3242 + outSlope: 3305.3242 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 28.753212 + inSlope: 972.18994 + outSlope: 972.18994 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: -2333.1343 + outSlope: -2333.1343 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 3234.3452 + outSlope: 3234.3452 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 25.791147 + inSlope: 269.56567 + outSlope: 269.56567 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 741.94434 + outSlope: 741.94434 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 24.183868 + inSlope: 1744.3618 + outSlope: 1744.3618 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: -1962.362 + outSlope: -1962.362 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 2590.197 + outSlope: 2590.197 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 26.287914 + inSlope: 681.619 + outSlope: 681.619 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: -1908.578 + outSlope: -1908.578 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 2384.2866 + outSlope: 2384.2866 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 27.654924 + inSlope: 140.27124 + outSlope: 140.27124 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: -2244.0154 + outSlope: -2244.0154 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 2556.649 + outSlope: 2556.649 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 24.094091 + inSlope: 1045.8975 + outSlope: 1045.8975 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: -1510.7515 + outSlope: -1510.7515 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: 8258.297 + outSlope: 8258.297 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 89.8 + inSlope: 4129.1484 + outSlope: 4129.1484 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: -4129.1484 + outSlope: -4129.1484 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 2197.8435 + outSlope: 2197.8435 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 33.458843 + inSlope: -1648.3767 + outSlope: -1648.3767 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: -3846.2202 + outSlope: -3846.2202 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 3464.425 + outSlope: 3464.425 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 34.479538 + inSlope: 1947.5447 + outSlope: 1947.5447 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 423.68542 + outSlope: 423.68542 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 40.414997 + inSlope: -203.67957 + outSlope: -203.67957 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 675.7451 + outSlope: 675.7451 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 32.70866 + inSlope: -402.8545 + outSlope: -402.8545 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: -3222.845 + outSlope: -3222.845 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 1396.7448 + outSlope: 1396.7448 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 28.7 + inSlope: 1367.534 + outSlope: 1367.534 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21072696 + value: 27.852974 + inSlope: -1891.9174 + outSlope: -1891.9174 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: -1862.7067 + outSlope: -1862.7067 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.22522554 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 2705.8567 + outSlope: 2705.8567 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 35.307934 + inSlope: 491.97314 + outSlope: 491.97314 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: -2213.8835 + outSlope: -2213.8835 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 4057.6086 + outSlope: 4057.6086 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 32.356213 + inSlope: -901.7112 + outSlope: -901.7112 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: -1066.55 + outSlope: -1066.55 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 33.8639 + inSlope: 299.41357 + outSlope: 299.41357 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: -3593.3562 + outSlope: -3593.3562 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 1414.6622 + outSlope: 1414.6622 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 32.816925 + inSlope: -1248.2286 + outSlope: -1248.2286 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: -2662.8909 + outSlope: -2662.8909 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 2366.7876 + outSlope: 2366.7876 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 30.883522 + inSlope: 124.57471 + outSlope: 124.57471 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: -2242.213 + outSlope: -2242.213 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 3500.2632 + outSlope: 3500.2632 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 32.986797 + inSlope: -0.044433594 + outSlope: -0.044433594 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: -3500.3076 + outSlope: -3500.3076 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 3309.792 + outSlope: 3309.792 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 32.693466 + inSlope: 491.10425 + outSlope: 491.10425 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: -2818.6877 + outSlope: -2818.6877 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 1076.1084 + outSlope: 1076.1084 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 31.204111 + inSlope: -1076.1084 + outSlope: -1076.1084 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: -2152.2168 + outSlope: -2152.2168 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 3333.5403 + outSlope: 3333.5403 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 31.415585 + inSlope: 444.4624 + outSlope: 444.4624 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: -2889.078 + outSlope: -2889.078 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 4212.965 + outSlope: 4212.965 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 36.64883 + inSlope: 1239.1531 + outSlope: 1239.1531 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: -2973.8118 + outSlope: -2973.8118 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 4122.4946 + outSlope: 4122.4946 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 32.873383 + inSlope: 343.58813 + outSlope: 343.58813 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 945.6819 + outSlope: 945.6819 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 30.824747 + inSlope: 2223.3625 + outSlope: 2223.3625 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: -2501.2258 + outSlope: -2501.2258 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 3301.464 + outSlope: 3301.464 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 33.506565 + inSlope: 868.79126 + outSlope: 868.79126 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: -2432.6729 + outSlope: -2432.6729 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 3039.0107 + outSlope: 3039.0107 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 35.248955 + inSlope: 178.78955 + outSlope: 178.78955 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: -2860.2212 + outSlope: -2860.2212 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 3258.7036 + outSlope: 3258.7036 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 30.710318 + inSlope: 1333.1005 + outSlope: 1333.1005 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: -1925.6031 + outSlope: -1925.6031 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: 2639.3442 + outSlope: 2639.3442 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 28.7 + inSlope: 1319.6721 + outSlope: 1319.6721 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: -1319.6721 + outSlope: -1319.6721 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 174.12659 + outSlope: 174.12659 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 1.801435 + inSlope: 60.73719 + outSlope: 60.73719 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: -113.3894 + outSlope: -113.3894 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 56.753757 + outSlope: 56.753757 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 1.439985 + inSlope: -33.53641 + outSlope: -33.53641 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: -90.29017 + outSlope: -90.29017 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 6270.169 + outSlope: 6270.169 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 100 + inSlope: -2351.3936 + outSlope: -2351.3936 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: -8621.5625 + outSlope: -8621.5625 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 71.47248 + outSlope: 71.47248 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 1.2434952 + inSlope: 72.98344 + outSlope: 72.98344 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6325 + value: 1.2873087 + inSlope: -353.65195 + outSlope: -353.65195 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: -355.1629 + outSlope: -355.1629 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6469985 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 141.8859 + outSlope: 141.8859 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 1.4400002 + inSlope: -23.646988 + outSlope: -23.646988 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: -165.53288 + outSlope: -165.53288 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 3941.2742 + outSlope: 3941.2742 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 100 + inSlope: -115.91699 + outSlope: -115.91699 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: -4004.9512 + outSlope: -4004.9512 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 1.4012 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: -52.24006 + outSlope: -52.24006 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 90.66792 + outSlope: 90.66792 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 1.4460096 + inSlope: -14.316521 + outSlope: -14.316521 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: -104.98444 + outSlope: -104.98444 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 47.553795 + outSlope: 47.553795 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 1.1720866 + inSlope: -12.328751 + outSlope: -12.328751 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: -59.882545 + outSlope: -59.882545 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 4598.1606 + outSlope: 4598.1606 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 100 + inSlope: -428.93164 + outSlope: -428.93164 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: -5027.0923 + outSlope: -5027.0923 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 894.3774 + outSlope: 894.3774 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 9.252825 + inSlope: 311.96826 + outSlope: 311.96826 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: -582.4091 + outSlope: -582.4091 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 291.50793 + outSlope: 291.50793 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 7.3962865 + inSlope: -172.25519 + outSlope: -172.25519 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: -463.76312 + outSlope: -463.76312 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 367.10864 + outSlope: 367.10864 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 6.3870435 + inSlope: 383.7462 + outSlope: 383.7462 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6325 + value: 6.8694854 + inSlope: -1878.6238 + outSlope: -1878.6238 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: -1895.2614 + outSlope: -1895.2614 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6469985 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 728.7775 + outSlope: 728.7775 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 7.3963647 + inSlope: -121.459595 + outSlope: -121.459595 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: -850.2371 + outSlope: -850.2371 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: 268.32397 + outSlope: 268.32397 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 7.1970735 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: -268.32397 + outSlope: -268.32397 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 465.70343 + outSlope: 465.70343 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 7.4272313 + inSlope: -73.53485 + outSlope: -73.53485 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: -539.2383 + outSlope: -539.2383 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 244.25359 + outSlope: 244.25359 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 6.020263 + inSlope: -63.324966 + outSlope: -63.324966 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: -307.57855 + outSlope: -307.57855 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 869.05 + outSlope: 869.05 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 12.6 + inSlope: -96.56287 + outSlope: -96.56287 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: -965.61285 + outSlope: -965.61285 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 1299.6 + outSlope: 1299.6 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 12.6 + inSlope: 24.01233 + outSlope: 24.01233 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: -1275.5876 + outSlope: -1275.5876 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 1022.4073 + outSlope: 1022.4073 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 12.6 + inSlope: 194.73969 + outSlope: 194.73969 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: -827.6676 + outSlope: -827.6676 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 1336.9991 + outSlope: 1336.9991 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 12.6 + inSlope: 95.49768 + outSlope: 95.49768 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: -1241.5015 + outSlope: -1241.5015 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 511.20612 + outSlope: 511.20612 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 12.6 + inSlope: 41.448242 + outSlope: 41.448242 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: -469.75787 + outSlope: -469.75787 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 4607.344 + outSlope: 4607.344 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 66.8 + inSlope: -511.93652 + outSlope: -511.93652 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: -5119.281 + outSlope: -5119.281 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: 6889.943 + outSlope: 6889.943 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 66.8 + inSlope: 127.30371 + outSlope: 127.30371 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: -6762.639 + outSlope: -6762.639 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 5420.3813 + outSlope: 5420.3813 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 66.8 + inSlope: 1032.4292 + outSlope: 1032.4292 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: -4387.952 + outSlope: -4387.952 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 7088.218 + outSlope: 7088.218 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 66.8 + inSlope: 506.28955 + outSlope: 506.28955 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: -6581.928 + outSlope: -6581.928 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 0 + inSlope: 2710.2039 + outSlope: 2710.2039 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 66.8 + inSlope: 219.74146 + outSlope: 219.74146 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: -2490.4624 + outSlope: -2490.4624 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.015948424 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.03407163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047482807 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.05726934 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.06524355 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.07466762 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.08916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.09677793 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.101127505 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.106202 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.113088824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1182616 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.12620518 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1311814 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.14254668 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.15295988 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16238394 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.16818337 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.17325787 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.18595451 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.1962284 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.21820344 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.232702 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.24430084 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.25263754 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2642364 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.2722106 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.27873495 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.28670916 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.29395846 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3004828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.30809453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.31606877 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.32549283 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.33564183 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3418037 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3479656 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.35557735 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3610143 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.36463895 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.369351 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.37478796 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.3813123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.38928652 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39436102 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.39798567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40197277 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40523493 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.40958452 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.41429654 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4237206 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.43531945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.44148135 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.4472808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.45271775 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.46359167 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.47482806 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48316473 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.48968908 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.49657592 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.52376074 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5284728 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.53318477 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.54260886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5552951 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5632693 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5687063 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57414323 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.57994264 + value: 0 + inSlope: 1009.4972 + outSlope: 1009.4972 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5879169 + value: 16.1 + inSlope: -378.57446 + outSlope: -378.57446 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5937163 + value: 0 + inSlope: -1388.0717 + outSlope: -1388.0717 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.59856397 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.60350287 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6093023 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6180014 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6343123 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.64881086 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.65606016 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.662222 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.66802144 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67309594 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.67744553 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.6821576 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.68759453 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.69411886 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7002808 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7046303 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.71079224 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7162292 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7202163 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.72456586 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.727828 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.73398995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7416017 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.74703866 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7517507 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7568252 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.763712 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7698739 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.77639824 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.78219765 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.7883596 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.794159 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.79887104 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.80684525 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8209813 + value: 0 + inSlope: 634.54517 + outSlope: 634.54517 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8336676 + value: 16.1 + inSlope: -18.662659 + outSlope: -18.662659 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8459914 + value: 0 + inSlope: -653.2078 + outSlope: -653.2078 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.85940254 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8728137 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.88549995 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8916619 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.8981862 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.90507305 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91304725 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.91993403 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92392117 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.92899567 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9369699 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9492937 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9590802 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9645172 + value: 0 + inSlope: 740.30383 + outSlope: 740.30383 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9753911 + value: 16.1 + inSlope: -69.05798 + outSlope: -69.05798 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.9853372 + value: 0 + inSlope: -809.3618 + outSlope: -809.3618 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.014863804 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.047377624 + value: 26.378368 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.08055679 + value: 26.679913 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.15023647 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.21545386 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4149345 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4631474 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5057769 + value: 50.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5559 + value: 47.1137 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.606023 + value: 48.60745 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6561461 + value: 51.228706 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7262764 + value: 36.272396 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7988048 + value: 36.278725 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.82669324 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9098401 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.014863804 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.047377624 + value: 26.194744 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.08055679 + value: 27.07059 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.15023647 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.21545386 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4149345 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4631474 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5057769 + value: 49.9 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5559 + value: 47.28565 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.606023 + value: 48.843777 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6561461 + value: 51.35464 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7262764 + value: 36.1276 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7988048 + value: 36.487816 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.82669324 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9098401 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047377624 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.08055679 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.15023647 + value: 19.6075 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.21545386 + value: 20.288254 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.24857658 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.38446212 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4149345 + value: 27.664536 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4631474 + value: 28.508976 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5057769 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6561461 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7262764 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7988048 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.82669324 + value: 27.5 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9098401 + value: 27.568964 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.95455945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047377624 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.08055679 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.15023647 + value: 20.035301 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.21545386 + value: 20.357628 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.24857658 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.38446212 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4149345 + value: 28.53807 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4631474 + value: 29.158922 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5057769 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6561461 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7262764 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7988048 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.82669324 + value: 28.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9098401 + value: 28.78099 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.95455945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047377624 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.08055679 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.15023647 + value: 15.5434 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.21545386 + value: 16.033016 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.24857658 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.38446212 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4149345 + value: 22.24099 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4631474 + value: 23.111118 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5057769 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6561461 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7262764 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7988048 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.82669324 + value: 21.8 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9098401 + value: 22.294168 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.95455945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + - serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.047377624 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.08055679 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.15023647 + value: 16.1138 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.21545386 + value: 16.623226 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.24857658 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.38446212 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4149345 + value: 22.69041 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.4631474 + value: 23.907522 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.5057769 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.6561461 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7262764 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.7988048 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.82669324 + value: 22.6 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.9098401 + value: 22.9381 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.95455945 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + bones: [] + boneCurves: [] + boneNeutralPositions: [] + boneNeutralScales: [] + boneNeutralRotations: [] diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.asset.meta new file mode 100644 index 0000000..555c65f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c003f5c3254331749915c80d6b3fdab4 +timeCreated: 1442495234 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.txt new file mode 100644 index 0000000..8322a20 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.txt @@ -0,0 +1 @@ +Four score and seven years ago, our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.txt.meta new file mode 100644 index 0000000..cad40bc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3286929e257331843bc37e7e5e75fdcb +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.wav b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.wav new file mode 100644 index 0000000..3662b1f Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.wav differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.wav.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.wav.meta new file mode 100644 index 0000000..91dfb54 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Gettysburg.wav.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: f2d6afe568dab594199362b87ce57820 +AudioImporter: + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 0 + compressionFormat: 0 + quality: 0 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + preloadAudioData: 1 + loadInBackground: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.asset new file mode 100644 index 0000000..89707b3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.asset @@ -0,0 +1,687 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9f44607bd270d4f4eaa8869ed9b5b85c, type: 3} + m_Name: Tempest + m_EditorClassIdentifier: + clip: {fileID: 8300000, guid: c996c7abc480a0340ac78e83807dc1c8, type: 3} + phonemeData: + - phoneme: 0 + phonemeNumber: 8 + time: 0.043428306 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.05645679 + intensity: 0.561 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.07961856 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.09554227 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.1260668 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.14690873 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.17081799 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 2 + time: 0.1881893 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 5 + time: 0.20294845 + intensity: 0.656 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.22628249 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.24262077 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.28029707 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.30590105 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.32182476 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.345938 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.35995877 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.371995 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.39374995 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 3 + time: 0.4053308 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.41980693 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.5298253 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.5418615 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.56084365 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 6 + time: 0.5729615 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 6 + time: 0.6079962 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 6 + time: 0.6282628 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.6427389 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 5 + time: 0.6639977 + intensity: 0.789 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.71946216 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.73724806 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 3 + time: 0.75077266 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 8 + time: 0.76679236 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.78170943 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.7932903 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.80578184 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.8222425 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 8 + time: 0.83961385 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.8526423 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.863435 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 1 + time: 0.9206031 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 7 + time: 0.96754706 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.2586879 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.5841106 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.5955468 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.7106318 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 6 + time: 0.8999792 + intensity: 1 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.94384176 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 0 + time: 0.8743565 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + - phoneme: 0 + phonemeNumber: 4 + time: 0.8866612 + intensity: 0.361 + sustain: 0 + useRandomness: 1 + intensityRandomness: 0.147 + blendableRandomness: 0 + bonePositionRandomness: 0.032 + boneRotationRandomness: 0 + emotionData: + - emotion: Eyebrows Up + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.053165447 + endTime: 0.2778432 + blendInTime: 0.09899144 + blendOutTime: -0.04465118 + blendToMarker: 1 + blendFromMarker: 0 + customBlendIn: 1 + customBlendOut: 0 + intensity: 0.502 + continuousVariation: 1 + variationFrequency: 0.31 + intensityVariation: 0.484 + blendableVariation: 0 + bonePositionVariation: 0.043 + boneRotationVariation: 0.057 + invalid: 0 + - emotion: Eyebrows Up + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.23319203 + endTime: 0.43179667 + blendInTime: 0.04465118 + blendOutTime: -0.099418595 + blendToMarker: 0 + blendFromMarker: 1 + customBlendIn: 0 + customBlendOut: 1 + intensity: 1 + continuousVariation: 1 + variationFrequency: 0.31 + intensityVariation: 0.484 + blendableVariation: 0 + bonePositionVariation: 0.043 + boneRotationVariation: 0.057 + invalid: 0 + - emotion: Serious + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.4772093 + endTime: 0.73906976 + blendInTime: 0.0510465 + blendOutTime: -0.15058124 + blendToMarker: 1 + blendFromMarker: 0 + customBlendIn: 1 + customBlendOut: 0 + intensity: 0.276 + continuousVariation: 1 + variationFrequency: 0.31 + intensityVariation: 0.484 + blendableVariation: 0 + bonePositionVariation: 0.043 + boneRotationVariation: 0.057 + invalid: 0 + - emotion: Eyebrows Up + isMixer: 0 + mixer: + emotions: [] + mixingMode: 0 + displayColor: {r: 0, g: 0, b: 0, a: 1} + startTime: 0.5884885 + endTime: 0.97619367 + blendInTime: 0.15058124 + blendOutTime: -0.16010942 + blendToMarker: 0 + blendFromMarker: 1 + customBlendIn: 0 + customBlendOut: 1 + intensity: 1 + continuousVariation: 1 + variationFrequency: 0.31 + intensityVariation: 0.484 + blendableVariation: 0 + bonePositionVariation: 0.043 + boneRotationVariation: 0.057 + invalid: 0 + gestureData: [] + version: 1.5 + length: 6.9079375 + transcript: We are such stuff as dreams are made on, and our little life is rounded + with a sleep. + phonemePoseCurves: [] + emotionPoseCurves: [] + targetComponentID: 14422 + isPreprocessed: 0 + indexBlendables: + animCurves: [] + bones: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + boneCurves: [] + boneNeutralPositions: + - {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + - {x: -0.030468669, y: 0.01108454, z: 0.00000092} + - {x: -0.02006943, y: 0.00000014999999, z: 0} + - {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + - {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + - {x: -0.082216784, y: -0.0012813, z: 0.00000345} + - {x: 0.0006128, y: -0.00284875, z: -0.01110797} + - {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + - {x: -0.00767929, y: 0.11334918, z: -0.00000191} + - {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + - {x: 0.00144196, y: -0.00500203, z: 0.013093869} + - {x: -0.00183151, y: 0.09658222, z: -0.023029579} + - {x: -0.00183151, y: 0.09658269, z: 0.023026088} + - {x: -0.08304909, y: 0.0964711, z: 0.01359899} + - {x: -0.08304919, y: 0.09647081, z: -0.01360247} + - {x: -0.061823558, y: 0.088723354, z: 0.031141039} + - {x: -0.061823577, y: 0.08872271, z: -0.031144349} + - {x: -0.08835421, y: 0.088128105, z: 0.040872596} + - {x: -0.088354185, y: 0.08812728, z: -0.0408759} + boneNeutralScales: + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + - {x: 1, y: 1, z: 1} + boneNeutralRotations: + - {x: -0.000005656859, y: 0.00000070711053, z: -0.7071034, w: 0.70711017} + - {x: 0, y: 0, z: 0.116483636, w: 0.9931926} + - {x: 0, y: 0, z: -0.06936673, w: 0.9975912} + - {x: 0, y: 0, z: -0.039998263, w: 0.99919975} + - {x: 0.000006363962, y: -0.0000014142583, z: 0.7071035, w: 0.70711005} + - {x: 0.00006470044, y: 0.00006470028, z: 0.7071075, w: 0.70710605} + - {x: 0, y: 0, z: 0, w: 1} + - {x: 0, y: 0, z: 0, w: 1} + - {x: -3.5000009e-12, y: -0.0000010000009, z: -0.0000035000025, w: 1} + - {x: 0, y: 0, z: 0, w: 1} + - {x: 0, y: 0, z: 0, w: 1} + - {x: -3.5000009e-12, y: -0.0000010000009, z: -0.0000035000025, w: 1} + - {x: -3.5000009e-12, y: -0.0000010000009, z: -0.0000035000025, w: 1} + - {x: 3.688062e-12, y: -0.0000010652644, z: -0.0000034621094, w: 1} + - {x: 3.688062e-12, y: -0.0000010652644, z: -0.0000034621094, w: 1} + - {x: 0.00008801748, y: 0.0000039945658, z: 0.0000019970194, w: 1} + - {x: 0.00008801748, y: 0.0000039945658, z: 0.0000019970194, w: 1} + - {x: 3.688062e-12, y: -0.0000010652644, z: -0.0000034621094, w: 1} + - {x: 3.688062e-12, y: -0.0000010652644, z: -0.0000034621094, w: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.asset.meta new file mode 100644 index 0000000..a0e91cb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5b1de93257d52941b998f717ade5136 +timeCreated: 1459974496 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.txt new file mode 100644 index 0000000..756ec9c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.txt @@ -0,0 +1 @@ +We are such stuff as dreams are made on, and our little life is rounded with a sleep. \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.txt.meta new file mode 100644 index 0000000..946a319 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8fa9fc3b649f0a6439032c96088a5c7a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.wav b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.wav new file mode 100644 index 0000000..f690f30 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.wav differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.wav.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.wav.meta new file mode 100644 index 0000000..f64ce8c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Audio/Tempest.wav.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: c996c7abc480a0340ac78e83807dc1c8 +timeCreated: 1459973553 +licenseType: Free +AudioImporter: + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + preloadAudioData: 1 + loadInBackground: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_01_Lincoln.unity b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_01_Lincoln.unity new file mode 100644 index 0000000..9433d6e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_01_Lincoln.unity @@ -0,0 +1,3453 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 1, g: 0.9126774, b: 0.8455882, a: 1} + m_AmbientEquatorColor: {r: 0.09558821, g: 0.09558821, b: 0.09558821, a: 1} + m_AmbientGroundColor: {r: 0.09558821, g: 0.09558821, b: 0.09558821, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 1 + m_BakeResolution: 50 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &74695243 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 74695244} + m_Layer: 0 + m_Name: mixamorig_RightLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &74695244 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 74695243} + m_LocalRotation: {x: 0.04816381, y: -0.04368151, z: -0.0043556513, w: 0.9978744} + m_LocalPosition: {x: 0.000000009313226, y: 0.406804, z: -4.656613e-10} + m_LocalScale: {x: 0.99999994, y: 0.9999997, z: 0.9999998} + m_Children: + - {fileID: 411394829} + m_Father: {fileID: 718194729} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &150665560 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 150665564} + - component: {fileID: 150665563} + - component: {fileID: 150665562} + m_Layer: 5 + m_Name: About + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &150665562 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150665560} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.14705884, g: 0.14705884, b: 0.14705884, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: 'LipSync Pro 1.53 - Lincoln Demo + + + Standard animation using the + + Blendshape Blend System.' +--- !u!222 &150665563 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150665560} +--- !u!224 &150665564 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150665560} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 306413163} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 35, y: -143.1} + m_SizeDelta: {x: 400, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!1 &208309528 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 208309529} + - component: {fileID: 208309530} + m_Layer: 0 + m_Name: Eyelashes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &208309529 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 208309528} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &208309530 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 208309528} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: bae21052dadf95443bacebf61af2d180, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300004, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 808863659} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 808863659} + m_AABB: + m_Center: {x: -0.00035601482, y: 0.07441538, z: 0.10325476} + m_Extent: {x: 0.053792693, y: 0.009807289, z: 0.012436353} + m_DirtyAABB: 0 +--- !u!1 &226404378 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 226404379} + m_Layer: 0 + m_Name: mixamorig_HeadTop_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &226404379 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 226404378} + m_LocalRotation: {x: 1.16e-42, y: -1.7439706e-16, z: 6.653809e-27, w: 1} + m_LocalPosition: {x: 0.000085874606, y: 0.18782684, z: 0.06796168} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 808863659} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &232474250 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 232474251} + - component: {fileID: 232474252} + m_Layer: 0 + m_Name: Shoes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &232474251 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 232474250} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &232474252 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 232474250} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d7aacf9a239c81648a8ebac11cd24dbf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300014, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 74695244} + - {fileID: 411394829} + - {fileID: 300068549} + - {fileID: 1128306104} + - {fileID: 1847358406} + - {fileID: 1952941721} + - {fileID: 1195966591} + - {fileID: 1129910880} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1847358406} + m_AABB: + m_Center: {x: -0.08032758, y: 0.4964792, z: 0.077514246} + m_Extent: {x: 0.17312235, y: 0.18285155, z: 0.18961094} + m_DirtyAABB: 0 +--- !u!1 &267445401 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 267445402} + m_Layer: 0 + m_Name: mixamorig_LeftEye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &267445402 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 267445401} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 808863659} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &300068548 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 300068549} + m_Layer: 0 + m_Name: mixamorig_RightToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &300068549 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 300068548} + m_LocalRotation: {x: 0.3968524, y: 0.036018014, z: -0.013107239, w: 0.9170819} + m_LocalPosition: {x: -0.0000000027939682, y: 0.16248362, z: -0.00000003725291} + m_LocalScale: {x: 0.99999976, y: 1, z: 0.99999994} + m_Children: + - {fileID: 1128306104} + m_Father: {fileID: 411394829} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &306413159 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 306413163} + - component: {fileID: 306413162} + - component: {fileID: 306413161} + - component: {fileID: 306413160} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &306413160 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &306413161 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &306413162 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &306413163 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1282409300} + - {fileID: 150665564} + - {fileID: 1165587335} + - {fileID: 565041904} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &411394828 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 411394829} + m_Layer: 0 + m_Name: mixamorig_RightFoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &411394829 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 411394828} + m_LocalRotation: {x: 0.39238337, y: -0.003310624, z: -0.066044316, w: 0.91742164} + m_LocalPosition: {x: 0.0000000018626454, y: 0.40984824, z: 0.000000007450582} + m_LocalScale: {x: 0.99999994, y: 1.0000002, z: 1} + m_Children: + - {fileID: 300068549} + m_Father: {fileID: 74695244} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &565041903 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 565041904} + - component: {fileID: 565041907} + - component: {fileID: 565041906} + - component: {fileID: 565041905} + m_Layer: 5 + m_Name: Stop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &565041904 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1455595248} + m_Father: {fileID: 306413163} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: -50} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &565041905 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 565041906} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1305237556} + m_MethodName: Stop + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1305237555} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &565041906 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &565041907 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} +--- !u!1 &579002651 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 579002652} + m_Layer: 0 + m_Name: mixamorig_RightHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &579002652 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 579002651} + m_LocalRotation: {x: 0.0033513857, y: -0.014040428, z: 0.00059746346, w: 0.99989563} + m_LocalPosition: {x: -0.000000029802322, y: 0.26820433, z: -0.00000029802302} + m_LocalScale: {x: 1.0000002, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 797785302} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &644781000 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 644781001} + - component: {fileID: 644781002} + m_Layer: 0 + m_Name: LipSync Audio + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &644781001 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 644781000} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.6054, z: 0.0973} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!82 &644781002 +AudioSource: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 644781000} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 0.557 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + - serializedVersion: 2 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!1 &673926992 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 673926993} + m_Layer: 0 + m_Name: mixamorig_RightArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &673926993 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 673926992} + m_LocalRotation: {x: 0.5081314, y: 0.27377596, z: 0.19307679, w: 0.7934549} + m_LocalPosition: {x: 0, y: 0.12652656, z: 0.00000016018747} + m_LocalScale: {x: 1, y: 1.0000002, z: 1.0000005} + m_Children: + - {fileID: 797785302} + m_Father: {fileID: 1614522555} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &718194728 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 718194729} + m_Layer: 0 + m_Name: mixamorig_RightUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &718194729 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 718194728} + m_LocalRotation: {x: 0.08247918, y: -0.040985238, z: 0.9957497, w: -0.00006260695} + m_LocalPosition: {x: 0.081488185, y: -0.068782054, z: 0.0012808595} + m_LocalScale: {x: 1, y: 0.99999994, z: 1} + m_Children: + - {fileID: 74695244} + m_Father: {fileID: 1750047025} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &765761861 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 765761862} + - component: {fileID: 765761863} + m_Layer: 0 + m_Name: Tops + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &765761862 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 765761861} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &765761863 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 765761861} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: a4a99770a9405f043a126fee39e093f4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300008, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1865528935} + - {fileID: 809351392} + - {fileID: 1614522555} + - {fileID: 1948855189} + - {fileID: 1654106256} + - {fileID: 1044687080} + - {fileID: 1750047025} + - {fileID: 673926993} + - {fileID: 797785302} + - {fileID: 579002652} + - {fileID: 1788475799} + - {fileID: 1652296262} + - {fileID: 1700552628} + - {fileID: 718194729} + - {fileID: 1847358406} + - {fileID: 74695244} + - {fileID: 808863659} + - {fileID: 1307189264} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1750047025} + m_AABB: + m_Center: {x: 0.0005377531, y: 0.1991515, z: -0.055916965} + m_Extent: {x: 0.7304884, y: 0.402664, z: 0.25533015} + m_DirtyAABB: 0 +--- !u!1 &797785301 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 797785302} + m_Layer: 0 + m_Name: mixamorig_RightForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &797785302 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 797785301} + m_LocalRotation: {x: -0.04002702, y: 0.06451582, z: 0.13297948, w: 0.9882065} + m_LocalPosition: {x: -0.000000029802322, y: 0.28208044, z: -0.000000007450576} + m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 579002652} + m_Father: {fileID: 673926993} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &808863658 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 808863659} + m_Layer: 0 + m_Name: mixamorig_Head + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &808863659 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 808863658} + m_LocalRotation: {x: -0.06580398, y: -0.007978736, z: 0.0034114416, w: 0.99779487} + m_LocalPosition: {x: -0.000063840846, y: 0.105319716, z: 0.030171199} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 226404379} + - {fileID: 267445402} + - {fileID: 1381389645} + m_Father: {fileID: 809351392} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &809351391 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 809351392} + m_Layer: 0 + m_Name: mixamorig_Neck + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &809351392 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 809351391} + m_LocalRotation: {x: 0.10213044, y: -0.004767477, z: -0.016644595, w: 0.9946203} + m_LocalPosition: {x: -0.000011545715, y: 0.1515016, z: 0.028294165} + m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 808863659} + m_Father: {fileID: 1865528935} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &847345875 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 847345879} + - component: {fileID: 847345878} + - component: {fileID: 847345877} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &847345877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 847345875} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &847345878 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 847345875} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &847345879 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 847345875} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &941374140 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 941374142} + - component: {fileID: 941374141} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &941374141 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 941374140} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.98600405, b: 0.9558824, a: 1} + m_Intensity: 0.56 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0 + m_NormalBias: 0.5 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &941374142 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 941374140} + m_LocalRotation: {x: -0.06932131, y: 0.84553254, z: -0.11334389, w: -0.5171291} + m_LocalPosition: {x: 1.6889104, y: 4.6352816, z: -3.2605157} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &946140179 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 946140180} + - component: {fileID: 946140181} + m_Layer: 0 + m_Name: Hats + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &946140180 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 946140179} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &946140181 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 946140179} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 134256085b30cd54e8d7901e803356c9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300006, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 808863659} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 808863659} + m_AABB: + m_Center: {x: 0.000011742115, y: 0.21016899, z: 0.016935214} + m_Extent: {x: 0.13085796, y: 0.12793174, z: 0.15191023} + m_DirtyAABB: 0 +--- !u!1 &956265122 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 956265127} + - component: {fileID: 956265126} + - component: {fileID: 956265123} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &956265123 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 956265122} + m_Enabled: 1 +--- !u!20 &956265126 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 956265122} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 20 + field of view: 29.7 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &956265127 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 956265122} + m_LocalRotation: {x: -0, y: 1, z: -0, w: -0.00000016292068} + m_LocalPosition: {x: 0, y: 1.65, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1044687079 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1044687080} + m_Layer: 0 + m_Name: mixamorig_Spine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1044687080 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1044687079} + m_LocalRotation: {x: -0.053280152, y: -0.023910683, z: -0.018462462, w: 0.9981226} + m_LocalPosition: {x: -0.00002082752, y: 0.09868542, z: -0.0152929} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 1} + m_Children: + - {fileID: 1654106256} + m_Father: {fileID: 1750047025} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1128306103 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1128306104} + m_Layer: 0 + m_Name: mixamorig_RightToe_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1128306104 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1128306103} + m_LocalRotation: {x: 1.517883e-18, y: -2.1985502e-16, z: 4.3368087e-19, w: 1} + m_LocalPosition: {x: -0, y: 0.09888336, z: -0.0000000023841857} + m_LocalScale: {x: 1.0000002, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 300068549} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1129910879 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1129910880} + m_Layer: 0 + m_Name: mixamorig_LeftToe_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1129910880 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1129910879} + m_LocalRotation: {x: -4.3368087e-19, y: 3.266159e-18, z: 3.035766e-18, w: 1} + m_LocalPosition: {x: -0, y: 0.09952715, z: 0.0000000011920929} + m_LocalScale: {x: 0.9999999, y: 0.99999976, z: 0.9999999} + m_Children: [] + m_Father: {fileID: 1195966591} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1149879836 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1149879837} + - component: {fileID: 1149879838} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1149879837 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1149879836} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1149879838 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1149879836} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 1880cba827ee51d41a078290574b218b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300000, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1700552628} + - {fileID: 1307189264} + - {fileID: 1750047025} + - {fileID: 1044687080} + - {fileID: 1654106256} + - {fileID: 1865528935} + - {fileID: 1652296262} + - {fileID: 718194729} + - {fileID: 809351392} + - {fileID: 1614522555} + - {fileID: 1948855189} + - {fileID: 808863659} + - {fileID: 797785302} + - {fileID: 579002652} + - {fileID: 1847358406} + - {fileID: 1952941721} + - {fileID: 1195966591} + - {fileID: 1129910880} + - {fileID: 74695244} + - {fileID: 411394829} + - {fileID: 300068549} + - {fileID: 1128306104} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 1750047025} + m_AABB: + m_Center: {x: -0.00022363663, y: -0.09376109, z: 0.009177074} + m_Extent: {x: 0.9707043, y: 0.89830804, z: 0.13446598} + m_DirtyAABB: 0 +--- !u!1 &1165587334 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1165587335} + - component: {fileID: 1165587338} + - component: {fileID: 1165587337} + - component: {fileID: 1165587336} + m_Layer: 5 + m_Name: Start + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1165587335 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1308106821} + m_Father: {fileID: 306413163} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: 0} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1165587336 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1165587337} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1305237556} + m_MethodName: Play + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 11400000, guid: c003f5c3254331749915c80d6b3fdab4, + type: 2} + m_ObjectArgumentAssemblyTypeName: RogoDigital.Lipsync.LipSyncData, Assembly-CSharp + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1305237555} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 1 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1165587337 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1165587338 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} +--- !u!1 &1195966590 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1195966591} + m_Layer: 0 + m_Name: mixamorig_LeftToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1195966591 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1195966590} + m_LocalRotation: {x: 0.37813732, y: -0.035986185, z: 0.013066409, w: 0.92495763} + m_LocalPosition: {x: 0.000000020489098, y: 0.16364932, z: 0} + m_LocalScale: {x: 1, y: 1.0000002, z: 1} + m_Children: + - {fileID: 1129910880} + m_Father: {fileID: 1952941721} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1282409299 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1282409300} + - component: {fileID: 1282409302} + - component: {fileID: 1282409301} + m_Layer: 5 + m_Name: RawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1282409300 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1282409299} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 306413163} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 300, y: 150} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1282409301 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1282409299} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Texture: {fileID: 2800000, guid: 59c765ded93876843860c678f1ca61a6, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1282409302 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1282409299} +--- !u!114 &1305237555 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008457989} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c4c3c6345ee104b4695e6f7a2c098f3a, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 2008457994} + blinkingEnabled: 1 + blinkingControlMode: 1 + blinkingShape: + blendShapes: 000000002b000000010000002c0000000200000003000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + - BrowsIn_Right (5) + weights: + - 65 + - 100 + - 65 + - 100 + - 3.3 + - 3.3 + bones: [] + verified: 1 + leftEyeBlinkBlendable: 0 + rightEyeBlinkBlendable: 1 + minimumBlinkGap: 0.90700936 + maximumBlinkGap: 4.4649534 + blinkDuration: 0.15 + randomLookingEnabled: 1 + lookingControlMode: 0 + lookingUpShape: + blendShapes: 0c0000000d0000002b0000002c0000000000000001000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Squint_Left (43) + - Squint_Right (44) + - Blink_Left (0) + - Blink_Right (1) + weights: + - 100 + - 100 + - 44.6 + - 44.6 + - 0 + - 0 + bones: + - bone: {fileID: 267445402} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 349.79315, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1381389645} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 349.79315, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingDownShape: + blendShapes: 0c0000000d00000000000000010000002b0000002c000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Blink_Left (0) + - Blink_Right (1) + - Squint_Left (43) + - Squint_Right (44) + weights: + - 100 + - 100 + - 47.2 + - 47.8 + - 0 + - 0 + bones: + - bone: {fileID: 267445402} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 20.703491, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1381389645} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 20.70349, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingLeftShape: + blendShapes: 0c0000000d00000000000000010000002b0000002c000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Blink_Left (0) + - Blink_Right (1) + - Squint_Left (43) + - Squint_Right (44) + weights: + - 21.9 + - 42.1 + - 0 + - 0 + - 0 + - 0 + bones: + - bone: {fileID: 267445402} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 0, y: -21.458496, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1381389645} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 0, y: -17.887756, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingRightShape: + blendShapes: 0c0000000d00000000000000010000002b0000002c000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Blink_Left (0) + - Blink_Right (1) + - Squint_Left (43) + - Squint_Right (44) + weights: + - 51.7 + - 37.8 + - 0 + - 0 + - 0 + - 0 + bones: + - bone: {fileID: 267445402} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 0, y: 19.397354, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1381389645} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 0, y: 20.185226, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + _leftEyeLookAtBone: {fileID: 267445402} + _rightEyeLookAtBone: {fileID: 1381389645} + eyeRotationRangeX: {x: -7.4, y: 7.4} + eyeRotationRangeY: {x: -19, y: 19} + eyeLookOffset: {x: 0, y: 0, z: 0} + eyeForwardAxis: 4 + eyeTurnSpeed: 20 + minimumChangeDirectionGap: 1.5420561 + maximumChangeDirectionGap: 5.523337 + targetEnabled: 1 + autoTarget: 0 + autoTargetTag: EyeControllerTarget + autoTargetDistance: 10 + viewTarget: {fileID: 956265127} + targetWeight: 1 + boneUpdateAnimation: 0 +--- !u!114 &1305237556 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008457989} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 60953a4eedd70a246ab4eadbed9f0591, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 2008457994} + audioSource: {fileID: 644781002} + useBones: 1 + boneUpdateAnimation: 0 + phonemes: + - blendShapes: 23000000 + blendableNames: + - Blink_Left (0) + weights: + - 49 + bones: [] + verified: 1 + phonemeName: AI + phoneme: 0 + - blendShapes: 23000000290000002a0000002d0000001e0000002f000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + - BrowsIn_Right (5) + weights: + - 28.6 + - 42.9 + - 35.6 + - 2.2 + - 16.6 + - 20.9 + bones: [] + verified: 1 + phonemeName: E + phoneme: 1 + - blendShapes: 2300000021000000220000001d0000002f000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + weights: + - 24 + - 42.7 + - 43.7 + - 55.7 + - 70.4 + bones: [] + verified: 1 + phonemeName: U + phoneme: 2 + - blendShapes: 230000002100000022000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 61 + - 72 + - 72 + bones: [] + verified: 1 + phonemeName: O + phoneme: 3 + - blendShapes: 16000000 + blendableNames: + - Blink_Left (0) + weights: + - 14.6 + bones: [] + verified: 1 + phonemeName: CDGKNRSThYZ + phoneme: 4 + - blendShapes: 160000001c000000290000002a0000002f000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + weights: + - 0 + - 100 + - 22 + - 36.9 + - 100 + bones: [] + verified: 1 + phonemeName: FV + phoneme: 5 + - blendShapes: 230000002d00000027000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 32.2 + - 100 + - 16.1 + bones: [] + verified: 1 + phonemeName: L + phoneme: 6 + - blendShapes: 200000001c0000002e000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 12.6 + - 69.4 + - 66.8 + bones: [] + verified: 1 + phonemeName: MBP + phoneme: 7 + - blendShapes: 21000000220000001d000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 89.6 + - 75.8 + - 21.2 + bones: [] + verified: 1 + phonemeName: WQ + phoneme: 8 + - blendShapes: + blendableNames: [] + weights: [] + bones: [] + verified: 1 + phonemeName: Rest + phoneme: 9 + emotions: + - blendShapes: 290000002a0000002b0000002c0000000800000009000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + - BrowsIn_Right (5) + weights: + - 55.3 + - 56.4 + - 35.2 + - 35.2 + - 20.5 + - 17.8 + bones: [] + verified: 1 + emotion: Happy + - blendShapes: 200000000e0000000f0000000600000007000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + weights: + - 18.9 + - 43.2 + - 47.5 + - 57.7 + - 60.3 + bones: [] + verified: 1 + emotion: Sad + - blendShapes: 0200000003000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + weights: + - 47.2 + - 47.8 + bones: [] + verified: 1 + emotion: Serious + - blendShapes: 08000000090000000700000006000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + weights: + - 35.5 + - 36.7 + - 23.4 + - 22.6 + bones: [] + verified: 1 + emotion: Eyebrows Up + playOnAwake: 0 + loop: 0 + defaultClip: {fileID: 0} + defaultDelay: 2 + scaleAudioSpeed: 1 + m_animationTimingMode: 0 + frameRate: 60 + restTime: 0.2 + restHoldTime: 0.2 + phonemeCurveGenerationMode: 1 + emotionCurveGenerationMode: 1 + keepEmotionWhenFinished: 1 + setNeutralBonePosesOnStart: 0 + gesturesAnimator: {fileID: 2008457993} + gesturesLayer: 0 + gestures: [] + onFinishedPlaying: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1305237555} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + lastUsedVersion: 1.42 +--- !u!1 &1307189263 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1307189264} + m_Layer: 0 + m_Name: mixamorig_LeftHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1307189264 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1307189263} + m_LocalRotation: {x: 0.0042823046, y: 0.12048616, z: 0.0031524813, w: 0.99270076} + m_LocalPosition: {x: 0.000000029802326, y: 0.26824573, z: 0.00000004470348} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1700552628} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1308106820 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1308106821} + - component: {fileID: 1308106823} + - component: {fileID: 1308106822} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1308106821 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1308106820} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1165587335} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1308106822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1308106820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Start Talking +--- !u!222 &1308106823 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1308106820} +--- !u!1 &1381389644 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1381389645} + m_Layer: 0 + m_Name: mixamorig_RightEye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1381389645 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1381389644} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 808863659} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1455595247 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1455595248} + - component: {fileID: 1455595250} + - component: {fileID: 1455595249} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1455595248 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455595247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 565041904} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1455595249 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455595247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Stop Talking +--- !u!222 &1455595250 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455595247} +--- !u!1 &1532130569 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1532130570} + - component: {fileID: 1532130571} + m_Layer: 0 + m_Name: Bottoms + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1532130570 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1532130569} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1532130571 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1532130569} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: c75b4ef0d2ec8a5468c404e6016cb617, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300010, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1750047025} + - {fileID: 1044687080} + - {fileID: 1652296262} + - {fileID: 1847358406} + - {fileID: 718194729} + - {fileID: 1654106256} + - {fileID: 74695244} + - {fileID: 1865528935} + - {fileID: 1952941721} + - {fileID: 1195966591} + - {fileID: 1129910880} + - {fileID: 411394829} + - {fileID: 300068549} + - {fileID: 1128306104} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1750047025} + m_AABB: + m_Center: {x: -0.0007613003, y: -0.45346355, z: -0.01576528} + m_Extent: {x: 0.1828529, y: 0.52401507, z: 0.27524662} + m_DirtyAABB: 0 +--- !u!1 &1614522554 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1614522555} + m_Layer: 0 + m_Name: mixamorig_RightShoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1614522555 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1614522554} + m_LocalRotation: {x: 0.6498786, y: 0.46389687, z: -0.4911343, w: 0.34820214} + m_LocalPosition: {x: 0.059450474, y: 0.091477655, z: 0.018344566} + m_LocalScale: {x: 1.0000001, y: 1.0000002, z: 1.0000001} + m_Children: + - {fileID: 673926993} + m_Father: {fileID: 1865528935} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1652296261 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1652296262} + m_Layer: 0 + m_Name: mixamorig_LeftUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1652296262 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1652296261} + m_LocalRotation: {x: 0.18174882, y: -0.03397064, z: 0.9825632, w: 0.019570889} + m_LocalPosition: {x: -0.08159254, y: -0.0675599, z: 0.0013438762} + m_LocalScale: {x: 1, y: 0.99999994, z: 1} + m_Children: + - {fileID: 1847358406} + m_Father: {fileID: 1750047025} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1654106255 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1654106256} + m_Layer: 0 + m_Name: mixamorig_Spine1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1654106256 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654106255} + m_LocalRotation: {x: 0.018717201, y: -0.005334527, z: 0.008814693, w: 0.9997717} + m_LocalPosition: {x: -5.31486e-12, y: 0.11425713, z: 4.3655746e-11} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1865528935} + m_Father: {fileID: 1044687080} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1700552627 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1700552628} + m_Layer: 0 + m_Name: mixamorig_LeftForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1700552628 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1700552627} + m_LocalRotation: {x: -0.019620566, y: 0.08862124, z: -0.09907128, w: 0.990932} + m_LocalPosition: {x: 0.000000029802326, y: 0.2820247, z: 0.00000010430811} + m_LocalScale: {x: 1, y: 1, z: 0.9999999} + m_Children: + - {fileID: 1307189264} + m_Father: {fileID: 1788475799} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1750047024 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1750047025} + m_Layer: 0 + m_Name: mixamorig_Hips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1750047025 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1750047024} + m_LocalRotation: {x: -0.030076584, y: 0.04529655, z: 0.030436635, w: 0.99805677} + m_LocalPosition: {x: -0.006970884, y: 0.9974835, z: 0.009719183} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1652296262} + - {fileID: 718194729} + - {fileID: 1044687080} + m_Father: {fileID: 2008457990} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1788475798 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1788475799} + m_Layer: 0 + m_Name: mixamorig_LeftArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1788475799 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1788475798} + m_LocalRotation: {x: 0.5192215, y: -0.2268215, z: -0.19341111, w: 0.8009702} + m_LocalPosition: {x: 0.000000029802326, y: 0.12651934, z: 0.000000072643154} + m_LocalScale: {x: 1, y: 1.0000002, z: 1.0000001} + m_Children: + - {fileID: 1700552628} + m_Father: {fileID: 1948855189} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1794017488 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1794017490} + - component: {fileID: 1794017489} + m_Layer: 0 + m_Name: Reflection Probe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!215 &1794017489 +ReflectionProbe: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1794017488} + m_Enabled: 1 + serializedVersion: 2 + m_Type: 0 + m_Mode: 0 + m_RefreshMode: 0 + m_TimeSlicingMode: 0 + m_Resolution: 128 + m_UpdateFrequency: 0 + m_BoxSize: {x: 10, y: 10, z: 10} + m_BoxOffset: {x: 0, y: 0, z: 0} + m_NearClip: 0.3 + m_FarClip: 1000 + m_ShadowDistance: 100 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.62002593, g: 0.6476956, b: 0.6911765, a: 1} + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_IntensityMultiplier: 0.58 + m_BlendDistance: 1 + m_HDR: 1 + m_BoxProjection: 0 + m_RenderDynamicObjects: 0 + m_UseOcclusionCulling: 1 + m_Importance: 1 + m_CustomBakedTexture: {fileID: 0} +--- !u!4 &1794017490 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1794017488} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.93199503, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1847358405 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1847358406} + m_Layer: 0 + m_Name: mixamorig_LeftLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1847358406 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1847358405} + m_LocalRotation: {x: 0.0749849, y: 0.0041707656, z: 0.04122876, w: 0.9963233} + m_LocalPosition: {x: 0.000000011175871, y: 0.40373635, z: 0} + m_LocalScale: {x: 1, y: 0.9999998, z: 0.9999999} + m_Children: + - {fileID: 1952941721} + m_Father: {fileID: 1652296262} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1865528934 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1865528935} + m_Layer: 0 + m_Name: mixamorig_Spine2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1865528935 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1865528934} + m_LocalRotation: {x: -0.0000000074505797, y: -1.8189892e-12, z: -9.094946e-13, w: 1} + m_LocalPosition: {x: -5.4214415e-12, y: 0.13540043, z: 0.000000013707904} + m_LocalScale: {x: 1, y: 1.0000002, z: 1} + m_Children: + - {fileID: 1948855189} + - {fileID: 809351392} + - {fileID: 1614522555} + m_Father: {fileID: 1654106256} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1922337071 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1922337072} + - component: {fileID: 1922337073} + m_Layer: 0 + m_Name: Beards + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1922337072 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1922337071} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1922337073 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1922337071} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 7639fe857dd957b45b4a5cd512043041, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300012, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 809351392} + - {fileID: 808863659} + - {fileID: 1865528935} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 1865528935} + m_AABB: + m_Center: {x: -0.00012616813, y: 0.24085134, z: 0.13324648} + m_Extent: {x: 0.07676652, y: 0.09699773, z: 0.070890516} + m_DirtyAABB: 0 +--- !u!1 &1948855188 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1948855189} + m_Layer: 0 + m_Name: mixamorig_LeftShoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1948855189 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1948855188} + m_LocalRotation: {x: -0.6376416, y: 0.49090853, z: -0.45292112, w: -0.38377663} + m_LocalPosition: {x: -0.059448536, y: 0.09176086, z: 0.01839664} + m_LocalScale: {x: 1, y: 1, z: 1.0000001} + m_Children: + - {fileID: 1788475799} + m_Father: {fileID: 1865528935} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1952941720 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1952941721} + m_Layer: 0 + m_Name: mixamorig_LeftFoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1952941721 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1952941720} + m_LocalRotation: {x: 0.38410857, y: 0.20665793, z: -0.042945676, w: 0.89883745} + m_LocalPosition: {x: 0.0000000037252903, y: 0.41347975, z: -0.0000000055879363} + m_LocalScale: {x: 0.9999999, y: 0.9999998, z: 1.0000002} + m_Children: + - {fileID: 1195966591} + m_Father: {fileID: 1847358406} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2008457989 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2008457990} + - component: {fileID: 2008457993} + - component: {fileID: 1305237556} + - component: {fileID: 1305237555} + - component: {fileID: 2008457994} + m_Layer: 0 + m_Name: Lincoln_Char + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2008457990 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008457989} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1922337072} + - {fileID: 1149879837} + - {fileID: 1532130570} + - {fileID: 208309529} + - {fileID: 2127105119} + - {fileID: 946140180} + - {fileID: 1750047025} + - {fileID: 232474251} + - {fileID: 765761862} + - {fileID: 644781001} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &2008457993 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008457989} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Controller: {fileID: 9100000, guid: 57a040ade2046cc49b15b2a4e1271449, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!114 &2008457994 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2008457989} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9036ca68e4aa8924a9003edadadd85a2, type: 3} + m_Name: + m_EditorClassIdentifier: + isReady: 1 + users: + - {fileID: 1305237556} + - {fileID: 1305237555} + _blendables: + - number: 0 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 4 + currentWeight: 0 + - number: 5 + currentWeight: 0 + - number: 6 + currentWeight: 0 + - number: 7 + currentWeight: 0 + - number: 8 + currentWeight: 0 + - number: 9 + currentWeight: 0 + - number: 10 + currentWeight: 0 + - number: 11 + currentWeight: 0 + - number: 12 + currentWeight: 0 + - number: 13 + currentWeight: 0 + - number: 14 + currentWeight: 0 + - number: 15 + currentWeight: 0 + - number: 16 + currentWeight: 0 + - number: 17 + currentWeight: 0 + - number: 18 + currentWeight: 0 + - number: 19 + currentWeight: 0 + - number: 20 + currentWeight: 0 + - number: 21 + currentWeight: 0 + - number: 22 + currentWeight: 0 + - number: 23 + currentWeight: 0 + - number: 24 + currentWeight: 0 + - number: 25 + currentWeight: 0 + - number: 26 + currentWeight: 0 + - number: 27 + currentWeight: 0 + - number: 28 + currentWeight: 0 + - number: 29 + currentWeight: 0 + - number: 30 + currentWeight: 0 + - number: 31 + currentWeight: 0 + - number: 32 + currentWeight: 0 + - number: 33 + currentWeight: 0 + - number: 34 + currentWeight: 0 + - number: 35 + currentWeight: 0 + - number: 36 + currentWeight: 0 + - number: 37 + currentWeight: 0 + - number: 38 + currentWeight: 0 + - number: 39 + currentWeight: 0 + - number: 40 + currentWeight: 0 + - number: 41 + currentWeight: 0 + - number: 42 + currentWeight: 0 + - number: 43 + currentWeight: 0 + - number: 44 + currentWeight: 0 + - number: 45 + currentWeight: 0 + - number: 46 + currentWeight: 0 + - number: 47 + currentWeight: 0 + - number: 48 + currentWeight: 0 + - number: 49 + currentWeight: 0 + characterMesh: {fileID: 1149879838} + optionalOtherMeshes: + - {fileID: 1922337073} + - {fileID: 208309530} +--- !u!1 &2108455884 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2108455888} + - component: {fileID: 2108455887} + - component: {fileID: 2108455886} + - component: {fileID: 2108455885} + m_Layer: 0 + m_Name: Plane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!23 &2108455885 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 911aa5d0dcffd9240b819d7f8849c52c, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!64 &2108455886 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Convex: 0 + m_CookingOptions: 14 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &2108455887 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2108455888 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_LocalRotation: {x: 0.707107, y: 0, z: 0, w: 0.70710665} + m_LocalPosition: {x: 0.27, y: 1.68, z: -9.01} + m_LocalScale: {x: 1.34854, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2127105118 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2127105119} + - component: {fileID: 2127105120} + m_Layer: 0 + m_Name: Eyes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2127105119 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2127105118} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2008457990} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &2127105120 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2127105118} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: b4824d23ae5403b47add72f1413110dc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300002, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1381389645} + - {fileID: 267445402} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 267445402} + m_AABB: + m_Center: {x: 0.027714929, y: -0.0000104904175, z: -0.000023182482} + m_Extent: {x: 0.045256414, y: 0.017943261, z: 0.017904708} + m_DirtyAABB: 0 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_01_Lincoln.unity.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_01_Lincoln.unity.meta new file mode 100644 index 0000000..e284d7a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_01_Lincoln.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b9afcba6dd3a8e34793fcc5eb9cb1202 +timeCreated: 1491344602 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_02_Bone_Poses.unity b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_02_Bone_Poses.unity new file mode 100644 index 0000000..003f880 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_02_Bone_Poses.unity @@ -0,0 +1,3861 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.4505759, g: 0.50055677, b: 0.5750544, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!4 &47214225 stripped +Transform: + m_PrefabParentObject: {fileID: 474968, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!1 &54709193 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 169130, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 54709194} + - component: {fileID: 54709196} + - component: {fileID: 54709195} + m_Layer: 5 + m_Name: About + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &54709194 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22418218, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 54709193} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459776867} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 35, y: -143.1} + m_SizeDelta: {x: 410.88, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &54709195 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11478620, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 54709193} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.14705884, g: 0.14705884, b: 0.14705884, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: 'LipSync Pro 1.53 - Bone Animation Demo + + Animation using bone transforms. + + + Now supports emotion markers.' +--- !u!222 &54709196 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22265432, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 54709193} +--- !u!4 &166525512 stripped +Transform: + m_PrefabParentObject: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!1 &316925828 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 114918, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 316925833} + - component: {fileID: 316925832} + - component: {fileID: 316925829} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &316925829 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 8114326, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 316925828} + m_Enabled: 1 +--- !u!20 &316925832 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2022014, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 316925828} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 15 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &316925833 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 489112, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 316925828} + m_LocalRotation: {x: 0.017452408, y: 0, z: 0, w: 0.9998477} + m_LocalPosition: {x: 0, y: 1.74, z: -7.998} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &459776863 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 119638, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 459776867} + - component: {fileID: 459776866} + - component: {fileID: 459776865} + - component: {fileID: 459776864} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &459776864 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11498178, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 459776863} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &459776865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11427488, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 459776863} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &459776866 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22305088, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 459776863} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &459776867 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22423592, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 459776863} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1848887404} + - {fileID: 54709194} + - {fileID: 1688487062} + - {fileID: 1460834868} + - {fileID: 806073063} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!4 &710794790 stripped +Transform: + m_PrefabParentObject: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &728140543 stripped +Transform: + m_PrefabParentObject: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!1 &806073062 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 137654, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 806073063} + - component: {fileID: 806073066} + - component: {fileID: 806073065} + - component: {fileID: 806073064} + m_Layer: 5 + m_Name: Stop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &806073063 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22428856, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 806073062} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1404314476} + m_Father: {fileID: 459776867} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: -50} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &806073064 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11477768, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 806073062} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 806073065} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1996415120} + m_MethodName: Stop + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1996415136} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &806073065 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11466508, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 806073062} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &806073066 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22252334, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 806073062} +--- !u!4 &845736334 stripped +Transform: + m_PrefabParentObject: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1332590172 stripped +Transform: + m_PrefabParentObject: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!1 &1404314475 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 138532, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1404314476} + - component: {fileID: 1404314478} + - component: {fileID: 1404314477} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1404314476 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22401746, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404314475} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 806073063} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1404314477 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11489790, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404314475} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Stop Talking +--- !u!222 &1404314478 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22295138, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404314475} +--- !u!1 &1405327427 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 189428, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1405327431} + - component: {fileID: 1405327430} + - component: {fileID: 1405327429} + - component: {fileID: 1405327428} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1405327428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11482712, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1405327427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1997211142, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ForceModuleActive: 0 +--- !u!114 &1405327429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11463236, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1405327427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1405327430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11419620, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1405327427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1405327431 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 438964, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1405327427} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1460834867 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 151938, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1460834868} + - component: {fileID: 1460834871} + - component: {fileID: 1460834870} + - component: {fileID: 1460834869} + m_Layer: 5 + m_Name: Start + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1460834868 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22415126, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1460834867} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1897865138} + m_Father: {fileID: 459776867} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: 0} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1460834869 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11470200, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1460834867} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1460834870} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1996415120} + m_MethodName: Play + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 11400000, guid: b5b1de93257d52941b998f717ade5136, + type: 2} + m_ObjectArgumentAssemblyTypeName: RogoDigital.Lipsync.LipSyncData, Assembly-CSharp + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1996415136} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 1 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1460834870 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11414638, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1460834867} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1460834871 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22256314, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1460834867} +--- !u!1 &1539189876 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 177286, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1539189878} + - component: {fileID: 1539189877} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1539189877 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 10836560, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1539189876} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.88529414, b: 0.71323526, a: 1} + m_Intensity: 0.56 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1539189878 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 483132, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1539189876} + m_LocalRotation: {x: 0.18294667, y: 0.30562136, z: -0.9324864, w: 0.05996079} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 36.293003, y: -22.2, z: -179.99998} +--- !u!4 &1630612850 stripped +Transform: + m_PrefabParentObject: {fileID: 404142, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1677069278 stripped +Transform: + m_PrefabParentObject: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1681818876 stripped +Transform: + m_PrefabParentObject: {fileID: 490544, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!1 &1688487059 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 169130, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1688487062} + - component: {fileID: 1688487061} + - component: {fileID: 1688487060} + m_Layer: 5 + m_Name: About (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1688487060 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11478620, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1688487059} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: 'GRFL_Head_Liza model by Vit3D used with permission. + + Full version is available from the Unity Asset Store.' +--- !u!222 &1688487061 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22265432, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1688487059} +--- !u!224 &1688487062 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22418218, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1688487059} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459776867} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 35, y: -404.07} + m_SizeDelta: {x: 400, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!4 &1748842664 stripped +Transform: + m_PrefabParentObject: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!1 &1848887403 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 178528, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1848887404} + - component: {fileID: 1848887406} + - component: {fileID: 1848887405} + m_Layer: 5 + m_Name: RawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1848887404 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22472464, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1848887403} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459776867} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 300, y: 150} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1848887405 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11425152, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1848887403} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Texture: {fileID: 2800000, guid: 59c765ded93876843860c678f1ca61a6, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1848887406 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22203764, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1848887403} +--- !u!1 &1897865137 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 160844, guid: 4129d51aff9159942b0f09083e5a5ab7, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1897865138} + - component: {fileID: 1897865140} + - component: {fileID: 1897865139} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1897865138 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22406014, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1897865137} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1460834868} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1897865139 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11469630, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1897865137} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Start Talking +--- !u!222 &1897865140 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 22229410, guid: 4129d51aff9159942b0f09083e5a5ab7, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1897865137} +--- !u!4 &1907913969 stripped +Transform: + m_PrefabParentObject: {fileID: 420418, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1960484090 stripped +Transform: + m_PrefabParentObject: {fileID: 460656, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!1001 &1996415115 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: 0.07 + objectReference: {fileID: 0} + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.03 + objectReference: {fileID: 0} + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -6.72 + objectReference: {fileID: 0} + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: -0.0052642575 + objectReference: {fileID: 0} + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0.99287057 + objectReference: {fileID: 0} + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.047951534 + objectReference: {fileID: 0} + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: -0.10900019 + objectReference: {fileID: 0} + - target: {fileID: 498680, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9532216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_Controller + value: + objectReference: {fileID: 9100000, guid: 530fafe7bb908ce4b8b24ff7f960d1cd, type: 2} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.00183151 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.09658269 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.023026088 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.00767929 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.11334918 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.00000191 + objectReference: {fileID: 0} + - target: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: 0.00144196 + objectReference: {fileID: 0} + - target: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: -0.00500203 + objectReference: {fileID: 0} + - target: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.013093869 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.00183151 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.09658222 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.023029579 + objectReference: {fileID: 0} + - target: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: 0.00061264 + objectReference: {fileID: 0} + - target: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: -0.0028446098 + objectReference: {fileID: 0} + - target: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.011109039 + objectReference: {fileID: 0} + - target: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: 0.0006128 + objectReference: {fileID: 0} + - target: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: -0.00284875 + objectReference: {fileID: 0} + - target: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.01110797 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.0000056568597 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.00000070710576 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.7071039 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: -0.70710963 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.030468669 + objectReference: {fileID: 0} + - target: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: 0.0014417999 + objectReference: {fileID: 0} + - target: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: -0.0050023003 + objectReference: {fileID: 0} + - target: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.01309377 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.03954252 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.0000038099997 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: -0.0012813 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.00000345 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: -3.5000002e-12 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000010000007 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.000003500002 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: -3.5000002e-12 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000010000007 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.000003500002 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: -3.5000002e-12 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000010000007 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.000003500002 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.039998736 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: -0.99919975 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.0693676 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: -0.9975912 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.11648361 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.000006363962 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000014142554 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.7071033 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 0.7071103 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.000064700376 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0.00006470026 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.70710725 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 0.7071063 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.082216784 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.018061578 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.00000014999999 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.02006943 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.00000014999999 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 0.9931927 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.01108454 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.00008801748 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0.0000039945658 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.0000019970194 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.061823558 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.088723354 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.031141039 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.00008801748 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0.0000039945658 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.0000019970194 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.061823577 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.08872271 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.031144349 + objectReference: {fileID: 0} + - target: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 3.688062e-12 + objectReference: {fileID: 0} + - target: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000010652644 + objectReference: {fileID: 0} + - target: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.0000034621094 + objectReference: {fileID: 0} + - target: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.08304909 + objectReference: {fileID: 0} + - target: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.0964711 + objectReference: {fileID: 0} + - target: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.01359899 + objectReference: {fileID: 0} + - target: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 3.688062e-12 + objectReference: {fileID: 0} + - target: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000010652644 + objectReference: {fileID: 0} + - target: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.0000034621094 + objectReference: {fileID: 0} + - target: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.08835421 + objectReference: {fileID: 0} + - target: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.088128105 + objectReference: {fileID: 0} + - target: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.040872596 + objectReference: {fileID: 0} + - target: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 3.688062e-12 + objectReference: {fileID: 0} + - target: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000010652644 + objectReference: {fileID: 0} + - target: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.0000034621094 + objectReference: {fileID: 0} + - target: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.08304919 + objectReference: {fileID: 0} + - target: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.09647081 + objectReference: {fileID: 0} + - target: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.01360247 + objectReference: {fileID: 0} + - target: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 3.688062e-12 + objectReference: {fileID: 0} + - target: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.0000010652644 + objectReference: {fileID: 0} + - target: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: -0.0000034621094 + objectReference: {fileID: 0} + - target: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.088354185 + objectReference: {fileID: 0} + - target: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.08812728 + objectReference: {fileID: 0} + - target: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.0408759 + objectReference: {fileID: 0} + - target: {fileID: 456572, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 438780, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 435664, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 415134, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.00000473 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.00000092 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 457388, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.00331924 + objectReference: {fileID: 0} + - target: {fileID: 457388, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.00914268 + objectReference: {fileID: 0} + - target: {fileID: 457388, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.0000041199996 + objectReference: {fileID: 0} + - target: {fileID: 404142, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.07277464 + objectReference: {fileID: 0} + - target: {fileID: 404142, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.08897636 + objectReference: {fileID: 0} + - target: {fileID: 404142, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.03110184 + objectReference: {fileID: 0} + - target: {fileID: 474968, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.072774656 + objectReference: {fileID: 0} + - target: {fileID: 474968, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.03110516 + objectReference: {fileID: 0} + - target: {fileID: 409512, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.00331833 + objectReference: {fileID: 0} + - target: {fileID: 409512, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.00914276 + objectReference: {fileID: 0} + - target: {fileID: 409512, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: -0.00000855 + objectReference: {fileID: 0} + - target: {fileID: 474968, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.088975735 + objectReference: {fileID: 0} + - target: {fileID: 161618, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 420418, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.000005656857 + objectReference: {fileID: 0} + - target: {fileID: 420418, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.00000070709416 + objectReference: {fileID: 0} + - target: {fileID: 420418, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.7071053 + objectReference: {fileID: 0} + - target: {fileID: 420418, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: -0.7071083 + objectReference: {fileID: 0} + - target: {fileID: 490544, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.000005656857 + objectReference: {fileID: 0} + - target: {fileID: 490544, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: -0.00000070709416 + objectReference: {fileID: 0} + - target: {fileID: 490544, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.7071053 + objectReference: {fileID: 0} + - target: {fileID: 490544, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: -0.7071083 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalScale.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalScale.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalScale.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.010084055 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.00045840655 + objectReference: {fileID: 0} + - target: {fileID: 471694, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 0.0002291831 + objectReference: {fileID: 0} + - target: {fileID: 404142, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.010084055 + objectReference: {fileID: 0} + - target: {fileID: 404142, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.00045840655 + objectReference: {fileID: 0} + - target: {fileID: 404142, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 0.0002291831 + objectReference: {fileID: 0} + - target: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: -0.010084064 + objectReference: {fileID: 0} + - target: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.00063015264 + objectReference: {fileID: 0} + - target: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.0005729578 + objectReference: {fileID: 0} + - target: {fileID: 474968, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.010084055 + objectReference: {fileID: 0} + - target: {fileID: 474968, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.00045840655 + objectReference: {fileID: 0} + - target: {fileID: 474968, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 0.0002291831 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.010084055 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.00045840655 + objectReference: {fileID: 0} + - target: {fileID: 449310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 0.0002291831 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.002298574 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.0102300765 + objectReference: {fileID: 0} + - target: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 77.33664 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 4.9999733 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.00014968049 + objectReference: {fileID: 0} + - target: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.00040260245 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: -4.58498 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: -0.00038948152 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.0005244701 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: -91.276695 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.0000044233952 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.00011450613 + objectReference: {fileID: 0} + - target: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 2.2122471 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: -4.9999733 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.00007950263 + objectReference: {fileID: 0} + - target: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.00040260245 + objectReference: {fileID: 0} + - target: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 13.378391 + objectReference: {fileID: 0} + - target: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: -7.9555197 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.0006302582 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.00040106333 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalEulerAnglesHint.z + value: 89.99935 + objectReference: {fileID: 0} + - target: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0.000087889006 + objectReference: {fileID: 0} + - target: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0.000005499559 + objectReference: {fileID: 0} + - target: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0.0000050004837 + objectReference: {fileID: 0} + - target: {fileID: 425346, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.z + value: 0.00000014999999 + objectReference: {fileID: 0} + - target: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.082132824 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.x + value: -0.0024800098 + objectReference: {fileID: 0} + - target: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalPosition.y + value: 0.02439142 + objectReference: {fileID: 0} + - target: {fileID: 460656, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 460656, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 460656, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 460656, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1996415117 stripped +GameObject: + m_PrefabParentObject: {fileID: 161618, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!82 &1996415118 +AudioSource: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1996415117} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 0.777 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + - serializedVersion: 2 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 +--- !u!114 &1996415120 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1996415117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 60953a4eedd70a246ab4eadbed9f0591, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 1996415135} + audioSource: {fileID: 1996415118} + useBones: 1 + boneUpdateAnimation: 0 + phonemes: + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.00030517596, y: 0.0005798342, z: 260.2002} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: 0.00075452996, y: 0.096714936, z: 0.01999135} + endRotation: {x: -8.021413e-10, y: -0.00011459162, z: -0.00040107063} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: AI + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.00039655733, y: 0.00051914103, z: 269.50037} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: 0, y: 0, z: 13.378405} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + endRotation: {x: 0, y: 0, z: 352.04462} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 355.4152} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025876, y: 0.0004010639, z: 89.99942} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.080345266, y: 0.00575738, z: 0.0000041199996} + endRotation: {x: 0.0000000029181715, y: 0.010485131, z: 90.00005} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: 0.00061343, y: -0.00285072, z: -0.01110733} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: 0.00061275, y: -0.0028425897, z: 0.01110967} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.00984362, y: 0.10951453, z: -0.00000141} + endRotation: {x: -8.021413e-10, y: -0.00011459162, z: -0.00040107063} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.00267701, y: -0.0048925197, z: -0.013093819} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.002677, y: -0.00489222, z: 0.013093899} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: -0.0027220198, y: 0.09527879, z: -0.023029229} + endRotation: {x: -8.021413e-10, y: -0.00011459162, z: -0.00040107063} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: -0.00272188, y: 0.09527923, z: 0.02302659} + endRotation: {x: -8.021413e-10, y: -0.00011459162, z: -0.00040107063} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: E + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.00038283196, y: 0.0005293435, z: 268.00024} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: -0, y: 0, z: 13.378392} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + endRotation: {x: -0, y: 0, z: 352.04446} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 355.415} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025823, y: 0.0004010634, z: 89.99935} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.08269603, y: 0.00257824, z: 0.0000041} + endRotation: {x: 0.0000000029181717, y: 0.010485126, z: 89.999985} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: 0.00061348, y: -0.00285073, z: -0.01110733} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: 0.00061269, y: -0.0028426, z: 0.01110967} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.0076797497, y: 0.11334915, z: -0.00000146} + endRotation: {x: -8.021409e-10, y: -0.00011459156, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.0014416499, y: -0.00500232, z: -0.01309381} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.0014416499, y: -0.00500203, z: 0.0130939195} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: -0.0015979799, y: 0.09651726, z: -0.023029238} + endRotation: {x: -8.021409e-10, y: -0.00011459156, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: -0.0015976799, y: 0.09651771, z: 0.02302658} + endRotation: {x: -8.021409e-10, y: -0.00011459156, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: U + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.0003252304, y: 0.0005665599, z: 261.98282} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: 0, y: 0, z: 13.378401} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + endRotation: {x: 0, y: 0, z: 352.04456} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 355.41513} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025847, y: 0.00040106368, z: 89.99938} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.086368605, y: 0.0011921, z: 0.00000391} + endRotation: {x: 0.0010984393, y: 0.010427433, z: 83.98661} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: -0.0014976899, y: -0.00341526, z: -0.00903947} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: -0.0014995199, y: -0.00340909, z: 0.009041539} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.00906781, y: 0.11658022, z: -0.0000015599999} + endRotation: {x: 0.000013596613, y: -0.00011378212, z: 6.8143597} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.0030043, y: -0.00486339, z: -0.008672739} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.0030053998, y: -0.00486311, z: 0.00867538} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: 0.0022657197, y: 0.10520358, z: -0.013271739} + endRotation: {x: -8.021411e-10, y: -0.000114591596, z: -0.00040107055} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: 0.0022629797, y: 0.10520476, z: 0.013271969} + endRotation: {x: -8.021411e-10, y: -0.000114591596, z: -0.00040107055} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: O + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.00041198742, y: 0.00053405773, z: 270.15466} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: 0, y: 0, z: 21.168446} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02350076, y: 0.0011411699, z: 0} + endRotation: {x: 0, y: 0, z: 351.18607} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 351.32874} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.0006302584, y: 0.0004010636, z: 89.999374} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.08278867, y: 0.0035304897, z: 0.0000041099997} + endRotation: {x: 0.0000000029181715, y: 0.010485127, z: 90.00001} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: 0.00018326999, y: -0.00289649, z: -0.011107319} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: 0.00018255, y: -0.0028883799, z: 0.01110967} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.0077159097, y: 0.11375605, z: -0.00000146} + endRotation: {x: -8.02141e-10, y: -0.00011459158, z: -0.0004010705} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.002939, y: -0.00486924, z: -0.01309383} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.00293899, y: -0.0048689498, z: 0.013093899} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: -0.00099569, y: 0.09762778, z: -0.02302926} + endRotation: {x: -8.02141e-10, y: -0.00011459158, z: -0.0004010705} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: -0.00099539, y: 0.09762822, z: 0.02302656} + endRotation: {x: -8.02141e-10, y: -0.00011459158, z: -0.0004010705} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: CDGKNRSThYZ + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.00041198736, y: 0.0005340576, z: 268.79303} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: 0, y: 0, z: 13.378395} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + endRotation: {x: -0, y: 0, z: 352.04446} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 355.41504} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025835, y: 0.0004010636, z: 89.99937} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.072203994, y: 0.0008148701, z: 0.0000041099997} + endRotation: {x: -0.0056304927, y: 0.008850097, z: 130.82819} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: -0.00213586, y: -0.00080906996, z: -0.00840313} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: -0.00213397, y: -0.00080337, z: 0.00840542} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.0069553796, y: 0.11130301, z: -0.0000014499999} + endRotation: {x: 4.0711878e-13, y: -0.00010681153, z: 352.92245} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.0030222998, y: -0.0047402796, z: -0.011802049} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.0030222698, y: -0.00474001, z: 0.011802879} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: -0.0023266599, y: 0.09468328, z: -0.019633548} + endRotation: {x: -8.0214096e-10, y: -0.00011459157, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: -0.00232658, y: 0.094683655, z: 0.01963733} + endRotation: {x: -8.0214096e-10, y: -0.00011459157, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: FV + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.00036939335, y: 0.00053880736, z: 266.5586} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: 0, y: 0, z: 18.29477} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02762938, y: 0.000048500002, z: 0} + endRotation: {x: 0, y: 0, z: 350.71503} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.01843261, y: -0.0016168199, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 57.051117} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025823, y: 0.00040106356, z: 89.99936} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.08233674, y: 0.00054815004, z: 0.00000406} + endRotation: {x: 0.0000000029181715, y: 0.010485126, z: 89.999985} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: 0.00061343, y: -0.00285072, z: -0.01110733} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: 0.00061274, y: -0.0028425897, z: 0.01110967} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.0076797497, y: 0.11334915, z: -0.00000146} + endRotation: {x: -8.0214085e-10, y: -0.00011459155, z: -0.00040107043} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.0014416499, y: -0.00500232, z: -0.01309381} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.0014416499, y: -0.00500203, z: 0.0130939195} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: -0.00050126004, y: 0.09658222, z: -0.02302926} + endRotation: {x: -8.0214085e-10, y: -0.00011459155, z: -0.00040107043} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: -0.00050096994, y: 0.096582666, z: 0.02302656} + endRotation: {x: -8.0214085e-10, y: -0.00011459155, z: -0.00040107043} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: L + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.0003735295, y: 0.00053594826, z: 266.9996} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: -0, y: 0, z: 13.378392} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + endRotation: {x: 0, y: 0, z: 352.0445} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 355.415} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025823, y: 0.0004010634, z: 89.99935} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.076413065, y: -0.00554973, z: 0.00000409} + endRotation: {x: -0.0037576568, y: 0.009788662, z: 111.00072} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: -0.00026930997, y: -0.00669798, z: -0.01110663} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: -0.00026992004, y: -0.00668987, z: 0.01111037} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.00560517, y: 0.112059064, z: -0.0000014699999} + endRotation: {x: -8.021409e-10, y: -0.00011459156, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.0027649, y: -0.00488472, z: -0.013093819} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.0027648897, y: -0.0048844297, z: 0.013093899} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: -0.000110869994, y: 0.09397403, z: -0.023029238} + endRotation: {x: -8.021409e-10, y: -0.00011459156, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: -0.00011056999, y: 0.093974486, z: 0.02302658} + endRotation: {x: -8.021409e-10, y: -0.00011459156, z: -0.00040107046} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: MBP + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.00038948155, y: 0.0005244702, z: 268.7233} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: -0, y: 0, z: 13.378392} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + endRotation: {x: -0, y: 0, z: 352.04446} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 355.415} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025823, y: 0.00040106336, z: 89.99935} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.000401064, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.09268525, y: 0.00024646998, z: 0.00000404} + endRotation: {x: 0.0022985742, y: 0.0102300765, z: 77.33664} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: 0.00055815, y: -0.0028449898, z: -0.00572684} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: 0.00055843, y: -0.00283623, z: 0.00572914} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.0066158096, y: 0.12239594, z: -0.00000155} + endRotation: {x: 0.0000044233952, y: -0.00011450614, z: 2.2122474} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.0039069, y: -0.00679451, z: -0.0041227797} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.0039063296, y: -0.0067973295, z: 0.00412787} + endRotation: {x: -0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: 0.000115799994, y: 0.113983236, z: -0.01039611} + endRotation: {x: 355.00003, y: -0.00007950263, z: -0.00040260248} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: 0.00011882, y: 0.11398006, z: 0.01038795} + endRotation: {x: 4.9999733, y: -0.0001496805, z: -0.00040260248} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + phonemeName: WQ + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: [] + verified: 1 + phonemeName: Rest + phoneme: 0 + emotions: + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1996415126} + endPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + endRotation: {x: -0.0003967285, y: 0.00051879865, z: 269.50012} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + neutralRotation: {x: -0.00040107308, y: 0.00051566074, z: 270.00046} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415127} + endPosition: {x: -0.03046868, y: 0.01108454, z: 0.00000092} + endRotation: {x: 0, y: 0, z: 13.3783865} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + neutralRotation: {x: -0, y: 0, z: 13.378408} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415128} + endPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + endRotation: {x: 0, y: 0, z: 352.0443} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.02006943, y: 0.00000014999999, z: 0} + neutralRotation: {x: -0, y: 0, z: 352.04468} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415129} + endPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + endRotation: {x: 0, y: 0, z: 355.41495} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + neutralRotation: {x: -0, y: 0, z: 355.41525} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415133} + endPosition: {x: -0.082132824, y: 0.03954259, z: 0.00000382} + endRotation: {x: 0.00063025794, y: 0.00040106327, z: 89.999306} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + neutralRotation: {x: 0.000630259, y: 0.00040106397, z: 89.999435} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415130} + endPosition: {x: -0.08034558, y: 0.0023878436, z: 0.0000040910727} + endRotation: {x: 4.1688164e-10, y: 0.010482779, z: 89.99994} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + neutralRotation: {x: 0.00000000250129, y: 0.010485135, z: 90.00008} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415131} + endPosition: {x: 0.00061343, y: -0.00285072, z: -0.01110733} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415132} + endPosition: {x: 0.00061275, y: -0.0028425897, z: 0.01110967} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415122} + endPosition: {x: -0.009043124, y: 0.10951474, z: -0.0000014669199} + endRotation: {x: -8.021406e-10, y: -0.000114591516, z: -0.0004010703} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415123} + endPosition: {x: 0.00267701, y: -0.0048925197, z: -0.013093819} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415124} + endPosition: {x: 0.002677, y: -0.00489222, z: 0.013093899} + endRotation: {x: 0, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415121} + endPosition: {x: -0.0071209064, y: 0.095279105, z: -0.027451979} + endRotation: {x: -8.021406e-10, y: -0.000114591516, z: -0.0004010703} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1996415125} + endPosition: {x: -0.0058890665, y: 0.095279716, z: 0.02656903} + endRotation: {x: -8.021406e-10, y: -0.000114591516, z: -0.0004010703} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + neutralRotation: {x: -8.0214146e-10, y: -0.00011459164, z: -0.0004010707} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 166525512} + endPosition: {x: -0.064796284, y: 0.08892077, z: 0.031140938} + endRotation: {x: 0.010070801, y: 0.00047302252, z: 356.19537} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823558, y: 0.088723354, z: 0.031141039} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1748842664} + endPosition: {x: -0.06389214, y: 0.088722564, z: -0.031144485} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823577, y: 0.08872271, z: -0.031144349} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + emotion: Happy + - blendShapes: + blendableNames: [] + weights: [] + bones: [] + verified: 1 + emotion: Sad + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1677069278} + endPosition: {x: -0.07520264, y: 0.09647115, z: 0.013598924} + endRotation: {x: 0, y: -0.00012207031, z: -0.00039672852} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.08304909, y: 0.0964711, z: 0.01359899} + neutralRotation: {x: -0, y: -0.00012207031, z: -0.00039672852} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 845736334} + endPosition: {x: -0.06919099, y: 0.08812796, z: 0.04087254} + endRotation: {x: 0, y: -0.00012207031, z: -0.00039672852} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.08835421, y: 0.088128105, z: 0.040872596} + neutralRotation: {x: -0, y: -0.00012207031, z: -0.00039672852} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 710794790} + endPosition: {x: -0.072032705, y: 0.09647067, z: -0.013602581} + endRotation: {x: 0, y: -0.00012207031, z: -0.00039672852} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.08304919, y: 0.09647081, z: -0.01360247} + neutralRotation: {x: -0, y: -0.00012207031, z: -0.00039672852} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 728140543} + endPosition: {x: -0.07018924, y: 0.088126965, z: -0.040876027} + endRotation: {x: 0, y: -0.00012207031, z: -0.00039672852} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.088354185, y: 0.08812728, z: -0.0408759} + neutralRotation: {x: -0, y: -0.00012207031, z: -0.00039672852} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + emotion: Serious + - blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1677069278} + endPosition: {x: -0.098720886, y: 0.09647146, z: 0.013598921} + endRotation: {x: 0, y: -0.00012207031, z: -0.00039672852} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.08304909, y: 0.0964711, z: 0.01359899} + neutralRotation: {x: -0, y: -0.00012207031, z: -0.00039672852} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 710794790} + endPosition: {x: -0.09990556, y: 0.096470565, z: -0.013602709} + endRotation: {x: 0, y: -0.00012207031, z: -0.00039672852} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.08304919, y: 0.09647081, z: -0.01360247} + neutralRotation: {x: -0, y: -0.00012207031, z: -0.00039672852} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 166525512} + endPosition: {x: -0.064348765, y: 0.08872315, z: 0.031140914} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823558, y: 0.088723354, z: 0.031141039} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1748842664} + endPosition: {x: -0.06374946, y: 0.08872266, z: -0.031144474} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823577, y: 0.08872271, z: -0.031144349} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + emotion: Eyebrows Up + playOnAwake: 0 + loop: 0 + defaultClip: {fileID: 0} + defaultDelay: 0 + scaleAudioSpeed: 1 + m_animationTimingMode: 0 + frameRate: 30 + restTime: 0.2 + restHoldTime: 0.4 + phonemeCurveGenerationMode: 0 + emotionCurveGenerationMode: 1 + keepEmotionWhenFinished: 0 + setNeutralBonePosesOnStart: 0 + gesturesAnimator: {fileID: 1996415134} + gesturesLayer: 0 + gestures: [] + onFinishedPlaying: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + lastUsedVersion: 1.42 +--- !u!4 &1996415121 stripped +Transform: + m_PrefabParentObject: {fileID: 469164, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415122 stripped +Transform: + m_PrefabParentObject: {fileID: 496744, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415123 stripped +Transform: + m_PrefabParentObject: {fileID: 422052, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415124 stripped +Transform: + m_PrefabParentObject: {fileID: 474136, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415125 stripped +Transform: + m_PrefabParentObject: {fileID: 498224, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415126 stripped +Transform: + m_PrefabParentObject: {fileID: 443216, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415127 stripped +Transform: + m_PrefabParentObject: {fileID: 422310, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415128 stripped +Transform: + m_PrefabParentObject: {fileID: 427104, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415129 stripped +Transform: + m_PrefabParentObject: {fileID: 448332, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415130 stripped +Transform: + m_PrefabParentObject: {fileID: 403482, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415131 stripped +Transform: + m_PrefabParentObject: {fileID: 456620, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415132 stripped +Transform: + m_PrefabParentObject: {fileID: 459106, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!4 &1996415133 stripped +Transform: + m_PrefabParentObject: {fileID: 404874, guid: f189c4378462f6e44a9440ee7ba50ef7, type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!95 &1996415134 stripped +Animator: + m_PrefabParentObject: {fileID: 9532216, guid: f189c4378462f6e44a9440ee7ba50ef7, + type: 2} + m_PrefabInternal: {fileID: 1996415115} +--- !u!114 &1996415135 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1996415117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cfbd411424bbdb842a5b964a94bb8fc2, type: 3} + m_Name: + m_EditorClassIdentifier: + isReady: 1 + users: + - {fileID: 1996415120} + - {fileID: 1996415136} + _blendables: [] +--- !u!114 &1996415136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1996415117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c4c3c6345ee104b4695e6f7a2c098f3a, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 1996415135} + blinkingEnabled: 1 + blinkingControlMode: 1 + blinkingShape: + blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 47214225} + endPosition: {x: -0.064083755, y: 0.08897603, z: -0.031105593} + endRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.072774656, y: 0.088975735, z: -0.03110516} + neutralRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1630612850} + endPosition: {x: -0.06377495, y: 0.08897592, z: 0.031101527} + endRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.07277464, y: 0.08897636, z: 0.03110184} + neutralRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 166525512} + endPosition: {x: -0.06552627, y: 0.088722974, z: 0.031140834} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823558, y: 0.088723354, z: 0.031141039} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1748842664} + endPosition: {x: -0.06650418, y: 0.088722415, z: -0.031144489} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823577, y: 0.08872271, z: -0.031144349} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1960484090} + endPosition: {x: 0.0023768598, y: 0.00998188, z: -0.0000042799998} + endRotation: {x: -0.000004406152, y: -0.000005803093, z: 311.00647} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.0023768598, y: 0.00998188, z: -0.0000042799998} + neutralRotation: {x: -0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1332590172} + endPosition: {x: 0.00237747, y: 0.00998201, z: -0.00001013} + endRotation: {x: 359.98993, y: -0.0006310902, z: 331.7144} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.00237747, y: 0.00998201, z: -0.00001013} + neutralRotation: {x: 359.98993, y: -0.0006301527, z: -0.00057295786} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + leftEyeBlinkBlendable: 0 + rightEyeBlinkBlendable: 1 + minimumBlinkGap: 2 + maximumBlinkGap: 5 + blinkDuration: 0.17 + randomLookingEnabled: 1 + lookingControlMode: 1 + lookingUpShape: + blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1907913969} + endPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + endRotation: {x: -0.00039612295, y: 0.0005162289, z: 285.00024} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + neutralRotation: {x: -0.0004010728, y: 0.00051566033, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1681818876} + endPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + endRotation: {x: -0.00039612295, y: 0.0005162289, z: 285.00024} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + neutralRotation: {x: -0.0004010728, y: 0.00051566033, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1630612850} + endPosition: {x: -0.074582316, y: 0.088976435, z: 0.031101802} + endRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.07277464, y: 0.08897636, z: 0.03110184} + neutralRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 47214225} + endPosition: {x: -0.074576065, y: 0.08897561, z: -0.03110527} + endRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.072774656, y: 0.088975735, z: -0.03110516} + neutralRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1748842664} + endPosition: {x: -0.06424861, y: 0.0887224, z: -0.031144511} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823577, y: 0.08872271, z: -0.031144349} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 166525512} + endPosition: {x: -0.06428144, y: 0.08872326, z: 0.031140942} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823558, y: 0.088723354, z: 0.031141039} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingDownShape: + blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1907913969} + endPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + endRotation: {x: -0.0003988576, y: 0.0005084562, z: 255.00024} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + neutralRotation: {x: -0.00040107282, y: 0.0005156604, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 166525512} + endPosition: {x: -0.060422517, y: 0.08872344, z: 0.031140931} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823558, y: 0.088723354, z: 0.031141039} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1630612850} + endPosition: {x: -0.06779348, y: 0.088976026, z: 0.031101564} + endRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.07277464, y: 0.08897636, z: 0.03110184} + neutralRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1681818876} + endPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + endRotation: {x: -0.0003988576, y: 0.0005084562, z: 255.00024} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + neutralRotation: {x: -0.00040107282, y: 0.0005156604, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1748842664} + endPosition: {x: -0.05953727, y: 0.08872254, z: -0.031144515} + endRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.061823577, y: 0.08872271, z: -0.031144349} + neutralRotation: {x: 0.01008606, y: 0.0004577637, z: 0.00022888185} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 47214225} + endPosition: {x: -0.06820805, y: 0.08897571, z: -0.031105405} + endRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.072774656, y: 0.088975735, z: -0.03110516} + neutralRotation: {x: 0.010084055, y: 0.00045840658, z: 0.00022918312} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingLeftShape: + blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1907913969} + endPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + endRotation: {x: 29.99964, y: 0.0006516464, z: 270.00027} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + neutralRotation: {x: -0.0004010728, y: 0.00051566045, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1681818876} + endPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + endRotation: {x: 29.999619, y: 0.00064277346, z: 270.00024} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + neutralRotation: {x: -0.0004010728, y: 0.00051566045, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingRightShape: + blendShapes: + blendableNames: [] + weights: [] + bones: + - bone: {fileID: 1907913969} + endPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + endRotation: {x: 329.9996, y: 0.00036673876, z: 270.00027} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + neutralRotation: {x: -0.00040107282, y: 0.00051566045, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1681818876} + endPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + endRotation: {x: 329.9996, y: 0.00036673876, z: 270.00027} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 1 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + neutralRotation: {x: -0.00040107282, y: 0.00051566045, z: 270.00024} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + _leftEyeLookAtBone: {fileID: 0} + _rightEyeLookAtBone: {fileID: 0} + eyeRotationRangeX: {x: -6.5, y: 6.5} + eyeRotationRangeY: {x: -17.2, y: 17.2} + eyeLookOffset: {x: 0, y: 0, z: 0} + eyeForwardAxis: 4 + eyeTurnSpeed: 14 + minimumChangeDirectionGap: 2 + maximumChangeDirectionGap: 6 + targetEnabled: 0 + autoTarget: 0 + autoTargetTag: EyeControllerTarget + autoTargetDistance: 10 + viewTarget: {fileID: 0} + targetWeight: 1 + boneUpdateAnimation: 0 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_02_Bone_Poses.unity.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_02_Bone_Poses.unity.meta new file mode 100644 index 0000000..bdf1f6e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_02_Bone_Poses.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50a2c82270c62ef4eabb770cf0a97d89 +timeCreated: 1458141092 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_03_Sprite_Blendsystem.unity b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_03_Sprite_Blendsystem.unity new file mode 100644 index 0000000..cbce124 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_03_Sprite_Blendsystem.unity @@ -0,0 +1,1828 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &171140839 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 171140841} + - component: {fileID: 171140840} + m_Layer: 0 + m_Name: Mouth Renderer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &171140840 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 171140839} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 1 + m_Sprite: {fileID: 21300000, guid: 2c7a56b3dc9988544bba367692993603, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 5.12} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 +--- !u!4 &171140841 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 171140839} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1001949426} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &408671395 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 408671396} + - component: {fileID: 408671399} + - component: {fileID: 408671398} + - component: {fileID: 408671397} + m_Layer: 5 + m_Name: Stop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &408671396 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 408671395} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1547167407} + m_Father: {fileID: 1264393603} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: -50} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &408671397 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 408671395} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 408671398} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1001949424} + m_MethodName: Stop + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &408671398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 408671395} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &408671399 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 408671395} +--- !u!1 &869894549 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 869894551} + - component: {fileID: 869894550} + m_Layer: 0 + m_Name: Eyebrows Renderer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &869894550 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869894549} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 2 + m_Sprite: {fileID: 21300000, guid: 59a910e1c30b8bc4a9f1c146cb9b2ae4, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 5.12} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 +--- !u!4 &869894551 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 869894549} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1001949426} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1001949421 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1001949426} + - component: {fileID: 1001949425} + - component: {fileID: 1001949424} + - component: {fileID: 1001949428} + - component: {fileID: 1001949422} + - component: {fileID: 1001949427} + - component: {fileID: 1001949423} + m_Layer: 0 + m_Name: Face + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1001949422 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001949421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a73e9d104505f7740b1524f08e1e5240, type: 3} + m_Name: + m_EditorClassIdentifier: + isReady: 1 + users: + - {fileID: 1001949424} + - {fileID: 1001949428} + _blendables: + - number: 0 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + - number: 0 + currentWeight: 0 + manager: {fileID: 1001949423} +--- !u!114 &1001949423 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001949421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aae829b8e4b9bb04397abef041e429b8, type: 3} + m_Name: + m_EditorClassIdentifier: + availableSprites: + - {fileID: 21300000, guid: 81de45ba86894e140a3ab593b3b1e76e, type: 3} + - {fileID: 21300000, guid: 59a910e1c30b8bc4a9f1c146cb9b2ae4, type: 3} + - {fileID: 21300000, guid: ce5c7b548b67adb468dd80bcddf9ea01, type: 3} + - {fileID: 21300000, guid: 18ae0103132e26b489e1580a1bfbe38d, type: 3} + - {fileID: 21300000, guid: 903d3a5489b80b44c912d5d0fbf1af9c, type: 3} + - {fileID: 21300000, guid: 2331cef62fd55f84b93ea17bbda44074, type: 3} + - {fileID: 21300000, guid: a06aed6b2f2cdc34c88a15a6a65b7b7a, type: 3} + - {fileID: 21300000, guid: eb85da52c967ec44891514579b8c5634, type: 3} + - {fileID: 21300000, guid: 31889678bc3adae42a12165a6928af93, type: 3} + - {fileID: 21300000, guid: 2c7a56b3dc9988544bba367692993603, type: 3} + - {fileID: 21300000, guid: 0add27a6dccbe6147bd96c25751a4cb2, type: 3} + - {fileID: 21300000, guid: 4f1a720a7dfd3424cb396efdb4dd19c2, type: 3} + - {fileID: 21300000, guid: d4951d81d42618643b8d4be856b51c0b, type: 3} + - {fileID: 21300000, guid: bcf8456845ce209498a3449268c15f19, type: 3} + - {fileID: 21300000, guid: d697fe6a053662e42be6934cb3d2f425, type: 3} + - {fileID: 21300000, guid: 55e7b84c4f8058947a6500f92bdce804, type: 3} + groups: + - groupName: Mouth + spriteRenderer: {fileID: 171140840} + defaultSprite: {fileID: 21300000, guid: 2c7a56b3dc9988544bba367692993603, type: 3} + - groupName: Eyebrows + spriteRenderer: {fileID: 869894550} + defaultSprite: {fileID: 21300000, guid: 59a910e1c30b8bc4a9f1c146cb9b2ae4, type: 3} + - groupName: Eyes + spriteRenderer: {fileID: 1429032486} + defaultSprite: {fileID: 21300000, guid: 903d3a5489b80b44c912d5d0fbf1af9c, type: 3} + - groupName: Eyeballs + spriteRenderer: {fileID: 1980325128} + defaultSprite: {fileID: 21300000, guid: 4f1a720a7dfd3424cb396efdb4dd19c2, type: 3} + blendSystem: {fileID: 1001949422} +--- !u!114 &1001949424 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001949421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 60953a4eedd70a246ab4eadbed9f0591, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 1001949422} + audioSource: {fileID: 1001949427} + useBones: 0 + boneUpdateAnimation: 0 + phonemes: + - blendShapes: 05000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: AI + phoneme: 0 + - blendShapes: 06000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: E + phoneme: 0 + - blendShapes: 08000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: U + phoneme: 0 + - blendShapes: 08000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: O + phoneme: 0 + - blendShapes: 09000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: CDGKNRSThYZ + phoneme: 0 + - blendShapes: 0a000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: FV + phoneme: 0 + - blendShapes: 05000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: L + phoneme: 0 + - blendShapes: 07000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: MBP + phoneme: 0 + - blendShapes: 0a000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + phonemeName: WQ + phoneme: 0 + - blendShapes: + blendableNames: [] + weights: [] + bones: [] + verified: 1 + phonemeName: Rest + phoneme: 0 + emotions: + - blendShapes: 12000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + emotion: Happy + - blendShapes: 10000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + emotion: Serious + - blendShapes: 12000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + emotion: Eyebrows Up + - blendShapes: 10000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + emotion: Sad + playOnAwake: 0 + loop: 0 + defaultClip: {fileID: 11400000, guid: c003f5c3254331749915c80d6b3fdab4, type: 2} + defaultDelay: 3 + scaleAudioSpeed: 1 + m_animationTimingMode: 0 + frameRate: 30 + restTime: 0.2 + restHoldTime: 0.4 + phonemeCurveGenerationMode: 1 + emotionCurveGenerationMode: 0 + keepEmotionWhenFinished: 0 + setNeutralBonePosesOnStart: 0 + gesturesAnimator: {fileID: 0} + gesturesLayer: 0 + gestures: [] + onFinishedPlaying: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + lastUsedVersion: 1.321 +--- !u!212 &1001949425 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001949421} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 21300000, guid: dead7b313dd00b54b858fae9eb785670, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 5.12} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 +--- !u!4 &1001949426 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001949421} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 171140841} + - {fileID: 869894551} + - {fileID: 1429032487} + - {fileID: 1980325129} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!82 &1001949427 +AudioSource: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001949421} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + - serializedVersion: 2 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 +--- !u!114 &1001949428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1001949421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c4c3c6345ee104b4695e6f7a2c098f3a, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 1001949422} + blinkingEnabled: 1 + blinkingControlMode: 1 + blinkingShape: + blendShapes: 23000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 100 + bones: [] + verified: 1 + leftEyeBlinkBlendable: 0 + rightEyeBlinkBlendable: 1 + minimumBlinkGap: 1.7696133 + maximumBlinkGap: 8.61768 + blinkDuration: 0.2 + randomLookingEnabled: 0 + lookingControlMode: 1 + lookingUpShape: + blendShapes: 3f000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 69.8 + bones: [] + verified: 1 + lookingDownShape: + blendShapes: 3c000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 29.3 + bones: [] + verified: 1 + lookingLeftShape: + blendShapes: 3d000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 51.5 + bones: [] + verified: 1 + lookingRightShape: + blendShapes: 3e000000 + blendableNames: + - Mouth/eyebrows_furrowed(0) + weights: + - 22.2 + bones: [] + verified: 1 + _leftEyeLookAtBone: {fileID: 0} + _rightEyeLookAtBone: {fileID: 0} + eyeRotationRangeX: {x: -6.5, y: 6.5} + eyeRotationRangeY: {x: -17.2, y: 17.2} + eyeLookOffset: {x: 0, y: 0, z: 0} + eyeForwardAxis: 4 + eyeTurnSpeed: 18 + minimumChangeDirectionGap: 2 + maximumChangeDirectionGap: 10 + targetEnabled: 0 + autoTarget: 0 + autoTargetTag: EyeControllerTarget + autoTargetDistance: 10 + viewTarget: {fileID: 0} + targetWeight: 1 + boneUpdateAnimation: 0 +--- !u!1 &1176430317 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1176430320} + - component: {fileID: 1176430319} + - component: {fileID: 1176430318} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1176430318 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1176430317} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1176430319 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1176430317} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1176430320 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1176430317} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1255165017 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1255165022} + - component: {fileID: 1255165021} + - component: {fileID: 1255165018} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1255165018 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1255165017} + m_Enabled: 1 +--- !u!20 &1255165021 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1255165017} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.1544118, g: 0.1544118, b: 0.1544118, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1255165022 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1255165017} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1264393599 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1264393603} + - component: {fileID: 1264393602} + - component: {fileID: 1264393601} + - component: {fileID: 1264393600} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1264393600 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1264393599} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1264393601 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1264393599} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1264393602 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1264393599} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1264393603 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1264393599} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1678657139} + - {fileID: 1970318765} + - {fileID: 1344870280} + - {fileID: 408671396} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1344870279 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1344870280} + - component: {fileID: 1344870283} + - component: {fileID: 1344870282} + - component: {fileID: 1344870281} + m_Layer: 5 + m_Name: Start + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1344870280 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1344870279} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1941719659} + m_Father: {fileID: 1264393603} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: 0} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1344870281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1344870279} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1344870282} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1001949424} + m_MethodName: Play + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 11400000, guid: b5b1de93257d52941b998f717ade5136, + type: 2} + m_ObjectArgumentAssemblyTypeName: RogoDigital.Lipsync.LipSyncData, Assembly-CSharp + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1344870282 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1344870279} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1344870283 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1344870279} +--- !u!1 &1429032485 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1429032487} + - component: {fileID: 1429032486} + m_Layer: 0 + m_Name: Eyes Renderer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1429032486 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1429032485} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 2 + m_Sprite: {fileID: 21300000, guid: 903d3a5489b80b44c912d5d0fbf1af9c, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 5.12} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 +--- !u!4 &1429032487 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1429032485} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1001949426} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1547167406 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1547167407} + - component: {fileID: 1547167409} + - component: {fileID: 1547167408} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1547167407 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547167406} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 408671396} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1547167408 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547167406} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Stop Talking +--- !u!222 &1547167409 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547167406} +--- !u!1 &1678657138 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1678657139} + - component: {fileID: 1678657141} + - component: {fileID: 1678657140} + m_Layer: 5 + m_Name: RawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1678657139 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1678657138} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1264393603} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 300, y: 150} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1678657140 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1678657138} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Texture: {fileID: 2800000, guid: 66f6896bb34e6d24da76779123904301, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1678657141 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1678657138} +--- !u!1 &1941719658 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1941719659} + - component: {fileID: 1941719661} + - component: {fileID: 1941719660} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1941719659 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1941719658} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1344870280} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1941719660 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1941719658} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Start Talking +--- !u!222 &1941719661 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1941719658} +--- !u!1 &1970318764 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1970318765} + - component: {fileID: 1970318767} + - component: {fileID: 1970318766} + m_Layer: 5 + m_Name: About + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1970318765 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1970318764} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1264393603} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 35, y: -143.1} + m_SizeDelta: {x: 400, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1970318766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1970318764} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: 'LipSync Pro 1.53 - Sprite Blendsystem Demo + + + Shows use of layers for emotions + + & Eye Controller.' +--- !u!222 &1970318767 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1970318764} +--- !u!1 &1974696108 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1974696110} + - component: {fileID: 1974696109} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1974696109 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1974696108} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1974696110 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1974696108} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1980325127 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1980325129} + - component: {fileID: 1980325128} + m_Layer: 0 + m_Name: Eyeballs Renderer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1980325128 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1980325127} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 1 + m_Sprite: {fileID: 21300000, guid: 4f1a720a7dfd3424cb396efdb4dd19c2, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 5.12} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 +--- !u!4 &1980325129 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1980325127} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1001949426} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_03_Sprite_Blendsystem.unity.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_03_Sprite_Blendsystem.unity.meta new file mode 100644 index 0000000..7692140 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_03_Sprite_Blendsystem.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 546aee944edf4ab44b4eaae14b6fcf4d +timeCreated: 1492771460 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_04_Lincoln_Advanced.unity b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_04_Lincoln_Advanced.unity new file mode 100644 index 0000000..fd5a6fd --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_04_Lincoln_Advanced.unity @@ -0,0 +1,5999 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 1, g: 0.9126774, b: 0.8455882, a: 1} + m_AmbientEquatorColor: {r: 0.09558821, g: 0.09558821, b: 0.09558821, a: 1} + m_AmbientGroundColor: {r: 0.09558821, g: 0.09558821, b: 0.09558821, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 1 + m_BakeResolution: 50 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &3094565 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 3094566} + m_Layer: 0 + m_Name: mixamorig_LeftShoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3094566 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 3094565} + m_LocalRotation: {x: -0.6376416, y: 0.49090853, z: -0.45292112, w: -0.38377663} + m_LocalPosition: {x: -0.059448536, y: 0.09176086, z: 0.01839664} + m_LocalScale: {x: 1, y: 1, z: 1.0000001} + m_Children: + - {fileID: 1936780307} + m_Father: {fileID: 1866651763} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &19660718 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 19660725} + - component: {fileID: 19660724} + m_Layer: 0 + m_Name: Lincoln_Char (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!95 &19660724 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 19660718} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Controller: {fileID: 9100000, guid: 57a040ade2046cc49b15b2a4e1271449, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!4 &19660725 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 19660718} + m_LocalRotation: {x: 0, y: 0.31225204, z: 0, w: 0.94999933} + m_LocalPosition: {x: -0.37, y: 0, z: -0.76} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2137396416} + - {fileID: 779170112} + - {fileID: 1901345709} + - {fileID: 297821295} + - {fileID: 1088762853} + - {fileID: 1817552785} + - {fileID: 873437142} + - {fileID: 1267373855} + - {fileID: 67547333} + - {fileID: 385310077} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 36.39, z: 0} +--- !u!1 &40929399 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 40929400} + m_Layer: 0 + m_Name: mixamorig_LeftToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &40929400 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 40929399} + m_LocalRotation: {x: 0.37813732, y: -0.035986185, z: 0.013066409, w: 0.92495763} + m_LocalPosition: {x: 0.000000020489098, y: 0.16364932, z: 0} + m_LocalScale: {x: 1, y: 1.0000002, z: 1} + m_Children: + - {fileID: 1288067045} + m_Father: {fileID: 1346217032} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &56318438 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 56318440} + - component: {fileID: 56318439} + m_Layer: 0 + m_Name: Bottoms + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!137 &56318439 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 56318438} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: c75b4ef0d2ec8a5468c404e6016cb617, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300010, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1151924779} + - {fileID: 187267626} + - {fileID: 948766239} + - {fileID: 1937217338} + - {fileID: 1234433974} + - {fileID: 303448549} + - {fileID: 229488174} + - {fileID: 712671140} + - {fileID: 1777777759} + - {fileID: 2142087017} + - {fileID: 514262825} + - {fileID: 522831384} + - {fileID: 703541372} + - {fileID: 883858122} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1151924779} + m_AABB: + m_Center: {x: -0.0007613003, y: -0.45346355, z: -0.01576528} + m_Extent: {x: 0.1828529, y: 0.52401507, z: 0.27524662} + m_DirtyAABB: 0 +--- !u!4 &56318440 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 56318438} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &67547332 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 67547333} + - component: {fileID: 67547334} + m_Layer: 0 + m_Name: Tops + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &67547333 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 67547332} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &67547334 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 67547332} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: a4a99770a9405f043a126fee39e093f4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300008, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1866651763} + - {fileID: 841596567} + - {fileID: 1062833840} + - {fileID: 3094566} + - {fileID: 698228071} + - {fileID: 162333328} + - {fileID: 873437142} + - {fileID: 1727388219} + - {fileID: 120396075} + - {fileID: 1330941483} + - {fileID: 1936780307} + - {fileID: 851088070} + - {fileID: 1000133970} + - {fileID: 816154407} + - {fileID: 1279100370} + - {fileID: 2026199886} + - {fileID: 956311501} + - {fileID: 1410818737} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 873437142} + m_AABB: + m_Center: {x: 0.0005377531, y: 0.1991515, z: -0.055916965} + m_Extent: {x: 0.7304884, y: 0.402664, z: 0.25533015} + m_DirtyAABB: 0 +--- !u!1 &120396074 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 120396075} + m_Layer: 0 + m_Name: mixamorig_RightForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &120396075 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 120396074} + m_LocalRotation: {x: -0.04002702, y: 0.06451582, z: 0.13297948, w: 0.9882065} + m_LocalPosition: {x: -0.000000029802322, y: 0.28208044, z: -0.000000007450576} + m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 1330941483} + m_Father: {fileID: 1727388219} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &139854502 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 139854503} + m_Layer: 0 + m_Name: mixamorig_LeftShoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &139854503 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 139854502} + m_LocalRotation: {x: -0.6376416, y: 0.49090853, z: -0.45292112, w: -0.38377663} + m_LocalPosition: {x: -0.059448536, y: 0.09176086, z: 0.01839664} + m_LocalScale: {x: 1, y: 1, z: 1.0000001} + m_Children: + - {fileID: 836179801} + m_Father: {fileID: 712671140} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &150665560 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 150665564} + - component: {fileID: 150665563} + - component: {fileID: 150665562} + m_Layer: 5 + m_Name: About + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &150665562 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150665560} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.14705884, g: 0.14705884, b: 0.14705884, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: 'LipSync Pro 1.53 - Advanced Demo + + + Uses the ''Advanced Blendshape Blend System'', which allows mixing blendshapes + from multiple meshes.' +--- !u!222 &150665563 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150665560} +--- !u!224 &150665564 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 150665560} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 306413163} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 35, y: -143.1} + m_SizeDelta: {x: 400, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!1 &162333327 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 162333328} + m_Layer: 0 + m_Name: mixamorig_Spine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &162333328 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 162333327} + m_LocalRotation: {x: -0.053280152, y: -0.023910683, z: -0.018462462, w: 0.9981226} + m_LocalPosition: {x: -0.00002082752, y: 0.09868542, z: -0.0152929} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 1} + m_Children: + - {fileID: 698228071} + m_Father: {fileID: 873437142} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &187267625 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 187267626} + m_Layer: 0 + m_Name: mixamorig_Spine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &187267626 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 187267625} + m_LocalRotation: {x: -0.053280152, y: -0.023910683, z: -0.018462462, w: 0.9981226} + m_LocalPosition: {x: -0.00002082752, y: 0.09868542, z: -0.0152929} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 1} + m_Children: + - {fileID: 303448549} + m_Father: {fileID: 1151924779} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &229488173 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 229488174} + m_Layer: 0 + m_Name: mixamorig_RightLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &229488174 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 229488173} + m_LocalRotation: {x: 0.04816381, y: -0.04368151, z: -0.0043556513, w: 0.9978744} + m_LocalPosition: {x: 0.000000009313226, y: 0.406804, z: -4.656613e-10} + m_LocalScale: {x: 0.99999994, y: 0.9999997, z: 0.9999998} + m_Children: + - {fileID: 522831384} + m_Father: {fileID: 1234433974} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &294929373 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 294929374} + - component: {fileID: 294929375} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &294929374 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 294929373} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &294929375 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 294929373} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 1880cba827ee51d41a078290574b218b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300000, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 2025171733} + - {fileID: 642741744} + - {fileID: 1151924779} + - {fileID: 187267626} + - {fileID: 303448549} + - {fileID: 712671140} + - {fileID: 948766239} + - {fileID: 1234433974} + - {fileID: 1632272753} + - {fileID: 1467366465} + - {fileID: 139854503} + - {fileID: 2078157421} + - {fileID: 417044975} + - {fileID: 736279428} + - {fileID: 1937217338} + - {fileID: 1777777759} + - {fileID: 2142087017} + - {fileID: 514262825} + - {fileID: 229488174} + - {fileID: 522831384} + - {fileID: 703541372} + - {fileID: 883858122} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 1151924779} + m_AABB: + m_Center: {x: -0.00022363663, y: -0.09376109, z: 0.009177074} + m_Extent: {x: 0.9707043, y: 0.89830804, z: 0.13446598} + m_DirtyAABB: 0 +--- !u!1 &297821293 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 297821295} + - component: {fileID: 297821294} + m_Layer: 0 + m_Name: Eyelashes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!137 &297821294 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 297821293} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: bae21052dadf95443bacebf61af2d180, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300004, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 956311501} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 956311501} + m_AABB: + m_Center: {x: -0.00035601482, y: 0.07441538, z: 0.10325476} + m_Extent: {x: 0.053792693, y: 0.009807289, z: 0.012436353} + m_DirtyAABB: 0 +--- !u!4 &297821295 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 297821293} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &303448548 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 303448549} + m_Layer: 0 + m_Name: mixamorig_Spine1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &303448549 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 303448548} + m_LocalRotation: {x: 0.018717201, y: -0.005334527, z: 0.008814693, w: 0.9997717} + m_LocalPosition: {x: -5.31486e-12, y: 0.11425713, z: 4.3655746e-11} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 712671140} + m_Father: {fileID: 187267626} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &306413159 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 306413163} + - component: {fileID: 306413162} + - component: {fileID: 306413161} + - component: {fileID: 306413160} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &306413160 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &306413161 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &306413162 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &306413163 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 306413159} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1282409300} + - {fileID: 150665564} + - {fileID: 1999395743} + - {fileID: 1165587335} + - {fileID: 565041904} + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &385310075 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 385310077} + - component: {fileID: 385310076} + m_Layer: 0 + m_Name: LipSync Audio + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!82 &385310076 +AudioSource: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 385310075} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 0.557 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + - serializedVersion: 2 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 +--- !u!4 &385310077 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 385310075} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.6054, z: 0.0973} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &406089117 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 406089118} + - component: {fileID: 406089119} + m_Layer: 0 + m_Name: Tops + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &406089118 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406089117} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &406089119 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 406089117} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: a4a99770a9405f043a126fee39e093f4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300008, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 712671140} + - {fileID: 1632272753} + - {fileID: 1467366465} + - {fileID: 139854503} + - {fileID: 303448549} + - {fileID: 187267626} + - {fileID: 1151924779} + - {fileID: 2027269249} + - {fileID: 417044975} + - {fileID: 736279428} + - {fileID: 836179801} + - {fileID: 948766239} + - {fileID: 2025171733} + - {fileID: 1234433974} + - {fileID: 1937217338} + - {fileID: 229488174} + - {fileID: 2078157421} + - {fileID: 642741744} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1151924779} + m_AABB: + m_Center: {x: 0.0005377531, y: 0.1991515, z: -0.055916965} + m_Extent: {x: 0.7304884, y: 0.402664, z: 0.25533015} + m_DirtyAABB: 0 +--- !u!1 &417044974 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 417044975} + m_Layer: 0 + m_Name: mixamorig_RightForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &417044975 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 417044974} + m_LocalRotation: {x: -0.04002702, y: 0.06451582, z: 0.13297948, w: 0.9882065} + m_LocalPosition: {x: -0.000000029802322, y: 0.28208044, z: -0.000000007450576} + m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 736279428} + m_Father: {fileID: 2027269249} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &514262824 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 514262825} + m_Layer: 0 + m_Name: mixamorig_LeftToe_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &514262825 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 514262824} + m_LocalRotation: {x: -4.3368087e-19, y: 3.266159e-18, z: 3.035766e-18, w: 1} + m_LocalPosition: {x: -0, y: 0.09952715, z: 0.0000000011920929} + m_LocalScale: {x: 0.9999999, y: 0.99999976, z: 0.9999999} + m_Children: [] + m_Father: {fileID: 2142087017} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &522831383 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 522831384} + m_Layer: 0 + m_Name: mixamorig_RightFoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &522831384 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 522831383} + m_LocalRotation: {x: 0.39238337, y: -0.003310624, z: -0.066044316, w: 0.91742164} + m_LocalPosition: {x: 0.0000000018626454, y: 0.40984824, z: 0.000000007450582} + m_LocalScale: {x: 0.99999994, y: 1.0000002, z: 1} + m_Children: + - {fileID: 703541372} + m_Father: {fileID: 229488174} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &562808702 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 562808703} + - component: {fileID: 562808704} + m_Layer: 0 + m_Name: LipSync Audio + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &562808703 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 562808702} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.6054, z: 0.0973} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!82 &562808704 +AudioSource: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 562808702} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 0.557 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + - serializedVersion: 2 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 2 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!1 &565041903 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 565041904} + - component: {fileID: 565041907} + - component: {fileID: 565041906} + - component: {fileID: 565041905} + m_Layer: 5 + m_Name: Stop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &565041904 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1455595248} + m_Father: {fileID: 306413163} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: -50} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &565041905 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 565041906} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1305237556} + m_MethodName: Stop + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1305237555} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &565041906 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &565041907 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 565041903} +--- !u!1 &623119194 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 623119195} + - component: {fileID: 623119196} + m_Layer: 0 + m_Name: Beards + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &623119195 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 623119194} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &623119196 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 623119194} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 7639fe857dd957b45b4a5cd512043041, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300012, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1632272753} + - {fileID: 2078157421} + - {fileID: 712671140} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 712671140} + m_AABB: + m_Center: {x: -0.00012616813, y: 0.24085134, z: 0.13324648} + m_Extent: {x: 0.07676652, y: 0.09699773, z: 0.070890516} + m_DirtyAABB: 0 +--- !u!1 &642741743 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 642741744} + m_Layer: 0 + m_Name: mixamorig_LeftHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &642741744 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 642741743} + m_LocalRotation: {x: 0.0042823046, y: 0.12048616, z: 0.0031524813, w: 0.99270076} + m_LocalPosition: {x: 0.000000029802326, y: 0.26824573, z: 0.00000004470348} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2025171733} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &650974901 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 650974902} + m_Layer: 0 + m_Name: mixamorig_RightFoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &650974902 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 650974901} + m_LocalRotation: {x: 0.39238337, y: -0.003310624, z: -0.066044316, w: 0.91742164} + m_LocalPosition: {x: 0.0000000018626454, y: 0.40984824, z: 0.000000007450582} + m_LocalScale: {x: 0.99999994, y: 1.0000002, z: 1} + m_Children: + - {fileID: 1092067600} + m_Father: {fileID: 2026199886} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &698228070 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 698228071} + m_Layer: 0 + m_Name: mixamorig_Spine1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &698228071 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 698228070} + m_LocalRotation: {x: 0.018717201, y: -0.005334527, z: 0.008814693, w: 0.9997717} + m_LocalPosition: {x: -5.31486e-12, y: 0.11425713, z: 4.3655746e-11} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1866651763} + m_Father: {fileID: 162333328} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &703541371 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 703541372} + m_Layer: 0 + m_Name: mixamorig_RightToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &703541372 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 703541371} + m_LocalRotation: {x: 0.3968524, y: 0.036018014, z: -0.013107239, w: 0.9170819} + m_LocalPosition: {x: -0.0000000027939682, y: 0.16248362, z: -0.00000003725291} + m_LocalScale: {x: 0.99999976, y: 1, z: 0.99999994} + m_Children: + - {fileID: 883858122} + m_Father: {fileID: 522831384} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &712671139 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 712671140} + m_Layer: 0 + m_Name: mixamorig_Spine2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &712671140 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 712671139} + m_LocalRotation: {x: -0.0000000074505797, y: -1.8189892e-12, z: -9.094946e-13, w: 1} + m_LocalPosition: {x: -5.4214415e-12, y: 0.13540043, z: 0.000000013707904} + m_LocalScale: {x: 1, y: 1.0000002, z: 1} + m_Children: + - {fileID: 139854503} + - {fileID: 1632272753} + - {fileID: 1467366465} + m_Father: {fileID: 303448549} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &736279427 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 736279428} + m_Layer: 0 + m_Name: mixamorig_RightHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &736279428 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 736279427} + m_LocalRotation: {x: 0.0033513857, y: -0.014040428, z: 0.00059746346, w: 0.99989563} + m_LocalPosition: {x: -0.000000029802322, y: 0.26820433, z: -0.00000029802302} + m_LocalScale: {x: 1.0000002, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 417044975} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &757482749 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 757482750} + - component: {fileID: 757482751} + m_Layer: 0 + m_Name: Shoes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &757482750 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 757482749} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &757482751 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 757482749} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d7aacf9a239c81648a8ebac11cd24dbf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300014, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 229488174} + - {fileID: 522831384} + - {fileID: 703541372} + - {fileID: 883858122} + - {fileID: 1937217338} + - {fileID: 1777777759} + - {fileID: 2142087017} + - {fileID: 514262825} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1937217338} + m_AABB: + m_Center: {x: -0.08032758, y: 0.4964792, z: 0.077514246} + m_Extent: {x: 0.17312235, y: 0.18285155, z: 0.18961094} + m_DirtyAABB: 0 +--- !u!1 &779170110 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 779170112} + - component: {fileID: 779170111} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!137 &779170111 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 779170110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 1880cba827ee51d41a078290574b218b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300000, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1000133970} + - {fileID: 1410818737} + - {fileID: 873437142} + - {fileID: 162333328} + - {fileID: 698228071} + - {fileID: 1866651763} + - {fileID: 851088070} + - {fileID: 816154407} + - {fileID: 841596567} + - {fileID: 1062833840} + - {fileID: 3094566} + - {fileID: 956311501} + - {fileID: 120396075} + - {fileID: 1330941483} + - {fileID: 1279100370} + - {fileID: 1346217032} + - {fileID: 40929400} + - {fileID: 1288067045} + - {fileID: 2026199886} + - {fileID: 650974902} + - {fileID: 1092067600} + - {fileID: 1232091913} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 873437142} + m_AABB: + m_Center: {x: -0.00022363663, y: -0.09376109, z: 0.009177074} + m_Extent: {x: 0.9707043, y: 0.89830804, z: 0.13446598} + m_DirtyAABB: 0 +--- !u!4 &779170112 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 779170110} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &816154406 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 816154407} + m_Layer: 0 + m_Name: mixamorig_RightUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &816154407 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 816154406} + m_LocalRotation: {x: 0.08247918, y: -0.040985238, z: 0.9957497, w: -0.00006260695} + m_LocalPosition: {x: 0.081488185, y: -0.068782054, z: 0.0012808595} + m_LocalScale: {x: 1, y: 0.99999994, z: 1} + m_Children: + - {fileID: 2026199886} + m_Father: {fileID: 873437142} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &836179800 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 836179801} + m_Layer: 0 + m_Name: mixamorig_LeftArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &836179801 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 836179800} + m_LocalRotation: {x: 0.5192215, y: -0.2268215, z: -0.19341111, w: 0.8009702} + m_LocalPosition: {x: 0.000000029802326, y: 0.12651934, z: 0.000000072643154} + m_LocalScale: {x: 1, y: 1.0000002, z: 1.0000001} + m_Children: + - {fileID: 2025171733} + m_Father: {fileID: 139854503} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &841596566 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 841596567} + m_Layer: 0 + m_Name: mixamorig_Neck + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &841596567 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 841596566} + m_LocalRotation: {x: 0.10213044, y: -0.004767477, z: -0.016644595, w: 0.9946203} + m_LocalPosition: {x: -0.000011545715, y: 0.1515016, z: 0.028294165} + m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 956311501} + m_Father: {fileID: 1866651763} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &847345875 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 847345879} + - component: {fileID: 847345878} + - component: {fileID: 847345877} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &847345877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 847345875} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &847345878 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 847345875} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &847345879 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 847345875} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &851088069 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 851088070} + m_Layer: 0 + m_Name: mixamorig_LeftUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &851088070 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 851088069} + m_LocalRotation: {x: 0.18174882, y: -0.03397064, z: 0.9825632, w: 0.019570889} + m_LocalPosition: {x: -0.08159254, y: -0.0675599, z: 0.0013438762} + m_LocalScale: {x: 1, y: 0.99999994, z: 1} + m_Children: + - {fileID: 1279100370} + m_Father: {fileID: 873437142} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &873437141 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 873437142} + m_Layer: 0 + m_Name: mixamorig_Hips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &873437142 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 873437141} + m_LocalRotation: {x: -0.030076584, y: 0.04529655, z: 0.030436635, w: 0.99805677} + m_LocalPosition: {x: -0.006970884, y: 0.9974835, z: 0.009719183} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 851088070} + - {fileID: 816154407} + - {fileID: 162333328} + m_Father: {fileID: 19660725} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &883858121 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 883858122} + m_Layer: 0 + m_Name: mixamorig_RightToe_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &883858122 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 883858121} + m_LocalRotation: {x: 1.517883e-18, y: -2.1985502e-16, z: 4.3368087e-19, w: 1} + m_LocalPosition: {x: -0, y: 0.09888336, z: -0.0000000023841857} + m_LocalScale: {x: 1.0000002, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 703541372} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &941374140 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 941374142} + - component: {fileID: 941374141} + m_Layer: 0 + m_Name: Directional light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &941374141 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 941374140} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.98600405, b: 0.9558824, a: 1} + m_Intensity: 1.09 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0 + m_NormalBias: 0.5 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &941374142 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 941374140} + m_LocalRotation: {x: -0.06932131, y: 0.84553254, z: -0.11334389, w: -0.5171291} + m_LocalPosition: {x: 1.6889104, y: 4.6352816, z: -3.2605157} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &948766238 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 948766239} + m_Layer: 0 + m_Name: mixamorig_LeftUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &948766239 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 948766238} + m_LocalRotation: {x: 0.18174882, y: -0.03397064, z: 0.9825632, w: 0.019570889} + m_LocalPosition: {x: -0.08159254, y: -0.0675599, z: 0.0013438762} + m_LocalScale: {x: 1, y: 0.99999994, z: 1} + m_Children: + - {fileID: 1937217338} + m_Father: {fileID: 1151924779} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &956265122 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 956265127} + - component: {fileID: 956265126} + - component: {fileID: 956265123} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &956265123 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 956265122} + m_Enabled: 1 +--- !u!20 &956265126 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 956265122} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 20 + field of view: 29.7 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &956265127 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 956265122} + m_LocalRotation: {x: 0, y: 1, z: 0, w: -0.00000016292068} + m_LocalPosition: {x: 0, y: 1.65, z: 1} + m_LocalScale: {x: 0.99999994, y: 1, z: 1.0000001} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &956311500 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 956311501} + m_Layer: 0 + m_Name: mixamorig_Head + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &956311501 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 956311500} + m_LocalRotation: {x: -0.06580398, y: -0.007978736, z: 0.0034114416, w: 0.99779487} + m_LocalPosition: {x: -0.000063840846, y: 0.105319716, z: 0.030171199} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1185082497} + - {fileID: 1062875730} + - {fileID: 1187894462} + m_Father: {fileID: 841596567} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1000133969 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1000133970} + m_Layer: 0 + m_Name: mixamorig_LeftForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1000133970 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1000133969} + m_LocalRotation: {x: -0.019620566, y: 0.08862124, z: -0.09907128, w: 0.990932} + m_LocalPosition: {x: 0.000000029802326, y: 0.2820247, z: 0.00000010430811} + m_LocalScale: {x: 1, y: 1, z: 0.9999999} + m_Children: + - {fileID: 1410818737} + m_Father: {fileID: 1936780307} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1062833839 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1062833840} + m_Layer: 0 + m_Name: mixamorig_RightShoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1062833840 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1062833839} + m_LocalRotation: {x: 0.6498786, y: 0.46389687, z: -0.4911343, w: 0.34820214} + m_LocalPosition: {x: 0.059450474, y: 0.091477655, z: 0.018344566} + m_LocalScale: {x: 1.0000001, y: 1.0000002, z: 1.0000001} + m_Children: + - {fileID: 1727388219} + m_Father: {fileID: 1866651763} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1062875729 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1062875730} + m_Layer: 0 + m_Name: mixamorig_LeftEye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1062875730 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1062875729} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 956311501} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1088762852 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1088762853} + - component: {fileID: 1088762854} + m_Layer: 0 + m_Name: Eyes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1088762853 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1088762852} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1088762854 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1088762852} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: b4824d23ae5403b47add72f1413110dc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300002, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1187894462} + - {fileID: 1062875730} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1062875730} + m_AABB: + m_Center: {x: 0.027714929, y: -0.0000104904175, z: -0.000023182482} + m_Extent: {x: 0.045256414, y: 0.017943261, z: 0.017904708} + m_DirtyAABB: 0 +--- !u!1 &1092067599 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1092067600} + m_Layer: 0 + m_Name: mixamorig_RightToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1092067600 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1092067599} + m_LocalRotation: {x: 0.3968524, y: 0.036018014, z: -0.013107239, w: 0.9170819} + m_LocalPosition: {x: -0.0000000027939682, y: 0.16248362, z: -0.00000003725291} + m_LocalScale: {x: 0.99999976, y: 1, z: 0.99999994} + m_Children: + - {fileID: 1232091913} + m_Father: {fileID: 650974902} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1122981735 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1122981736} + - component: {fileID: 1122981737} + m_Layer: 0 + m_Name: Eyes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1122981736 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1122981735} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1122981737 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1122981735} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: b4824d23ae5403b47add72f1413110dc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300002, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 1304552564} + - {fileID: 1369171227} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1369171227} + m_AABB: + m_Center: {x: 0.027714929, y: -0.0000104904175, z: -0.000023182482} + m_Extent: {x: 0.045256414, y: 0.017943261, z: 0.017904708} + m_DirtyAABB: 0 +--- !u!1 &1151924778 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1151924779} + m_Layer: 0 + m_Name: mixamorig_Hips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1151924779 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1151924778} + m_LocalRotation: {x: -0.030076584, y: 0.04529655, z: 0.030436635, w: 0.99805677} + m_LocalPosition: {x: -0.006970884, y: 0.9974835, z: 0.009719183} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 948766239} + - {fileID: 1234433974} + - {fileID: 187267626} + m_Father: {fileID: 1156787514} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1156787514 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305237552} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.05, y: 0, z: -0.18} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 623119195} + - {fileID: 294929374} + - {fileID: 56318440} + - {fileID: 1990340820} + - {fileID: 1122981736} + - {fileID: 1576137097} + - {fileID: 1151924779} + - {fileID: 757482750} + - {fileID: 406089118} + - {fileID: 562808703} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1165587334 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1165587335} + - component: {fileID: 1165587338} + - component: {fileID: 1165587337} + - component: {fileID: 1165587336} + m_Layer: 5 + m_Name: Start + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1165587335 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1308106821} + m_Father: {fileID: 306413163} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 35, y: 0} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1165587336 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1165587337} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1305237556} + m_MethodName: Play + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 11400000, guid: c003f5c3254331749915c80d6b3fdab4, + type: 2} + m_ObjectArgumentAssemblyTypeName: RogoDigital.Lipsync.LipSyncData, Assembly-CSharp + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1305237555} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 1 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1165587337 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1165587338 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1165587334} +--- !u!1 &1185082496 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1185082497} + m_Layer: 0 + m_Name: mixamorig_HeadTop_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1185082497 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1185082496} + m_LocalRotation: {x: 1.16e-42, y: -1.7439706e-16, z: 6.653809e-27, w: 1} + m_LocalPosition: {x: 0.000085874606, y: 0.18782684, z: 0.06796168} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 956311501} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1187894461 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1187894462} + m_Layer: 0 + m_Name: mixamorig_RightEye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1187894462 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1187894461} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 956311501} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1232091912 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1232091913} + m_Layer: 0 + m_Name: mixamorig_RightToe_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1232091913 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1232091912} + m_LocalRotation: {x: 1.517883e-18, y: -2.1985502e-16, z: 4.3368087e-19, w: 1} + m_LocalPosition: {x: -0, y: 0.09888336, z: -0.0000000023841857} + m_LocalScale: {x: 1.0000002, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1092067600} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1234433973 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1234433974} + m_Layer: 0 + m_Name: mixamorig_RightUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1234433974 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1234433973} + m_LocalRotation: {x: 0.08247918, y: -0.040985238, z: 0.9957497, w: -0.00006260695} + m_LocalPosition: {x: 0.081488185, y: -0.068782054, z: 0.0012808595} + m_LocalScale: {x: 1, y: 0.99999994, z: 1} + m_Children: + - {fileID: 229488174} + m_Father: {fileID: 1151924779} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1267373854 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1267373855} + - component: {fileID: 1267373856} + m_Layer: 0 + m_Name: Shoes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1267373855 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267373854} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1267373856 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1267373854} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d7aacf9a239c81648a8ebac11cd24dbf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300014, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 2026199886} + - {fileID: 650974902} + - {fileID: 1092067600} + - {fileID: 1232091913} + - {fileID: 1279100370} + - {fileID: 1346217032} + - {fileID: 40929400} + - {fileID: 1288067045} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 1279100370} + m_AABB: + m_Center: {x: -0.08032758, y: 0.4964792, z: 0.077514246} + m_Extent: {x: 0.17312235, y: 0.18285155, z: 0.18961094} + m_DirtyAABB: 0 +--- !u!1 &1279100369 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1279100370} + m_Layer: 0 + m_Name: mixamorig_LeftLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1279100370 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1279100369} + m_LocalRotation: {x: 0.0749849, y: 0.0041707656, z: 0.04122876, w: 0.9963233} + m_LocalPosition: {x: 0.000000011175871, y: 0.40373635, z: 0} + m_LocalScale: {x: 1, y: 0.9999998, z: 0.9999999} + m_Children: + - {fileID: 1346217032} + m_Father: {fileID: 851088070} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1282409299 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1282409300} + - component: {fileID: 1282409302} + - component: {fileID: 1282409301} + m_Layer: 5 + m_Name: RawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1282409300 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1282409299} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 306413163} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 300, y: 150} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1282409301 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1282409299} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -98529514, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Texture: {fileID: 2800000, guid: 59c765ded93876843860c678f1ca61a6, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1282409302 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1282409299} +--- !u!1 &1288067044 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1288067045} + m_Layer: 0 + m_Name: mixamorig_LeftToe_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1288067045 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1288067044} + m_LocalRotation: {x: -4.3368087e-19, y: 3.266159e-18, z: 3.035766e-18, w: 1} + m_LocalPosition: {x: -0, y: 0.09952715, z: 0.0000000011920929} + m_LocalScale: {x: 0.9999999, y: 0.99999976, z: 0.9999999} + m_Children: [] + m_Father: {fileID: 40929400} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1304552563 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1304552564} + m_Layer: 0 + m_Name: mixamorig_RightEye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1304552564 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1304552563} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2078157421} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1305237552 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1156787514} + - component: {fileID: 1305237553} + - component: {fileID: 1305237556} + - component: {fileID: 1305237555} + - component: {fileID: 1305237558} + - component: {fileID: 1305237557} + m_Layer: 0 + m_Name: Lincoln_Char + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!95 &1305237553 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305237552} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Controller: {fileID: 9100000, guid: 57a040ade2046cc49b15b2a4e1271449, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!114 &1305237555 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305237552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c4c3c6345ee104b4695e6f7a2c098f3a, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 1305237557} + blinkingEnabled: 1 + blinkingControlMode: 1 + blinkingShape: + blendShapes: 000000002b000000010000002c0000000200000003000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + - BrowsIn_Right (5) + weights: + - 65 + - 100 + - 65 + - 100 + - 3.3 + - 3.3 + bones: [] + verified: 1 + leftEyeBlinkBlendable: 0 + rightEyeBlinkBlendable: 1 + minimumBlinkGap: 0.90700936 + maximumBlinkGap: 4.4649534 + blinkDuration: 0.15 + randomLookingEnabled: 1 + lookingControlMode: 0 + lookingUpShape: + blendShapes: 0c0000000d0000002b0000002c0000000000000001000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Squint_Left (43) + - Squint_Right (44) + - Blink_Left (0) + - Blink_Right (1) + weights: + - 100 + - 100 + - 44.6 + - 44.6 + - 0 + - 0 + bones: + - bone: {fileID: 1369171227} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 349.79315, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1304552564} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 349.79315, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingDownShape: + blendShapes: 0c0000000d00000000000000010000002b0000002c000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Blink_Left (0) + - Blink_Right (1) + - Squint_Left (43) + - Squint_Right (44) + weights: + - 100 + - 100 + - 47.2 + - 47.8 + - 0 + - 0 + bones: + - bone: {fileID: 1369171227} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 20.703491, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1304552564} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 20.70349, y: 0, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingLeftShape: + blendShapes: 0c0000000d00000000000000010000002b0000002c000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Blink_Left (0) + - Blink_Right (1) + - Squint_Left (43) + - Squint_Right (44) + weights: + - 21.9 + - 42.1 + - 0 + - 0 + - 0 + - 0 + bones: + - bone: {fileID: 1369171227} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 0, y: -21.458496, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1304552564} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 0, y: -17.887756, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + lookingRightShape: + blendShapes: 0c0000000d00000000000000010000002b0000002c000000 + blendableNames: + - EyesWide_Left (12) + - EyesWide_Right (13) + - Blink_Left (0) + - Blink_Right (1) + - Squint_Left (43) + - Squint_Right (44) + weights: + - 51.7 + - 37.8 + - 0 + - 0 + - 0 + - 0 + bones: + - bone: {fileID: 1369171227} + endPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + endRotation: {x: 0, y: 19.397354, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + - bone: {fileID: 1304552564} + endPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + endRotation: {x: 0, y: 20.185226, z: 0} + endScale: {x: 1, y: 1, z: 1} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + neutralPosition: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + neutralRotation: {x: 0, y: 0, z: 0} + neutralScale: {x: 1, y: 1, z: 1} + verified: 1 + _leftEyeLookAtBone: {fileID: 1369171227} + _rightEyeLookAtBone: {fileID: 1304552564} + eyeRotationRangeX: {x: -7.4, y: 7.4} + eyeRotationRangeY: {x: -19, y: 19} + eyeLookOffset: {x: 0, y: 0, z: 0} + eyeForwardAxis: 4 + eyeTurnSpeed: 20 + minimumChangeDirectionGap: 1.5420561 + maximumChangeDirectionGap: 5.523337 + targetEnabled: 1 + autoTarget: 0 + autoTargetTag: EyeControllerTarget + autoTargetDistance: 10 + viewTarget: {fileID: 956265127} + targetWeight: 0 + boneUpdateAnimation: 1 +--- !u!114 &1305237556 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305237552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 60953a4eedd70a246ab4eadbed9f0591, type: 3} + m_Name: + m_EditorClassIdentifier: + blendSystem: {fileID: 1305237557} + audioSource: {fileID: 562808704} + useBones: 1 + boneUpdateAnimation: 0 + phonemes: + - blendShapes: 23000000 + blendableNames: + - Blink_Left (0) + weights: + - 49 + bones: [] + verified: 1 + phonemeName: AI + phoneme: 0 + - blendShapes: 23000000290000002a0000002d0000001e0000002f000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + - BrowsIn_Right (5) + weights: + - 28.6 + - 42.9 + - 35.6 + - 2.2 + - 16.6 + - 20.9 + bones: [] + verified: 1 + phonemeName: E + phoneme: 1 + - blendShapes: 2300000021000000220000001d0000002f000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + weights: + - 24 + - 42.7 + - 43.7 + - 55.7 + - 70.4 + bones: [] + verified: 1 + phonemeName: U + phoneme: 2 + - blendShapes: 230000002100000022000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 61 + - 72 + - 72 + bones: [] + verified: 1 + phonemeName: O + phoneme: 3 + - blendShapes: 16000000 + blendableNames: + - Blink_Left (0) + weights: + - 14.6 + bones: [] + verified: 1 + phonemeName: CDGKNRSThYZ + phoneme: 4 + - blendShapes: 160000001c000000290000002a0000002f000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + weights: + - 0 + - 100 + - 22 + - 36.9 + - 100 + bones: [] + verified: 1 + phonemeName: FV + phoneme: 5 + - blendShapes: 230000002d00000027000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 32.2 + - 100 + - 16.1 + bones: [] + verified: 1 + phonemeName: L + phoneme: 6 + - blendShapes: 200000001c0000002e000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 12.6 + - 69.4 + - 66.8 + bones: [] + verified: 1 + phonemeName: MBP + phoneme: 7 + - blendShapes: 21000000220000001d000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + weights: + - 89.6 + - 75.8 + - 21.2 + bones: [] + verified: 1 + phonemeName: WQ + phoneme: 8 + - blendShapes: + blendableNames: [] + weights: [] + bones: [] + verified: 1 + phonemeName: Rest + phoneme: 9 + emotions: + - blendShapes: 290000002a0000002b0000002c0000000800000009000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + - BrowsIn_Right (5) + weights: + - 55.3 + - 56.4 + - 35.2 + - 35.2 + - 20.5 + - 17.8 + bones: [] + verified: 1 + emotion: Happy + - blendShapes: 200000000e0000000f0000000600000007000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + - BrowsIn_Left (4) + weights: + - 18.9 + - 43.2 + - 47.5 + - 57.7 + - 60.3 + bones: [] + verified: 1 + emotion: Sad + - blendShapes: 0200000003000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + weights: + - 47.2 + - 47.8 + bones: [] + verified: 1 + emotion: Serious + - blendShapes: 08000000090000000700000006000000 + blendableNames: + - Blink_Left (0) + - Blink_Right (1) + - BrowsDown_Left (2) + - BrowsDown_Right (3) + weights: + - 35.5 + - 36.7 + - 23.4 + - 22.6 + bones: [] + verified: 1 + emotion: Eyebrows Up + playOnAwake: 0 + loop: 0 + defaultClip: {fileID: 0} + defaultDelay: 2 + scaleAudioSpeed: 1 + m_animationTimingMode: 0 + frameRate: 60 + restTime: 0.2 + restHoldTime: 0.2 + phonemeCurveGenerationMode: 1 + emotionCurveGenerationMode: 0 + keepEmotionWhenFinished: 1 + setNeutralBonePosesOnStart: 0 + gesturesAnimator: {fileID: 1305237553} + gesturesLayer: 0 + gestures: [] + onFinishedPlaying: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1305237555} + m_MethodName: SetLookAtAmount + m_Mode: 4 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + lastUsedVersion: 1.521 +--- !u!114 &1305237557 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305237552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73062c91ee80bb040abd084433473a81, type: 3} + m_Name: + m_EditorClassIdentifier: + isReady: 1 + users: + - {fileID: 1305237556} + - {fileID: 1305237555} + _blendables: + - number: 0 + currentWeight: 0 + - number: 1 + currentWeight: 0 + - number: 2 + currentWeight: 0 + - number: 3 + currentWeight: 0 + - number: 4 + currentWeight: 0 + - number: 5 + currentWeight: 0 + - number: 6 + currentWeight: 0 + - number: 7 + currentWeight: 0 + - number: 8 + currentWeight: 0 + - number: 9 + currentWeight: 0 + - number: 10 + currentWeight: 0 + - number: 11 + currentWeight: 0 + - number: 12 + currentWeight: 0 + - number: 13 + currentWeight: 0 + - number: 14 + currentWeight: 0 + - number: 15 + currentWeight: 0 + - number: 16 + currentWeight: 0 + - number: 17 + currentWeight: 0 + - number: 18 + currentWeight: 0 + - number: 19 + currentWeight: 0 + - number: 20 + currentWeight: 0 + - number: 21 + currentWeight: 0 + - number: 22 + currentWeight: 0 + - number: 23 + currentWeight: 0 + - number: 24 + currentWeight: 0 + - number: 25 + currentWeight: 0 + - number: 26 + currentWeight: 0 + - number: 27 + currentWeight: 0 + - number: 28 + currentWeight: 0 + - number: 29 + currentWeight: 0 + - number: 30 + currentWeight: 0 + - number: 31 + currentWeight: 0 + - number: 32 + currentWeight: 0 + - number: 33 + currentWeight: 0 + - number: 34 + currentWeight: 0 + - number: 35 + currentWeight: 0 + - number: 36 + currentWeight: 0 + - number: 37 + currentWeight: 0 + - number: 38 + currentWeight: 0 + - number: 39 + currentWeight: 0 + - number: 40 + currentWeight: 0 + - number: 41 + currentWeight: 0 + - number: 42 + currentWeight: 0 + - number: 43 + currentWeight: 0 + - number: 44 + currentWeight: 0 + - number: 45 + currentWeight: 0 + - number: 46 + currentWeight: 0 + - number: 47 + currentWeight: 0 + - number: 48 + currentWeight: 0 + - number: 49 + currentWeight: 0 + manager: {fileID: 1305237558} +--- !u!114 &1305237558 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1305237552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6dc1e47bffd97414a93a92fb41f56b80, type: 3} + m_Name: + m_EditorClassIdentifier: + blendShapes: + - name: Blink_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 0 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 0 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 0 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 0 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 0 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 0 + - name: Blink_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 1 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 1 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 1 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 1 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 1 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 1 + - name: BrowsDown_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 2 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 2 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 2 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 2 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 2 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 2 + - name: BrowsDown_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 3 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 3 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 3 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 3 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 3 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 3 + - name: BrowsIn_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 4 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 4 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 4 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 4 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 4 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 4 + - name: BrowsIn_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 5 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 5 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 5 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 5 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 5 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 5 + - name: BrowsOuterLower_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 6 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 6 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 6 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 6 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 6 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 6 + - name: BrowsOuterLower_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 7 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 7 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 7 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 7 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 7 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 7 + - name: BrowsUp_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 8 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 8 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 8 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 8 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 8 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 8 + - name: BrowsUp_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 9 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 9 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 9 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 9 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 9 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 9 + - name: CheekPuff_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 10 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 10 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 10 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 10 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 10 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 10 + - name: CheekPuff_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 11 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 11 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 11 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 11 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 11 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 11 + - name: EyesWide_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 12 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 12 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 12 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 12 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 12 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 12 + - name: EyesWide_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 13 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 13 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 13 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 13 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 13 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 13 + - name: Frown_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 14 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 14 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 14 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 14 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 14 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 14 + - name: Frown_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 15 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 15 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 15 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 15 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 15 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 15 + - name: JawBackward + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 16 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 16 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 16 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 16 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 16 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 16 + - name: JawForeward + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 17 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 17 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 17 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 17 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 17 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 17 + - name: JawRotateY_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 18 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 18 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 18 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 18 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 18 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 18 + - name: JawRotateY_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 19 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 19 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 19 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 19 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 19 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 19 + - name: JawRotateZ_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 20 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 20 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 20 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 20 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 20 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 20 + - name: JawRotateZ_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 21 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 21 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 21 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 21 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 21 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 21 + - name: Jaw_Down + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 22 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 22 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 22 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 22 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 22 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 22 + - name: Jaw_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 23 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 23 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 23 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 23 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 23 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 23 + - name: Jaw_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 24 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 24 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 24 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 24 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 24 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 24 + - name: Jaw_Up + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 25 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 25 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 25 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 25 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 25 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 25 + - name: LowerLipDown_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 26 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 26 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 26 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 26 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 26 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 26 + - name: LowerLipDown_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 27 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 27 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 27 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 27 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 27 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 27 + - name: LowerLipIn + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 28 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 28 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 28 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 28 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 28 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 28 + - name: LowerLipOut + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 29 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 29 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 29 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 29 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 29 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 29 + - name: Midmouth_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 30 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 30 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 30 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 30 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 30 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 30 + - name: Midmouth_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 31 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 31 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 31 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 31 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 31 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 31 + - name: MouthDown + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 32 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 32 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 32 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 32 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 32 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 32 + - name: MouthNarrow_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 33 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 33 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 33 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 33 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 33 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 33 + - name: MouthNarrow_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 34 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 34 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 34 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 34 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 34 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 34 + - name: MouthOpen + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 35 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 35 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 35 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 35 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 35 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 35 + - name: MouthUp + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 36 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 36 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 36 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 36 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 36 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 36 + - name: MouthWhistle_NarrowAdjust_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 37 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 37 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 37 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 37 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 37 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 37 + - name: MouthWhistle_NarrowAdjust_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 38 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 38 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 38 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 38 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 38 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 38 + - name: NoseScrunch_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 39 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 39 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 39 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 39 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 39 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 39 + - name: NoseScrunch_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 40 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 40 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 40 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 40 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 40 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 40 + - name: Smile_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 41 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 41 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 41 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 41 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 41 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 41 + - name: Smile_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 42 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 42 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 42 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 42 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 42 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 42 + - name: Squint_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 43 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 43 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 43 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 43 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 43 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 43 + - name: Squint_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 44 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 44 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 44 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 44 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 44 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 44 + - name: TongueUp + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 45 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 45 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 45 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 45 + - name: UpperLipIn + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 46 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 45 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 46 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 46 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 45 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 46 + - name: UpperLipOut + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 47 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 46 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 47 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 47 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 46 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 47 + - name: UpperLipUp_Left + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 48 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 47 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 48 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 48 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 47 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 48 + - name: UpperLipUp_Right + mappings: + - skinnedMeshRenderer: {fileID: 294929375} + blendShapeIndex: 49 + - skinnedMeshRenderer: {fileID: 623119196} + blendShapeIndex: 48 + - skinnedMeshRenderer: {fileID: 1990340821} + blendShapeIndex: 49 + - skinnedMeshRenderer: {fileID: 779170111} + blendShapeIndex: 49 + - skinnedMeshRenderer: {fileID: 2137396415} + blendShapeIndex: 48 + - skinnedMeshRenderer: {fileID: 297821294} + blendShapeIndex: 49 + blendSystem: {fileID: 1305237557} +--- !u!1 &1308106820 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1308106821} + - component: {fileID: 1308106823} + - component: {fileID: 1308106822} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1308106821 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1308106820} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1165587335} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1308106822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1308106820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Start Talking +--- !u!222 &1308106823 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1308106820} +--- !u!1 &1330941482 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1330941483} + m_Layer: 0 + m_Name: mixamorig_RightHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1330941483 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1330941482} + m_LocalRotation: {x: 0.0033513857, y: -0.014040428, z: 0.00059746346, w: 0.99989563} + m_LocalPosition: {x: -0.000000029802322, y: 0.26820433, z: -0.00000029802302} + m_LocalScale: {x: 1.0000002, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 120396075} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1346217031 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1346217032} + m_Layer: 0 + m_Name: mixamorig_LeftFoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1346217032 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1346217031} + m_LocalRotation: {x: 0.38410857, y: 0.20665793, z: -0.042945676, w: 0.89883745} + m_LocalPosition: {x: 0.0000000037252903, y: 0.41347975, z: -0.0000000055879363} + m_LocalScale: {x: 0.9999999, y: 0.9999998, z: 1.0000002} + m_Children: + - {fileID: 40929400} + m_Father: {fileID: 1279100370} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1369171226 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1369171227} + m_Layer: 0 + m_Name: mixamorig_LeftEye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1369171227 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1369171226} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2078157421} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1410818736 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1410818737} + m_Layer: 0 + m_Name: mixamorig_LeftHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1410818737 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1410818736} + m_LocalRotation: {x: 0.0042823046, y: 0.12048616, z: 0.0031524813, w: 0.99270076} + m_LocalPosition: {x: 0.000000029802326, y: 0.26824573, z: 0.00000004470348} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1000133970} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1452576025 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1452576026} + m_Layer: 0 + m_Name: mixamorig_HeadTop_End + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1452576026 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1452576025} + m_LocalRotation: {x: 1.16e-42, y: -1.7439706e-16, z: 6.653809e-27, w: 1} + m_LocalPosition: {x: 0.000085874606, y: 0.18782684, z: 0.06796168} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2078157421} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1455595247 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1455595248} + - component: {fileID: 1455595250} + - component: {fileID: 1455595249} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1455595248 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455595247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 565041904} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1455595249 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455595247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Stop Talking +--- !u!222 &1455595250 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1455595247} +--- !u!1 &1467366464 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1467366465} + m_Layer: 0 + m_Name: mixamorig_RightShoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1467366465 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1467366464} + m_LocalRotation: {x: 0.6498786, y: 0.46389687, z: -0.4911343, w: 0.34820214} + m_LocalPosition: {x: 0.059450474, y: 0.091477655, z: 0.018344566} + m_LocalScale: {x: 1.0000001, y: 1.0000002, z: 1.0000001} + m_Children: + - {fileID: 2027269249} + m_Father: {fileID: 712671140} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1576137096 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1576137097} + - component: {fileID: 1576137098} + m_Layer: 0 + m_Name: Hats + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1576137097 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1576137096} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1576137098 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1576137096} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 134256085b30cd54e8d7901e803356c9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300006, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 2078157421} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 2078157421} + m_AABB: + m_Center: {x: 0.000011742115, y: 0.21016899, z: 0.016935214} + m_Extent: {x: 0.13085796, y: 0.12793174, z: 0.15191023} + m_DirtyAABB: 0 +--- !u!1 &1632272752 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1632272753} + m_Layer: 0 + m_Name: mixamorig_Neck + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1632272753 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1632272752} + m_LocalRotation: {x: 0.10213044, y: -0.004767477, z: -0.016644595, w: 0.9946203} + m_LocalPosition: {x: -0.000011545715, y: 0.1515016, z: 0.028294165} + m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 2078157421} + m_Father: {fileID: 712671140} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1727388218 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1727388219} + m_Layer: 0 + m_Name: mixamorig_RightArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1727388219 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1727388218} + m_LocalRotation: {x: 0.5081314, y: 0.27377596, z: 0.19307679, w: 0.7934549} + m_LocalPosition: {x: 0, y: 0.12652656, z: 0.00000016018747} + m_LocalScale: {x: 1, y: 1.0000002, z: 1.0000005} + m_Children: + - {fileID: 120396075} + m_Father: {fileID: 1062833840} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1777777758 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1777777759} + m_Layer: 0 + m_Name: mixamorig_LeftFoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1777777759 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1777777758} + m_LocalRotation: {x: 0.38410857, y: 0.20665793, z: -0.042945676, w: 0.89883745} + m_LocalPosition: {x: 0.0000000037252903, y: 0.41347975, z: -0.0000000055879363} + m_LocalScale: {x: 0.9999999, y: 0.9999998, z: 1.0000002} + m_Children: + - {fileID: 2142087017} + m_Father: {fileID: 1937217338} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1794017488 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1794017490} + - component: {fileID: 1794017489} + m_Layer: 0 + m_Name: Reflection Probe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!215 &1794017489 +ReflectionProbe: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1794017488} + m_Enabled: 1 + serializedVersion: 2 + m_Type: 0 + m_Mode: 0 + m_RefreshMode: 0 + m_TimeSlicingMode: 0 + m_Resolution: 128 + m_UpdateFrequency: 0 + m_BoxSize: {x: 10, y: 10, z: 10} + m_BoxOffset: {x: 0, y: 0, z: 0} + m_NearClip: 0.3 + m_FarClip: 1000 + m_ShadowDistance: 100 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.62002593, g: 0.6476956, b: 0.6911765, a: 1} + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_IntensityMultiplier: 0.58 + m_BlendDistance: 1 + m_HDR: 1 + m_BoxProjection: 0 + m_RenderDynamicObjects: 0 + m_UseOcclusionCulling: 1 + m_Importance: 1 + m_CustomBakedTexture: {fileID: 0} +--- !u!4 &1794017490 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1794017488} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.93199503, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1817552784 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1817552785} + - component: {fileID: 1817552786} + m_Layer: 0 + m_Name: Hats + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1817552785 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1817552784} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1817552786 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1817552784} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 134256085b30cd54e8d7901e803356c9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300006, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 956311501} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 956311501} + m_AABB: + m_Center: {x: 0.000011742115, y: 0.21016899, z: 0.016935214} + m_Extent: {x: 0.13085796, y: 0.12793174, z: 0.15191023} + m_DirtyAABB: 0 +--- !u!1 &1866651762 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1866651763} + m_Layer: 0 + m_Name: mixamorig_Spine2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1866651763 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1866651762} + m_LocalRotation: {x: -0.0000000074505797, y: -1.8189892e-12, z: -9.094946e-13, w: 1} + m_LocalPosition: {x: -5.4214415e-12, y: 0.13540043, z: 0.000000013707904} + m_LocalScale: {x: 1, y: 1.0000002, z: 1} + m_Children: + - {fileID: 3094566} + - {fileID: 841596567} + - {fileID: 1062833840} + m_Father: {fileID: 698228071} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1901345708 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1901345709} + - component: {fileID: 1901345710} + m_Layer: 0 + m_Name: Bottoms + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1901345709 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1901345708} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1901345710 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1901345708} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: c75b4ef0d2ec8a5468c404e6016cb617, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300010, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 873437142} + - {fileID: 162333328} + - {fileID: 851088070} + - {fileID: 1279100370} + - {fileID: 816154407} + - {fileID: 698228071} + - {fileID: 2026199886} + - {fileID: 1866651763} + - {fileID: 1346217032} + - {fileID: 40929400} + - {fileID: 1288067045} + - {fileID: 650974902} + - {fileID: 1092067600} + - {fileID: 1232091913} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 873437142} + m_AABB: + m_Center: {x: -0.0007613003, y: -0.45346355, z: -0.01576528} + m_Extent: {x: 0.1828529, y: 0.52401507, z: 0.27524662} + m_DirtyAABB: 0 +--- !u!1 &1936780306 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1936780307} + m_Layer: 0 + m_Name: mixamorig_LeftArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1936780307 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1936780306} + m_LocalRotation: {x: 0.5192215, y: -0.2268215, z: -0.19341111, w: 0.8009702} + m_LocalPosition: {x: 0.000000029802326, y: 0.12651934, z: 0.000000072643154} + m_LocalScale: {x: 1, y: 1.0000002, z: 1.0000001} + m_Children: + - {fileID: 1000133970} + m_Father: {fileID: 3094566} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1937217337 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1937217338} + m_Layer: 0 + m_Name: mixamorig_LeftLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1937217338 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1937217337} + m_LocalRotation: {x: 0.0749849, y: 0.0041707656, z: 0.04122876, w: 0.9963233} + m_LocalPosition: {x: 0.000000011175871, y: 0.40373635, z: 0} + m_LocalScale: {x: 1, y: 0.9999998, z: 0.9999999} + m_Children: + - {fileID: 1777777759} + m_Father: {fileID: 948766239} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1990340819 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1990340820} + - component: {fileID: 1990340821} + m_Layer: 0 + m_Name: Eyelashes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1990340820 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1990340819} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1156787514} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &1990340821 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1990340819} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: bae21052dadf95443bacebf61af2d180, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300004, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 2078157421} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 2078157421} + m_AABB: + m_Center: {x: -0.00035601482, y: 0.07441538, z: 0.10325476} + m_Extent: {x: 0.053792693, y: 0.009807289, z: 0.012436353} + m_DirtyAABB: 0 +--- !u!1 &1999395742 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1999395743} + - component: {fileID: 1999395745} + - component: {fileID: 1999395744} + m_Layer: 5 + m_Name: About (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1999395743 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1999395742} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 306413163} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 35, y: -396.5} + m_SizeDelta: {x: 700, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1999395744 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1999395742} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: (The same LipSync component is controlling both characters) +--- !u!222 &1999395745 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1999395742} +--- !u!1 &2025171732 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2025171733} + m_Layer: 0 + m_Name: mixamorig_LeftForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2025171733 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2025171732} + m_LocalRotation: {x: -0.019620566, y: 0.08862124, z: -0.09907128, w: 0.990932} + m_LocalPosition: {x: 0.000000029802326, y: 0.2820247, z: 0.00000010430811} + m_LocalScale: {x: 1, y: 1, z: 0.9999999} + m_Children: + - {fileID: 642741744} + m_Father: {fileID: 836179801} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2026199885 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2026199886} + m_Layer: 0 + m_Name: mixamorig_RightLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2026199886 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2026199885} + m_LocalRotation: {x: 0.04816381, y: -0.04368151, z: -0.0043556513, w: 0.9978744} + m_LocalPosition: {x: 0.000000009313226, y: 0.406804, z: -4.656613e-10} + m_LocalScale: {x: 0.99999994, y: 0.9999997, z: 0.9999998} + m_Children: + - {fileID: 650974902} + m_Father: {fileID: 816154407} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2027269248 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2027269249} + m_Layer: 0 + m_Name: mixamorig_RightArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2027269249 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2027269248} + m_LocalRotation: {x: 0.5081314, y: 0.27377596, z: 0.19307679, w: 0.7934549} + m_LocalPosition: {x: 0, y: 0.12652656, z: 0.00000016018747} + m_LocalScale: {x: 1, y: 1.0000002, z: 1.0000005} + m_Children: + - {fileID: 417044975} + m_Father: {fileID: 1467366465} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2078157420 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2078157421} + m_Layer: 0 + m_Name: mixamorig_Head + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2078157421 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2078157420} + m_LocalRotation: {x: -0.06580398, y: -0.007978736, z: 0.0034114416, w: 0.99779487} + m_LocalPosition: {x: -0.000063840846, y: 0.105319716, z: 0.030171199} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1452576026} + - {fileID: 1369171227} + - {fileID: 1304552564} + m_Father: {fileID: 1632272753} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2108455884 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2108455888} + - component: {fileID: 2108455887} + - component: {fileID: 2108455886} + - component: {fileID: 2108455885} + m_Layer: 0 + m_Name: Plane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!23 &2108455885 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 911aa5d0dcffd9240b819d7f8849c52c, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!64 &2108455886 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Convex: 0 + m_CookingOptions: 14 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &2108455887 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2108455888 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2108455884} + m_LocalRotation: {x: 0.707107, y: 0, z: 0, w: 0.70710665} + m_LocalPosition: {x: 0.27, y: 1.68, z: -9.01} + m_LocalScale: {x: 1.34854, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2137396414 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2137396416} + - component: {fileID: 2137396415} + m_Layer: 0 + m_Name: Beards + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!137 &2137396415 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137396414} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 7639fe857dd957b45b4a5cd512043041, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 2 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300012, guid: 954cc2e2a795089478410e4488b669ff, type: 3} + m_Bones: + - {fileID: 841596567} + - {fileID: 956311501} + - {fileID: 1866651763} + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 1866651763} + m_AABB: + m_Center: {x: -0.00012616813, y: 0.24085134, z: 0.13324648} + m_Extent: {x: 0.07676652, y: 0.09699773, z: 0.070890516} + m_DirtyAABB: 0 +--- !u!4 &2137396416 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2137396414} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 19660725} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2142087016 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2142087017} + m_Layer: 0 + m_Name: mixamorig_LeftToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2142087017 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2142087016} + m_LocalRotation: {x: 0.37813732, y: -0.035986185, z: 0.013066409, w: 0.92495763} + m_LocalPosition: {x: 0.000000020489098, y: 0.16364932, z: 0} + m_LocalScale: {x: 1, y: 1.0000002, z: 1} + m_Children: + - {fileID: 514262825} + m_Father: {fileID: 1777777759} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_04_Lincoln_Advanced.unity.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_04_Lincoln_Advanced.unity.meta new file mode 100644 index 0000000..9e7cd4d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Example_04_Lincoln_Advanced.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e29cde9a3700a44594dc3ad7e78206b +timeCreated: 1499376995 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models.meta new file mode 100644 index 0000000..6194694 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 83e786f6480701b4286c3779c1f56375 +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza.meta new file mode 100644 index 0000000..c2c7c43 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9644580c575491046a62a98fa3ead57b +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations.meta new file mode 100644 index 0000000..5510722 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 27e81cc50416da54f874874732e433f5 +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks.meta new file mode 100644 index 0000000..bfde01f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 13403d459e569b04b8db2018bb6b1ca7 +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids.mask b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids.mask new file mode 100644 index 0000000..28f472e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids.mask @@ -0,0 +1,254 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1011 &101100000 +AvatarMask: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRFL_Face_EyeLids + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: GRFL_Hips + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + m_Weight: 0 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids.mask.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids.mask.meta new file mode 100644 index 0000000..0c54aa3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad1305ba6cfcaa4459c55a08e2cb4cc0 +timeCreated: 1449327569 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Left.mask b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Left.mask new file mode 100644 index 0000000..328f678 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Left.mask @@ -0,0 +1,254 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1011 &101100000 +AvatarMask: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRFL_Face_EyeLids_Left + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: GRFL_Hips + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + m_Weight: 0 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Left.mask.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Left.mask.meta new file mode 100644 index 0000000..9a71d3b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Left.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2adae1f33f8a2da40b6fa4d34514d1ef +timeCreated: 1449327653 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Right.mask b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Right.mask new file mode 100644 index 0000000..fb3b435 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Right.mask @@ -0,0 +1,254 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1011 &101100000 +AvatarMask: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRFL_Face_EyeLids_Right + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: GRFL_Hips + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + m_Weight: 0 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Right.mask.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Right.mask.meta new file mode 100644 index 0000000..fbe2b45 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_EyeLids_Right.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1c267568420502941a1282251356a42f +timeCreated: 1449327674 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_Viseme.mask b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_Viseme.mask new file mode 100644 index 0000000..89a15b3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_Viseme.mask @@ -0,0 +1,254 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1011 &101100000 +AvatarMask: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRFL_Face_Viseme + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: GRFL_Hips + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + m_Weight: 1 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + m_Weight: 0 + - m_Path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + m_Weight: 0 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_Viseme.mask.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_Viseme.mask.meta new file mode 100644 index 0000000..4ae3112 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/AnimMasks/GRFL_Face_Viseme.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e0e92d9299ef3384d8966cf5f474361d +timeCreated: 1449328004 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza.meta new file mode 100644 index 0000000..1c5c3a5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5ea057919443c7943a6c3e16cbfa223b +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Blinking.FBX b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Blinking.FBX new file mode 100644 index 0000000..858fd64 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Blinking.FBX differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Blinking.FBX.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Blinking.FBX.meta new file mode 100644 index 0000000..1a50ea0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Blinking.FBX.meta @@ -0,0 +1,5957 @@ +fileFormatVersion: 2 +guid: 3427fd92ce287264fa4b49b3b9489442 +timeCreated: 1449415324 +licenseType: Free +ModelImporter: + serializedVersion: 18 + fileIDToRecycleName: + 100000: GRFL_Head + 100002: GRFL_HeadNub + 100004: GRFL_Hips + 100006: GRFL_Jaw + 100008: GRFL_JawEnd + 100010: GRFL_L_Arm + 100012: GRFL_L_ArmTwist + 100014: GRFL_L_BrowInner + 100016: GRFL_L_BrowOuter + 100018: GRFL_L_Cheek + 100020: GRFL_L_Eye + 100022: GRFL_L_Foot + 100024: GRFL_L_FootCont1 + 100026: GRFL_L_FootCont2 + 100028: GRFL_L_FootCont3 + 100030: GRFL_L_FootCont4 + 100032: GRFL_L_ForeArm + 100034: GRFL_L_ForeArmTwist + 100036: GRFL_L_Hand + 100038: GRFL_L_HandIndex1 + 100040: GRFL_L_HandIndex2 + 100042: GRFL_L_HandIndex3 + 100044: GRFL_L_HandIndexNub + 100046: GRFL_L_HandMiddle1 + 100048: GRFL_L_HandMiddle2 + 100050: GRFL_L_HandMiddle3 + 100052: GRFL_L_HandMiddleNub + 100054: GRFL_L_HandPinky1 + 100056: GRFL_L_HandPinky2 + 100058: GRFL_L_HandPinky3 + 100060: GRFL_L_HandPinkyNub + 100062: GRFL_L_HandRing1 + 100064: GRFL_L_HandRing2 + 100066: GRFL_L_HandRing3 + 100068: GRFL_L_HandRingNub + 100070: GRFL_L_HandThumb1 + 100072: GRFL_L_HandThumb2 + 100074: GRFL_L_HandThumb3 + 100076: GRFL_L_HandThumbNub + 100078: GRFL_L_Leg + 100080: GRFL_L_LegTwist + 100082: GRFL_L_LipCorner + 100084: GRFL_L_LipLower + 100086: GRFL_L_LipUpper + 100088: GRFL_L_LowerEyelash + 100090: GRFL_L_LowerEyelid + 100092: GRFL_L_Nostril + 100094: GRFL_L_Shoulder + 100096: GRFL_L_ToeBase + 100098: GRFL_L_ToeBaseNub + 100100: GRFL_L_ToetCont1 + 100102: GRFL_L_ToetCont2 + 100104: GRFL_L_UpLeg + 100106: GRFL_L_UpLegTwist + 100108: GRFL_L_UpperEeylash + 100110: GRFL_L_UpperEyelid + 100112: GRFL_L_WeaponHand + 100114: GRFL_L_WeaponUpLeg + 100116: GRFL_LipLower + 100118: GRFL_LipUpper + 100120: GRFL_Neck + 100122: GRFL_Nose + 100124: GRFL_R_Arm + 100126: GRFL_R_ArmTwist + 100128: GRFL_R_BrowInner + 100130: GRFL_R_BrowOuter + 100132: GRFL_R_Cheek + 100134: GRFL_R_Eye + 100136: GRFL_R_Foot + 100138: GRFL_R_FootCont1 + 100140: GRFL_R_FootCont2 + 100142: GRFL_R_FootCont3 + 100144: GRFL_R_FootCont4 + 100146: GRFL_R_ForeArm + 100148: GRFL_R_ForeArmTwist + 100150: GRFL_R_Hand + 100152: GRFL_R_HandIndex1 + 100154: GRFL_R_HandIndex2 + 100156: GRFL_R_HandIndex3 + 100158: GRFL_R_HandIndexNub + 100160: GRFL_R_HandMiddle1 + 100162: GRFL_R_HandMiddle2 + 100164: GRFL_R_HandMiddle3 + 100166: GRFL_R_HandMiddleNub + 100168: GRFL_R_HandPinky1 + 100170: GRFL_R_HandPinky2 + 100172: GRFL_R_HandPinky3 + 100174: GRFL_R_HandPinkyNub + 100176: GRFL_R_HandRing1 + 100178: GRFL_R_HandRing2 + 100180: GRFL_R_HandRing3 + 100182: GRFL_R_HandRingNub + 100184: GRFL_R_HandThumb1 + 100186: GRFL_R_HandThumb2 + 100188: GRFL_R_HandThumb3 + 100190: GRFL_R_HandThumbNub + 100192: GRFL_R_Leg + 100194: GRFL_R_LegTwist + 100196: GRFL_R_LipCorner + 100198: GRFL_R_LipLower + 100200: GRFL_R_LipUpper + 100202: GRFL_R_LowerEyelash + 100204: GRFL_R_LowerEyelid + 100206: GRFL_R_Nostril + 100208: GRFL_R_Shoulder + 100210: GRFL_R_ToeBase + 100212: GRFL_R_ToeBaseNub + 100214: GRFL_R_ToetCont1 + 100216: GRFL_R_ToetCont2 + 100218: GRFL_R_UpLeg + 100220: GRFL_R_UpLegTwist + 100222: GRFL_R_UpperEeylash + 100224: GRFL_R_UpperEyelid + 100226: GRFL_R_WeaponHand + 100228: GRFL_R_WeaponUpLeg + 100230: GRFL_Spine + 100232: GRFL_Spine1 + 100234: GRFL_Spine2 + 100236: GRFL_Tongue + 100238: GRFL_Tongue1 + 100240: GRFL_Tongue2 + 100242: //RootNode + 400000: GRFL_Head + 400002: GRFL_HeadNub + 400004: GRFL_Hips + 400006: GRFL_Jaw + 400008: GRFL_JawEnd + 400010: GRFL_L_Arm + 400012: GRFL_L_ArmTwist + 400014: GRFL_L_BrowInner + 400016: GRFL_L_BrowOuter + 400018: GRFL_L_Cheek + 400020: GRFL_L_Eye + 400022: GRFL_L_Foot + 400024: GRFL_L_FootCont1 + 400026: GRFL_L_FootCont2 + 400028: GRFL_L_FootCont3 + 400030: GRFL_L_FootCont4 + 400032: GRFL_L_ForeArm + 400034: GRFL_L_ForeArmTwist + 400036: GRFL_L_Hand + 400038: GRFL_L_HandIndex1 + 400040: GRFL_L_HandIndex2 + 400042: GRFL_L_HandIndex3 + 400044: GRFL_L_HandIndexNub + 400046: GRFL_L_HandMiddle1 + 400048: GRFL_L_HandMiddle2 + 400050: GRFL_L_HandMiddle3 + 400052: GRFL_L_HandMiddleNub + 400054: GRFL_L_HandPinky1 + 400056: GRFL_L_HandPinky2 + 400058: GRFL_L_HandPinky3 + 400060: GRFL_L_HandPinkyNub + 400062: GRFL_L_HandRing1 + 400064: GRFL_L_HandRing2 + 400066: GRFL_L_HandRing3 + 400068: GRFL_L_HandRingNub + 400070: GRFL_L_HandThumb1 + 400072: GRFL_L_HandThumb2 + 400074: GRFL_L_HandThumb3 + 400076: GRFL_L_HandThumbNub + 400078: GRFL_L_Leg + 400080: GRFL_L_LegTwist + 400082: GRFL_L_LipCorner + 400084: GRFL_L_LipLower + 400086: GRFL_L_LipUpper + 400088: GRFL_L_LowerEyelash + 400090: GRFL_L_LowerEyelid + 400092: GRFL_L_Nostril + 400094: GRFL_L_Shoulder + 400096: GRFL_L_ToeBase + 400098: GRFL_L_ToeBaseNub + 400100: GRFL_L_ToetCont1 + 400102: GRFL_L_ToetCont2 + 400104: GRFL_L_UpLeg + 400106: GRFL_L_UpLegTwist + 400108: GRFL_L_UpperEeylash + 400110: GRFL_L_UpperEyelid + 400112: GRFL_L_WeaponHand + 400114: GRFL_L_WeaponUpLeg + 400116: GRFL_LipLower + 400118: GRFL_LipUpper + 400120: GRFL_Neck + 400122: GRFL_Nose + 400124: GRFL_R_Arm + 400126: GRFL_R_ArmTwist + 400128: GRFL_R_BrowInner + 400130: GRFL_R_BrowOuter + 400132: GRFL_R_Cheek + 400134: GRFL_R_Eye + 400136: GRFL_R_Foot + 400138: GRFL_R_FootCont1 + 400140: GRFL_R_FootCont2 + 400142: GRFL_R_FootCont3 + 400144: GRFL_R_FootCont4 + 400146: GRFL_R_ForeArm + 400148: GRFL_R_ForeArmTwist + 400150: GRFL_R_Hand + 400152: GRFL_R_HandIndex1 + 400154: GRFL_R_HandIndex2 + 400156: GRFL_R_HandIndex3 + 400158: GRFL_R_HandIndexNub + 400160: GRFL_R_HandMiddle1 + 400162: GRFL_R_HandMiddle2 + 400164: GRFL_R_HandMiddle3 + 400166: GRFL_R_HandMiddleNub + 400168: GRFL_R_HandPinky1 + 400170: GRFL_R_HandPinky2 + 400172: GRFL_R_HandPinky3 + 400174: GRFL_R_HandPinkyNub + 400176: GRFL_R_HandRing1 + 400178: GRFL_R_HandRing2 + 400180: GRFL_R_HandRing3 + 400182: GRFL_R_HandRingNub + 400184: GRFL_R_HandThumb1 + 400186: GRFL_R_HandThumb2 + 400188: GRFL_R_HandThumb3 + 400190: GRFL_R_HandThumbNub + 400192: GRFL_R_Leg + 400194: GRFL_R_LegTwist + 400196: GRFL_R_LipCorner + 400198: GRFL_R_LipLower + 400200: GRFL_R_LipUpper + 400202: GRFL_R_LowerEyelash + 400204: GRFL_R_LowerEyelid + 400206: GRFL_R_Nostril + 400208: GRFL_R_Shoulder + 400210: GRFL_R_ToeBase + 400212: GRFL_R_ToeBaseNub + 400214: GRFL_R_ToetCont1 + 400216: GRFL_R_ToetCont2 + 400218: GRFL_R_UpLeg + 400220: GRFL_R_UpLegTwist + 400222: GRFL_R_UpperEeylash + 400224: GRFL_R_UpperEyelid + 400226: GRFL_R_WeaponHand + 400228: GRFL_R_WeaponUpLeg + 400230: GRFL_Spine + 400232: GRFL_Spine1 + 400234: GRFL_Spine2 + 400236: GRFL_Tongue + 400238: GRFL_Tongue1 + 400240: GRFL_Tongue2 + 400242: //RootNode + 7400000: GRH_Liza_Blinking_00 + 7400002: GRH_Liza_L_Eye_Opened + 7400004: GRH_Liza_Eyes_Opened + 7400006: GRH_Liza_R_Eye_Opened + 7400008: GRH_Liza_Eyes_Closed + 7400010: GRH_Liza_L_Eye_Closed + 7400012: GRH_Liza_R_Eye_Closed + 7400014: GRH_Liza_Blink_Cycle_00 + 7400016: GRH_Liza_Blinking_1sec + 7400018: GRH_Liza_Blinking_1.5sec + 7400020: GRH_Liza_Blinking_2sec + 7400022: GRH_Liza_Blinking_2.5sec + 7400024: GRH_Liza_Blinking_3sec + 7400026: GRH_Liza_Blinking_3.5sec + 7400028: GRH_Liza_Blinking_4sec + 7400030: GRH_Liza_Blinking_4.5sec + 7400032: GRH_Liza_Blinking_5sec + 9500000: //RootNode + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 0 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: + - serializedVersion: 16 + name: GRH_Liza_Blinking_00 + takeName: Take 001 + firstFrame: 0 + lastFrame: 170 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Eyes_Opened + takeName: Take 001 + firstFrame: 4 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_L_Eye_Opened + takeName: Take 001 + firstFrame: 4 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: 2adae1f33f8a2da40b6fa4d34514d1ef, type: 2} + - serializedVersion: 16 + name: GRH_Liza_R_Eye_Opened + takeName: Take 001 + firstFrame: 4 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: 1c267568420502941a1282251356a42f, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Eyes_Closed + takeName: Take 001 + firstFrame: 14 + lastFrame: 16 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_L_Eye_Closed + takeName: Take 001 + firstFrame: 14 + lastFrame: 16 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: 2adae1f33f8a2da40b6fa4d34514d1ef, type: 2} + - serializedVersion: 16 + name: GRH_Liza_R_Eye_Closed + takeName: Take 001 + firstFrame: 14 + lastFrame: 16 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: 1c267568420502941a1282251356a42f, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blink_Cycle_00 + takeName: Take 001 + firstFrame: 20 + lastFrame: 30 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_1sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 50 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_1.5sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 65 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_2sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 80 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_2.5sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 95 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_3sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 110 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_3.5sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 125 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_4sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 140 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_4.5sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 155 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Blinking_5sec + takeName: Take 001 + firstFrame: 20 + lastFrame: 170 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 1 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: ad1305ba6cfcaa4459c55a08e2cb4cc0, type: 2} + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + splitTangentsAcrossUV: 1 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: + - boneName: GRFL_Hips + humanName: Hips + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_UpLeg + humanName: LeftUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_UpLeg + humanName: RightUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Leg + humanName: LeftLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Leg + humanName: RightLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Foot + humanName: LeftFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Foot + humanName: RightFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Spine1 + humanName: Spine + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Spine2 + humanName: Chest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Neck + humanName: Neck + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Head + humanName: Head + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Shoulder + humanName: LeftShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Shoulder + humanName: RightShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Arm + humanName: LeftUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Arm + humanName: RightUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_ForeArm + humanName: LeftLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_ForeArm + humanName: RightLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Hand + humanName: LeftHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Hand + humanName: RightHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_ToeBase + humanName: LeftToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_ToeBase + humanName: RightToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Eye + humanName: LeftEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Eye + humanName: RightEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb1 + humanName: Left Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb2 + humanName: Left Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb3 + humanName: Left Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex1 + humanName: Left Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex2 + humanName: Left Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex3 + humanName: Left Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle1 + humanName: Left Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle2 + humanName: Left Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle3 + humanName: Left Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing1 + humanName: Left Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing2 + humanName: Left Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing3 + humanName: Left Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky1 + humanName: Left Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky2 + humanName: Left Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky3 + humanName: Left Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb1 + humanName: Right Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb2 + humanName: Right Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb3 + humanName: Right Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex1 + humanName: Right Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex2 + humanName: Right Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex3 + humanName: Right Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle1 + humanName: Right Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle2 + humanName: Right Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle3 + humanName: Right Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing1 + humanName: Right Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing2 + humanName: Right Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing3 + humanName: Right Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky1 + humanName: Right Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky2 + humanName: Right Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky3 + humanName: Right Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + skeleton: + - name: GRH_Liza_Blinking(Clone) + position: {x: 0, y: 0, z: 0} + rotation: {x: -1.33158053e-07, y: 0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Hips + position: {x: 6.99999987e-08, y: .977680087, z: -.0136898803} + rotation: {x: .499992251, y: -.500008643, z: -.499995261, w: .500003874} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpLeg + position: {x: .0054277, y: -.0184652992, z: .0936542526} + rotation: {x: -.000547499978, y: .999999881, z: 4.50182233e-06, w: 3.32648733e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Leg + position: {x: -.44575575, y: 3.0999999e-07, z: 1.05499994e-05} + rotation: {x: 1.3082994e-05, y: -1.14054956e-05, z: .00724643702, w: .999973774} + scale: {x: 1, y: 1, z: .999998987} + transformModified: 1 + - name: GRFL_L_Foot + position: {x: -.437879831, y: -4.75999968e-06, z: 4.94999995e-06} + rotation: {x: -7.3727897e-06, y: 1.90497231e-05, z: -.00668644998, w: .999977648} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont1 + position: {x: -.0886563882, y: .124516055, z: .0468611196} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont2 + position: {x: -.0886563435, y: -.0457840003, z: .046861209} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont3 + position: {x: -.088656269, y: .12451598, z: -.0511388779} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont4 + position: {x: -.0886562318, y: -.0457840376, z: -.0511387922} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToeBase + position: {x: -.078656666, y: .124515928, z: 8.99999975e-07} + rotation: {x: 6.61145241e-05, y: -6.89428707e-05, z: -.707106352, w: .707107186} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToeBaseNub + position: {x: -.051063519, y: -9.00000003e-08, z: -4.19999969e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToetCont1 + position: {x: -.0703999251, y: -.00999072008, z: .0468623787} + rotation: {x: .500061929, y: .49987787, z: .500061929, w: -.499998301} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToetCont2 + position: {x: -.070401907, y: -.0100093195, z: -.0511376448} + rotation: {x: .500061929, y: .49987787, z: .500061929, w: -.499998301} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LegTwist + position: {x: -.218939915, y: -2.46047966e-06, z: 2.53677354e-06} + rotation: {x: -3.74583237e-06, y: 6.33081214e-08, z: -1.39674705e-09, w: 1} + scale: {x: .999999821, y: 1.00000024, z: .99999994} + transformModified: 1 + - name: GRFL_L_UpLegTwist + position: {x: -.2228778, y: 2.5272368e-07, z: 5.02586363e-06} + rotation: {x: 6.50003403e-06, y: -2.29189023e-09, z: 5.52974111e-09, w: 1} + scale: {x: 1.00000024, y: .999999762, z: .999999881} + transformModified: 1 + - name: GRFL_L_WeaponUpLeg + position: {x: -.0882387832, y: -.0690806061, z: -.0922938809} + rotation: {x: .563405216, y: .511973381, z: .42418623, w: -.490432322} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpLeg + position: {x: .00542636961, y: -.0184656493, z: -.093649976} + rotation: {x: -.000547499978, y: .999999881, z: -4.50182233e-06, w: -3.32648733e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Leg + position: {x: -.44575569, y: 4.09999984e-07, z: -2.90999992e-06} + rotation: {x: -1.3082994e-05, y: 1.14054956e-05, z: .00724643702, w: .999973774} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Foot + position: {x: -.437880158, y: -4.53999974e-06, z: 3.23999984e-06} + rotation: {x: 7.3727897e-06, y: -1.90497231e-05, z: -.00668644998, w: .999977648} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont1 + position: {x: -.0886570364, y: .124515876, z: -.0468574688} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont2 + position: {x: -.0886569843, y: -.0457840897, z: -.0468581393} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont3 + position: {x: -.0886554122, y: .124515474, z: .0511425473} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont4 + position: {x: -.0886553451, y: -.0457844883, z: .0511418656} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToeBase + position: {x: -.0786561966, y: .124515735, z: 2.37999984e-06} + rotation: {x: -6.61145241e-05, y: 6.89428707e-05, z: -.707106352, w: .707107186} + scale: {x: .999998987, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToeBaseNub + position: {x: -.0510689206, y: -1.19999996e-07, z: -4.47999992e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: .999998987, z: 1.00000095} + transformModified: 1 + - name: GRFL_R_ToetCont1 + position: {x: -.070400089, y: -.00999180041, z: -.0468617566} + rotation: {x: .500124931, y: .499904811, z: .500124931, w: -.499845207} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToetCont2 + position: {x: -.070400089, y: -.0100088995, z: .0511382371} + rotation: {x: .500124931, y: .499904811, z: .500124931, w: -.499845207} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LegTwist + position: {x: -.218940049, y: -2.2649765e-06, z: 1.67846679e-06} + rotation: {x: 3.7475188e-06, y: -4.02979161e-08, z: -8.3817504e-09, w: 1} + scale: {x: 1.00000012, y: .999999642, z: 1} + transformModified: 1 + - name: GRFL_R_UpLegTwist + position: {x: -.222877577, y: 2.12192532e-07, z: -1.44004821e-06} + rotation: {x: -6.49628737e-06, y: -1.91790939e-08, z: 1.86252058e-09, w: 1} + scale: {x: 1, y: 1.00000048, z: .999999881} + transformModified: 1 + - name: GRFL_R_WeaponUpLeg + position: {x: -.0882377103, y: -.0690808371, z: .092299208} + rotation: {x: -.42418626, y: -.490432173, z: -.563405335, w: .511973381} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine + position: {x: -.0537130684, y: -1.09999995e-07, z: 0} + rotation: {x: -1.49953007e-06, y: 4.00017643e-06, z: -.0001175, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine1 + position: {x: -.102978058, y: 2.20999982e-06, z: 5.80000005e-07} + rotation: {x: 0, y: -0, z: -.0275969971, w: .999619186} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine2 + position: {x: -.11120224, y: -4.09999984e-07, z: 1.19999996e-07} + rotation: {x: -9.97427151e-07, y: -7.16884614e-08, z: .0716884658, w: .997427106} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Shoulder + position: {x: -.262152851, y: -.0135208592, z: .0175698902} + rotation: {x: -.628225923, y: .0417463295, z: .768776059, w: .112128533} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Arm + position: {x: -.142532095, y: 2.43e-06, z: 2.14999977e-06} + rotation: {x: -.0651536882, y: .10150025, z: .0453099608, w: .991665125} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ArmTwist + position: {x: -.137837648, y: -5.60283661e-06, z: -9.30786155e-06} + rotation: {x: -3.64856169e-05, y: -2.83899606e-08, z: -2.25790284e-08, w: 1} + scale: {x: 1.00000012, y: 1, z: .999999881} + transformModified: 1 + - name: GRFL_L_ForeArm + position: {x: -.275676727, y: -1.8499999e-05, z: -1.8570001e-05} + rotation: {x: -7.29987951e-05, y: -2.30038331e-05, z: 5.24983225e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ForeArmTwist + position: {x: -.130735159, y: 6.78539254e-06, z: -2.4414062e-06} + rotation: {x: 2.48327797e-05, y: 2.23531131e-08, z: 4.60882568e-08, w: 1} + scale: {x: 1, y: .999999881, z: 1} + transformModified: 1 + - name: GRFL_L_Hand + position: {x: -.261472285, y: 8.44999977e-06, z: -4.74999979e-06} + rotation: {x: -.704738617, y: -.057397712, z: -.0571566224, w: .704827726} + scale: {x: .999998987, y: 1, z: .999998987} + transformModified: 1 + - name: GRFL_L_HandIndex1 + position: {x: -.095776327, y: -.0151403099, z: -.0346578397} + rotation: {x: 9.56464191e-06, y: 5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandIndex2 + position: {x: -.0343346, y: 1.06999994e-06, z: 9.00000003e-08} + rotation: {x: 0, y: -0, z: -2.20000002e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandIndex3 + position: {x: -.0272727199, y: -5.29999966e-07, z: 5.99999979e-08} + rotation: {x: -5.75000013e-05, y: -6.80000012e-05, z: -3.91000032e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandIndexNub + position: {x: -.0224964898, y: 9.09999983e-07, z: -4.59999995e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999998987, y: 1.00000095, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddle1 + position: {x: -.0964138359, y: -.0195490494, z: -.0124867} + rotation: {x: .000173987937, y: 1.95817938e-05, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandMiddle2 + position: {x: -.0390045568, y: 9.09999983e-07, z: -1.49999991e-07} + rotation: {x: 0, y: -0, z: -1.15000003e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddle3 + position: {x: -.0275521111, y: 0, z: 9.99999941e-08} + rotation: {x: -1.65000001e-05, y: -.000118999997, z: -1.96350003e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddleNub + position: {x: -.0263429992, y: 3.99999976e-07, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .99999702, y: 1.00000298, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinky1 + position: {x: -.0813450962, y: -.0131341899, z: .0287686102} + rotation: {x: 9.56464191e-06, y: 5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandPinky2 + position: {x: -.0261870194, y: 7.59999978e-07, z: -1.59999999e-07} + rotation: {x: -1.70003823e-05, y: -.000152999957, z: -2.50260109e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinky3 + position: {x: -.0207361598, y: 2.99999982e-07, z: -4.9999997e-08} + rotation: {x: .000117000003, y: -.000146999999, z: 1.71990013e-08, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinkyNub + position: {x: -.0242307298, y: 3.0999999e-07, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999997973, y: 1.00000203, z: 1} + transformModified: 1 + - name: GRFL_L_HandRing1 + position: {x: -.0907382146, y: -.0154798096, z: .00950988941} + rotation: {x: 9.96748986e-06, y: 8.0569572e-07, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandRing2 + position: {x: -.0322008096, y: -2.60000002e-06, z: -5.19999958e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandRing3 + position: {x: -.0256997608, y: -1.67999997e-06, z: -3.70000009e-07} + rotation: {x: -8.3000501e-05, y: -6.74993789e-05, z: -7.5056023e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandRingNub + position: {x: -.0251795184, y: -2.32000002e-06, z: 4.11999963e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999998987, y: 1.00000203, z: .999998987} + transformModified: 1 + - name: GRFL_L_HandThumb1 + position: {x: -.02020308, y: .00359573006, z: -.0426593497} + rotation: {x: .373463929, y: -.322897226, z: .210430756, w: .843789637} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumb2 + position: {x: -.0357955508, y: -1.04999992e-06, z: -1.36999995e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00000203, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumb3 + position: {x: -.0304246489, y: -1.89999994e-07, z: -1.21999994e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumbNub + position: {x: -.0317073092, y: -3.99999976e-07, z: -6.09999972e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999997973, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_WeaponHand + position: {x: -.0912700668, y: .00989476964, z: -1.65000006e-06} + rotation: {x: .707105458, y: .70710808, z: -.000160443684, w: -.000114871196} + scale: {x: 1, y: .999997973, z: 1.00000405} + transformModified: 1 + - name: GRFL_Neck + position: {x: -.270938993, y: -3.39999985e-07, z: 3.30000006e-07} + rotation: {x: 1.48831407e-06, y: -1.86872967e-07, z: -.12458197, w: .992209315} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Head + position: {x: -.121566005, y: 5.69999997e-07, z: 1.89999994e-07} + rotation: {x: 3.77128345e-06, y: -3.20584172e-06, z: .0807773992, w: .996732175} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_HeadNub + position: {x: -.156721354, y: -1.19999996e-07, z: 2.86899995e-05} + rotation: {x: -3.50048822e-06, y: 3.49951165e-06, z: .000139500014, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Jaw + position: {x: -.0024800098, y: .0243914202, z: -4.73e-06} + rotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_JawEnd + position: {x: -.0821328238, y: .0395425186, z: 3.80999973e-06} + rotation: {x: 6.36395362e-06, y: -1.41424971e-06, z: .707102835, w: .707110822} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_LipLower + position: {x: -.0822167844, y: -.00128129998, z: 3.44999989e-06} + rotation: {x: 6.47002817e-05, y: 6.47002598e-05, z: .707106709, w: .707106888} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipLower + position: {x: .000612639997, y: -.00284460979, z: .0111090392} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipLower + position: {x: .00061280001, y: -.00284874998, z: -.01110797} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue + position: {x: -.0304686688, y: .0110845398, z: 9.19999991e-07} + rotation: {x: 0, y: 0, z: .116483465, w: .993192673} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue1 + position: {x: -.0200694297, y: 1.49999991e-07, z: 0} + rotation: {x: 0, y: -0, z: -.069369249, w: .997591078} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue2 + position: {x: -.0180615783, y: 1.49999991e-07, z: 1.49999991e-07} + rotation: {x: 0, y: -0, z: -.0400008224, w: .999199629} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_BrowInner + position: {x: -.0830490887, y: .096471101, z: .0135989897} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_BrowOuter + position: {x: -.0883542076, y: .0881281048, z: .0408725962} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Cheek + position: {x: -.028859688, y: .0934227705, z: .0355801694} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Eye + position: {x: -.0675242394, y: .0730532706, z: .0310988799} + rotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipCorner + position: {x: -.00183150999, y: .0965826884, z: .0230260883} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LowerEyelid + position: {x: -.0618235581, y: .088723354, z: .031141039} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LowerEyelash + position: {x: .00237685977, y: .00998187996, z: -4.27999976e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpperEyelid + position: {x: -.0727746412, y: .0889763609, z: .0311018396} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpperEeylash + position: {x: -.00331923994, y: .00914268009, z: -4.11999963e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_LipUpper + position: {x: -.00767929014, y: .113349177, z: -1.91000004e-06} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipUpper + position: {x: .00144195999, y: -.00500203017, z: .0130938692} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipUpper + position: {x: .00144179992, y: -.00500230026, z: -.0130937696} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Nose + position: {x: -.041046463, y: .123948783, z: -2.02000001e-06} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Nostril + position: {x: .00970000029, y: -.0171994604, z: .015002789} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Nostril + position: {x: .00969987921, y: -.0171997491, z: -.01500249} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_BrowInner + position: {x: -.083049193, y: .0964708105, z: -.01360247} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_BrowOuter + position: {x: -.0883541852, y: .0881272778, z: -.0408759005} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Cheek + position: {x: -.028859688, y: .0934220776, z: -.0355835892} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Eye + position: {x: -.0675247237, y: .0730528757, z: -.0310994405} + rotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipCorner + position: {x: -.00183150999, y: .096582219, z: -.0230295788} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LowerEyelid + position: {x: -.0618235767, y: .0887227133, z: -.0311443489} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LowerEyelash + position: {x: .00237747002, y: .00998201035, z: -1.01300002e-05} + rotation: {x: -8.80000298e-05, y: -5.49955985e-06, z: -5.00048418e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpperEyelid + position: {x: -.0727746561, y: .088975735, z: -.0311051607} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpperEeylash + position: {x: -.00331833004, y: .00914276019, z: -8.54999962e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Shoulder + position: {x: -.262152821, y: -.0135208089, z: -.0175733902} + rotation: {x: .628225923, y: -.0417466648, z: .768776, w: .112128943} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Arm + position: {x: -.142526835, y: 1.82999997e-06, z: -1.07999995e-06} + rotation: {x: .0651536882, y: -.10150025, z: .0453099608, w: .991665125} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ArmTwist + position: {x: -.137838468, y: -1.01900096e-05, z: 9.30786155e-06} + rotation: {x: 3.64726584e-05, y: -5.00423631e-08, z: -3.9361332e-09, w: 1} + scale: {x: 1, y: 1, z: 1.00000024} + transformModified: 1 + - name: GRFL_R_ForeArm + position: {x: -.275677025, y: -2.03e-05, z: 1.87699989e-05} + rotation: {x: 7.29987951e-05, y: 2.30038331e-05, z: 5.24983225e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ForeArmTwist + position: {x: -.130735159, y: 3.43799593e-06, z: 2.89916989e-06} + rotation: {x: -2.48420947e-05, y: 2.23489245e-08, z: 2.18793836e-08, w: 1} + scale: {x: .99999994, y: .999999881, z: .999999821} + transformModified: 1 + - name: GRFL_R_Hand + position: {x: -.26147002, y: 6.97999985e-06, z: 4.87999978e-06} + rotation: {x: .704738617, y: .057397712, z: -.0571566224, w: .704827726} + scale: {x: 1, y: 1, z: .999997973} + transformModified: 1 + - name: GRFL_R_HandIndex1 + position: {x: -.0957772136, y: -.0151400398, z: .0346599594} + rotation: {x: -9.56464191e-06, y: -5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandIndex2 + position: {x: -.03433479, y: -1.49999991e-07, z: 1.19999996e-07} + rotation: {x: 2.34000014e-10, y: 5.19999994e-05, z: -4.50000016e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandIndex3 + position: {x: -.02727261, y: -1.49999991e-07, z: -4.9999997e-08} + rotation: {x: 0, y: 6.50000002e-05, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandIndexNub + position: {x: -.0224963389, y: 4.89999991e-07, z: -6.09999972e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .99999702, y: 1.00000298, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddle1 + position: {x: -.0964141861, y: -.0195488594, z: .0124897398} + rotation: {x: -.000173987937, y: -1.95817938e-05, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandMiddle2 + position: {x: -.0390049778, y: 6.09999972e-07, z: -1.09999995e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddle3 + position: {x: -.0275520291, y: 4.59999995e-07, z: -9.99999994e-09} + rotation: {x: 2.99999992e-05, y: -.000127000007, z: 3.81000032e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddleNub + position: {x: -.0263427701, y: 1.09999995e-07, z: -1.49999991e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00001705, y: .999994993, z: .999988019} + transformModified: 1 + - name: GRFL_R_HandPinky1 + position: {x: -.0813494921, y: -.0131344292, z: -.0287625287} + rotation: {x: -9.56464191e-06, y: -5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandPinky2 + position: {x: -.0261873286, y: -2.99999982e-07, z: -9.00000003e-08} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandPinky3 + position: {x: -.0207360797, y: 6.09999972e-07, z: 7.99999995e-08} + rotation: {x: 5.50000004e-05, y: .000142000019, z: -7.81000065e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandPinkyNub + position: {x: -.0242307298, y: -1.29999989e-07, z: 3.0999999e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00000405, y: 1, z: .99999702} + transformModified: 1 + - name: GRFL_R_HandRing1 + position: {x: -.0907426402, y: -.0154802399, z: -.00950896926} + rotation: {x: -9.96748986e-06, y: -8.0569572e-07, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandRing2 + position: {x: -.0322008617, y: -3.20999993e-06, z: -3.79999989e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandRing3 + position: {x: -.0256996099, y: -9.19999991e-07, z: -2.79999995e-07} + rotation: {x: 8.00003982e-05, y: 5.34993997e-05, z: -7.50427989e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandRingNub + position: {x: -.0251793694, y: -2.66999996e-06, z: 4.42999999e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00001597, y: .999996006, z: .999988019} + transformModified: 1 + - name: GRFL_R_HandThumb1 + position: {x: -.0202066395, y: .00359566975, z: .0426644906} + rotation: {x: -.373463929, y: .322897226, z: .210430756, w: .843789637} + scale: {x: .999997973, y: 1.00000203, z: 1.00000203} + transformModified: 1 + - name: GRFL_R_HandThumb2 + position: {x: -.0357957408, y: -7.79999937e-07, z: -1.05999993e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00000405, y: .999998987, z: .99999702} + transformModified: 1 + - name: GRFL_R_HandThumb3 + position: {x: -.0304582585, y: 7.99999995e-08, z: -1.06999994e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandThumbNub + position: {x: -.0317073092, y: -4.89999991e-07, z: -6.09999972e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999997973, y: 1.00000298, z: 1} + transformModified: 1 + - name: GRFL_R_WeaponHand + position: {x: -.0912747234, y: .00989434961, z: -1.19999993e-06} + rotation: {x: .000159099262, y: -.000111015412, z: -.707105219, w: .707108319} + scale: {x: 1, y: .999998987, z: 1.00000501} + transformModified: 1 + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 3 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Viseme.FBX b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Viseme.FBX new file mode 100644 index 0000000..cf60727 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Viseme.FBX differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Viseme.FBX.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Viseme.FBX.meta new file mode 100644 index 0000000..a994c12 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Animations/FacialAnims_Liza/GRH_Liza_Viseme.FBX.meta @@ -0,0 +1,5957 @@ +fileFormatVersion: 2 +guid: d49b211c00542bf489a2a1feec737b06 +timeCreated: 1449415415 +licenseType: Free +ModelImporter: + serializedVersion: 18 + fileIDToRecycleName: + 100000: GRFL_Head + 100002: GRFL_HeadNub + 100004: GRFL_Hips + 100006: GRFL_Jaw + 100008: GRFL_JawEnd + 100010: GRFL_L_Arm + 100012: GRFL_L_ArmTwist + 100014: GRFL_L_BrowInner + 100016: GRFL_L_BrowOuter + 100018: GRFL_L_Cheek + 100020: GRFL_L_Eye + 100022: GRFL_L_Foot + 100024: GRFL_L_FootCont1 + 100026: GRFL_L_FootCont2 + 100028: GRFL_L_FootCont3 + 100030: GRFL_L_FootCont4 + 100032: GRFL_L_ForeArm + 100034: GRFL_L_ForeArmTwist + 100036: GRFL_L_Hand + 100038: GRFL_L_HandIndex1 + 100040: GRFL_L_HandIndex2 + 100042: GRFL_L_HandIndex3 + 100044: GRFL_L_HandIndexNub + 100046: GRFL_L_HandMiddle1 + 100048: GRFL_L_HandMiddle2 + 100050: GRFL_L_HandMiddle3 + 100052: GRFL_L_HandMiddleNub + 100054: GRFL_L_HandPinky1 + 100056: GRFL_L_HandPinky2 + 100058: GRFL_L_HandPinky3 + 100060: GRFL_L_HandPinkyNub + 100062: GRFL_L_HandRing1 + 100064: GRFL_L_HandRing2 + 100066: GRFL_L_HandRing3 + 100068: GRFL_L_HandRingNub + 100070: GRFL_L_HandThumb1 + 100072: GRFL_L_HandThumb2 + 100074: GRFL_L_HandThumb3 + 100076: GRFL_L_HandThumbNub + 100078: GRFL_L_Leg + 100080: GRFL_L_LegTwist + 100082: GRFL_L_LipCorner + 100084: GRFL_L_LipLower + 100086: GRFL_L_LipUpper + 100088: GRFL_L_LowerEyelash + 100090: GRFL_L_LowerEyelid + 100092: GRFL_L_Nostril + 100094: GRFL_L_Shoulder + 100096: GRFL_L_ToeBase + 100098: GRFL_L_ToeBaseNub + 100100: GRFL_L_ToetCont1 + 100102: GRFL_L_ToetCont2 + 100104: GRFL_L_UpLeg + 100106: GRFL_L_UpLegTwist + 100108: GRFL_L_UpperEeylash + 100110: GRFL_L_UpperEyelid + 100112: GRFL_L_WeaponHand + 100114: GRFL_L_WeaponUpLeg + 100116: GRFL_LipLower + 100118: GRFL_LipUpper + 100120: GRFL_Neck + 100122: GRFL_Nose + 100124: GRFL_R_Arm + 100126: GRFL_R_ArmTwist + 100128: GRFL_R_BrowInner + 100130: GRFL_R_BrowOuter + 100132: GRFL_R_Cheek + 100134: GRFL_R_Eye + 100136: GRFL_R_Foot + 100138: GRFL_R_FootCont1 + 100140: GRFL_R_FootCont2 + 100142: GRFL_R_FootCont3 + 100144: GRFL_R_FootCont4 + 100146: GRFL_R_ForeArm + 100148: GRFL_R_ForeArmTwist + 100150: GRFL_R_Hand + 100152: GRFL_R_HandIndex1 + 100154: GRFL_R_HandIndex2 + 100156: GRFL_R_HandIndex3 + 100158: GRFL_R_HandIndexNub + 100160: GRFL_R_HandMiddle1 + 100162: GRFL_R_HandMiddle2 + 100164: GRFL_R_HandMiddle3 + 100166: GRFL_R_HandMiddleNub + 100168: GRFL_R_HandPinky1 + 100170: GRFL_R_HandPinky2 + 100172: GRFL_R_HandPinky3 + 100174: GRFL_R_HandPinkyNub + 100176: GRFL_R_HandRing1 + 100178: GRFL_R_HandRing2 + 100180: GRFL_R_HandRing3 + 100182: GRFL_R_HandRingNub + 100184: GRFL_R_HandThumb1 + 100186: GRFL_R_HandThumb2 + 100188: GRFL_R_HandThumb3 + 100190: GRFL_R_HandThumbNub + 100192: GRFL_R_Leg + 100194: GRFL_R_LegTwist + 100196: GRFL_R_LipCorner + 100198: GRFL_R_LipLower + 100200: GRFL_R_LipUpper + 100202: GRFL_R_LowerEyelash + 100204: GRFL_R_LowerEyelid + 100206: GRFL_R_Nostril + 100208: GRFL_R_Shoulder + 100210: GRFL_R_ToeBase + 100212: GRFL_R_ToeBaseNub + 100214: GRFL_R_ToetCont1 + 100216: GRFL_R_ToetCont2 + 100218: GRFL_R_UpLeg + 100220: GRFL_R_UpLegTwist + 100222: GRFL_R_UpperEeylash + 100224: GRFL_R_UpperEyelid + 100226: GRFL_R_WeaponHand + 100228: GRFL_R_WeaponUpLeg + 100230: GRFL_Spine + 100232: GRFL_Spine1 + 100234: GRFL_Spine2 + 100236: GRFL_Tongue + 100238: GRFL_Tongue1 + 100240: GRFL_Tongue2 + 100242: //RootNode + 400000: GRFL_Head + 400002: GRFL_HeadNub + 400004: GRFL_Hips + 400006: GRFL_Jaw + 400008: GRFL_JawEnd + 400010: GRFL_L_Arm + 400012: GRFL_L_ArmTwist + 400014: GRFL_L_BrowInner + 400016: GRFL_L_BrowOuter + 400018: GRFL_L_Cheek + 400020: GRFL_L_Eye + 400022: GRFL_L_Foot + 400024: GRFL_L_FootCont1 + 400026: GRFL_L_FootCont2 + 400028: GRFL_L_FootCont3 + 400030: GRFL_L_FootCont4 + 400032: GRFL_L_ForeArm + 400034: GRFL_L_ForeArmTwist + 400036: GRFL_L_Hand + 400038: GRFL_L_HandIndex1 + 400040: GRFL_L_HandIndex2 + 400042: GRFL_L_HandIndex3 + 400044: GRFL_L_HandIndexNub + 400046: GRFL_L_HandMiddle1 + 400048: GRFL_L_HandMiddle2 + 400050: GRFL_L_HandMiddle3 + 400052: GRFL_L_HandMiddleNub + 400054: GRFL_L_HandPinky1 + 400056: GRFL_L_HandPinky2 + 400058: GRFL_L_HandPinky3 + 400060: GRFL_L_HandPinkyNub + 400062: GRFL_L_HandRing1 + 400064: GRFL_L_HandRing2 + 400066: GRFL_L_HandRing3 + 400068: GRFL_L_HandRingNub + 400070: GRFL_L_HandThumb1 + 400072: GRFL_L_HandThumb2 + 400074: GRFL_L_HandThumb3 + 400076: GRFL_L_HandThumbNub + 400078: GRFL_L_Leg + 400080: GRFL_L_LegTwist + 400082: GRFL_L_LipCorner + 400084: GRFL_L_LipLower + 400086: GRFL_L_LipUpper + 400088: GRFL_L_LowerEyelash + 400090: GRFL_L_LowerEyelid + 400092: GRFL_L_Nostril + 400094: GRFL_L_Shoulder + 400096: GRFL_L_ToeBase + 400098: GRFL_L_ToeBaseNub + 400100: GRFL_L_ToetCont1 + 400102: GRFL_L_ToetCont2 + 400104: GRFL_L_UpLeg + 400106: GRFL_L_UpLegTwist + 400108: GRFL_L_UpperEeylash + 400110: GRFL_L_UpperEyelid + 400112: GRFL_L_WeaponHand + 400114: GRFL_L_WeaponUpLeg + 400116: GRFL_LipLower + 400118: GRFL_LipUpper + 400120: GRFL_Neck + 400122: GRFL_Nose + 400124: GRFL_R_Arm + 400126: GRFL_R_ArmTwist + 400128: GRFL_R_BrowInner + 400130: GRFL_R_BrowOuter + 400132: GRFL_R_Cheek + 400134: GRFL_R_Eye + 400136: GRFL_R_Foot + 400138: GRFL_R_FootCont1 + 400140: GRFL_R_FootCont2 + 400142: GRFL_R_FootCont3 + 400144: GRFL_R_FootCont4 + 400146: GRFL_R_ForeArm + 400148: GRFL_R_ForeArmTwist + 400150: GRFL_R_Hand + 400152: GRFL_R_HandIndex1 + 400154: GRFL_R_HandIndex2 + 400156: GRFL_R_HandIndex3 + 400158: GRFL_R_HandIndexNub + 400160: GRFL_R_HandMiddle1 + 400162: GRFL_R_HandMiddle2 + 400164: GRFL_R_HandMiddle3 + 400166: GRFL_R_HandMiddleNub + 400168: GRFL_R_HandPinky1 + 400170: GRFL_R_HandPinky2 + 400172: GRFL_R_HandPinky3 + 400174: GRFL_R_HandPinkyNub + 400176: GRFL_R_HandRing1 + 400178: GRFL_R_HandRing2 + 400180: GRFL_R_HandRing3 + 400182: GRFL_R_HandRingNub + 400184: GRFL_R_HandThumb1 + 400186: GRFL_R_HandThumb2 + 400188: GRFL_R_HandThumb3 + 400190: GRFL_R_HandThumbNub + 400192: GRFL_R_Leg + 400194: GRFL_R_LegTwist + 400196: GRFL_R_LipCorner + 400198: GRFL_R_LipLower + 400200: GRFL_R_LipUpper + 400202: GRFL_R_LowerEyelash + 400204: GRFL_R_LowerEyelid + 400206: GRFL_R_Nostril + 400208: GRFL_R_Shoulder + 400210: GRFL_R_ToeBase + 400212: GRFL_R_ToeBaseNub + 400214: GRFL_R_ToetCont1 + 400216: GRFL_R_ToetCont2 + 400218: GRFL_R_UpLeg + 400220: GRFL_R_UpLegTwist + 400222: GRFL_R_UpperEeylash + 400224: GRFL_R_UpperEyelid + 400226: GRFL_R_WeaponHand + 400228: GRFL_R_WeaponUpLeg + 400230: GRFL_Spine + 400232: GRFL_Spine1 + 400234: GRFL_Spine2 + 400236: GRFL_Tongue + 400238: GRFL_Tongue1 + 400240: GRFL_Tongue2 + 400242: //RootNode + 7400000: GRH_Liza_Viseme_All + 7400002: GRH_Liza_NONE + 7400004: GRH_Liza_EE + 7400006: GRH_Liza_Er + 7400008: GRH_Liza_Ih + 7400010: GRH_Liza_Ah + 7400012: GRH_Liza_Oh + 7400014: GRH_Liza_W_OO + 7400016: GRH_Liza_S_Z + 7400018: GRH_Liza_Ch_J + 7400020: GRH_Liza_F_V + 7400022: GRH_Liza_Th + 7400024: GRH_Liza_T_L_D + 7400026: GRH_Liza_B_M_P + 7400028: GRH_Liza_K_G + 7400030: GRH_Liza_N_NG + 7400032: GRH_Liza_R + 9500000: //RootNode + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 0 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: + - serializedVersion: 16 + name: GRH_Liza_Viseme_All + takeName: Take 001 + firstFrame: 0 + lastFrame: 160 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 1 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_NONE + takeName: Take 001 + firstFrame: 4 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_EE + takeName: Take 001 + firstFrame: 14 + lastFrame: 16 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Er + takeName: Take 001 + firstFrame: 24 + lastFrame: 26 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Ih + takeName: Take 001 + firstFrame: 34 + lastFrame: 36 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Ah + takeName: Take 001 + firstFrame: 44 + lastFrame: 46 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Oh + takeName: Take 001 + firstFrame: 54 + lastFrame: 56 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_W_OO + takeName: Take 001 + firstFrame: 64 + lastFrame: 66 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_S_Z + takeName: Take 001 + firstFrame: 74 + lastFrame: 76 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Ch_J + takeName: Take 001 + firstFrame: 84 + lastFrame: 86 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_F_V + takeName: Take 001 + firstFrame: 94 + lastFrame: 96 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_Th + takeName: Take 001 + firstFrame: 104 + lastFrame: 106 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_T_L_D + takeName: Take 001 + firstFrame: 114 + lastFrame: 116 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_B_M_P + takeName: Take 001 + firstFrame: 124 + lastFrame: 126 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_K_G + takeName: Take 001 + firstFrame: 134 + lastFrame: 136 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_N_NG + takeName: Take 001 + firstFrame: 144 + lastFrame: 146 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + - serializedVersion: 16 + name: GRH_Liza_R + takeName: Take 001 + firstFrame: 154 + lastFrame: 156 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: GRFL_Hips + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_Foot/GRFL_L_ToeBase/GRFL_L_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_Leg/GRFL_L_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_L_UpLeg/GRFL_L_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont3 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_FootCont4 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToeBaseNub + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont1 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_Foot/GRFL_R_ToeBase/GRFL_R_ToetCont2 + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_Leg/GRFL_R_LegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_UpLegTwist + weight: 0 + - path: GRFL_Hips/GRFL_R_UpLeg/GRFL_R_WeaponUpLeg + weight: 0 + - path: GRFL_Hips/GRFL_Spine + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandIndex1/GRFL_L_HandIndex2/GRFL_L_HandIndex3/GRFL_L_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandMiddle1/GRFL_L_HandMiddle2/GRFL_L_HandMiddle3/GRFL_L_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandPinky1/GRFL_L_HandPinky2/GRFL_L_HandPinky3/GRFL_L_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandRing1/GRFL_L_HandRing2/GRFL_L_HandRing3/GRFL_L_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_HandThumb1/GRFL_L_HandThumb2/GRFL_L_HandThumb3/GRFL_L_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_L_Shoulder/GRFL_L_Arm/GRFL_L_ForeArm/GRFL_L_Hand/GRFL_L_WeaponHand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_HeadNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_JawEnd + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_L_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_LipLower/GRFL_R_LipLower + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Jaw/GRFL_Tongue/GRFL_Tongue1/GRFL_Tongue2 + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_LowerEyelid/GRFL_L_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_L_UpperEyelid/GRFL_L_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_L_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_LipUpper/GRFL_R_LipUpper + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_L_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_Nose/GRFL_R_Nostril + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowInner + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_BrowOuter + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Cheek + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_Eye + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LipCorner + weight: 1 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_LowerEyelid/GRFL_R_LowerEyelash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_Neck/GRFL_Head/GRFL_R_UpperEyelid/GRFL_R_UpperEeylash + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_ForeArmTwist + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandIndex1/GRFL_R_HandIndex2/GRFL_R_HandIndex3/GRFL_R_HandIndexNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandMiddle1/GRFL_R_HandMiddle2/GRFL_R_HandMiddle3/GRFL_R_HandMiddleNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandPinky1/GRFL_R_HandPinky2/GRFL_R_HandPinky3/GRFL_R_HandPinkyNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandRing1/GRFL_R_HandRing2/GRFL_R_HandRing3/GRFL_R_HandRingNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3 + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_HandThumb1/GRFL_R_HandThumb2/GRFL_R_HandThumb3/GRFL_R_HandThumbNub + weight: 0 + - path: GRFL_Hips/GRFL_Spine/GRFL_Spine1/GRFL_Spine2/GRFL_R_Shoulder/GRFL_R_Arm/GRFL_R_ForeArm/GRFL_R_Hand/GRFL_R_WeaponHand + weight: 0 + maskType: 1 + maskSource: {fileID: 101100000, guid: e0e92d9299ef3384d8966cf5f474361d, type: 2} + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + splitTangentsAcrossUV: 1 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: + - boneName: GRFL_Hips + humanName: Hips + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_UpLeg + humanName: LeftUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_UpLeg + humanName: RightUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Leg + humanName: LeftLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Leg + humanName: RightLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Foot + humanName: LeftFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Foot + humanName: RightFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Spine1 + humanName: Spine + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Spine2 + humanName: Chest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Neck + humanName: Neck + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Head + humanName: Head + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Shoulder + humanName: LeftShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Shoulder + humanName: RightShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Arm + humanName: LeftUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Arm + humanName: RightUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_ForeArm + humanName: LeftLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_ForeArm + humanName: RightLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Hand + humanName: LeftHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Hand + humanName: RightHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_ToeBase + humanName: LeftToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_ToeBase + humanName: RightToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Eye + humanName: LeftEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Eye + humanName: RightEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb1 + humanName: Left Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb2 + humanName: Left Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb3 + humanName: Left Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex1 + humanName: Left Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex2 + humanName: Left Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex3 + humanName: Left Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle1 + humanName: Left Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle2 + humanName: Left Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle3 + humanName: Left Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing1 + humanName: Left Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing2 + humanName: Left Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing3 + humanName: Left Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky1 + humanName: Left Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky2 + humanName: Left Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky3 + humanName: Left Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb1 + humanName: Right Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb2 + humanName: Right Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb3 + humanName: Right Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex1 + humanName: Right Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex2 + humanName: Right Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex3 + humanName: Right Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle1 + humanName: Right Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle2 + humanName: Right Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle3 + humanName: Right Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing1 + humanName: Right Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing2 + humanName: Right Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing3 + humanName: Right Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky1 + humanName: Right Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky2 + humanName: Right Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky3 + humanName: Right Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + skeleton: + - name: GRH_Liza_Viseme(Clone) + position: {x: 0, y: 0, z: 0} + rotation: {x: -1.33158053e-07, y: 0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Hips + position: {x: 6.99999987e-08, y: .977680087, z: -.0136898803} + rotation: {x: .499992251, y: -.500008643, z: -.499995261, w: .500003874} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpLeg + position: {x: .0054277, y: -.0184652992, z: .0936542526} + rotation: {x: -.000547499978, y: .999999881, z: 4.50182233e-06, w: 3.32648733e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Leg + position: {x: -.44575575, y: 3.0999999e-07, z: 1.05499994e-05} + rotation: {x: 1.3082994e-05, y: -1.14054956e-05, z: .00724643702, w: .999973774} + scale: {x: 1, y: 1, z: .999998987} + transformModified: 1 + - name: GRFL_L_Foot + position: {x: -.437879831, y: -4.75999968e-06, z: 4.94999995e-06} + rotation: {x: -7.3727897e-06, y: 1.90497231e-05, z: -.00668644998, w: .999977648} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont1 + position: {x: -.0886563882, y: .124516055, z: .0468611196} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont2 + position: {x: -.0886563435, y: -.0457840003, z: .046861209} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont3 + position: {x: -.088656269, y: .12451598, z: -.0511388779} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont4 + position: {x: -.0886562318, y: -.0457840376, z: -.0511387922} + rotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToeBase + position: {x: -.078656666, y: .124515928, z: 8.99999975e-07} + rotation: {x: 6.61145241e-05, y: -6.89428707e-05, z: -.707106352, w: .707107186} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToeBaseNub + position: {x: -.051063519, y: -9.00000003e-08, z: -4.19999969e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToetCont1 + position: {x: -.0703999251, y: -.00999072008, z: .0468623787} + rotation: {x: .500061929, y: .49987787, z: .500061929, w: -.499998301} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToetCont2 + position: {x: -.070401907, y: -.0100093195, z: -.0511376448} + rotation: {x: .500061929, y: .49987787, z: .500061929, w: -.499998301} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LegTwist + position: {x: -.218939915, y: -2.46047966e-06, z: 2.53677354e-06} + rotation: {x: -3.74583237e-06, y: 6.33081214e-08, z: -1.39674705e-09, w: 1} + scale: {x: .999999821, y: 1.00000024, z: .99999994} + transformModified: 1 + - name: GRFL_L_UpLegTwist + position: {x: -.2228778, y: 2.5272368e-07, z: 5.02586363e-06} + rotation: {x: 6.50003403e-06, y: -2.29189023e-09, z: 5.52974111e-09, w: 1} + scale: {x: 1.00000024, y: .999999762, z: .999999881} + transformModified: 1 + - name: GRFL_L_WeaponUpLeg + position: {x: -.0882387832, y: -.0690806061, z: -.0922938809} + rotation: {x: .563405216, y: .511973381, z: .42418623, w: -.490432322} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpLeg + position: {x: .00542636961, y: -.0184656493, z: -.093649976} + rotation: {x: -.000547499978, y: .999999881, z: -4.50182233e-06, w: -3.32648733e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Leg + position: {x: -.44575569, y: 4.09999984e-07, z: -2.90999992e-06} + rotation: {x: -1.3082994e-05, y: 1.14054956e-05, z: .00724643702, w: .999973774} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Foot + position: {x: -.437880158, y: -4.53999974e-06, z: 3.23999984e-06} + rotation: {x: 7.3727897e-06, y: -1.90497231e-05, z: -.00668644998, w: .999977648} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont1 + position: {x: -.0886570364, y: .124515876, z: -.0468574688} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont2 + position: {x: -.0886569843, y: -.0457840897, z: -.0468581393} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont3 + position: {x: -.0886554122, y: .124515474, z: .0511425473} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont4 + position: {x: -.0886553451, y: -.0457844883, z: .0511418656} + rotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToeBase + position: {x: -.0786561966, y: .124515735, z: 2.37999984e-06} + rotation: {x: -6.61145241e-05, y: 6.89428707e-05, z: -.707106352, w: .707107186} + scale: {x: .999998987, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToeBaseNub + position: {x: -.0510689206, y: -1.19999996e-07, z: -4.47999992e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: .999998987, z: 1.00000095} + transformModified: 1 + - name: GRFL_R_ToetCont1 + position: {x: -.070400089, y: -.00999180041, z: -.0468617566} + rotation: {x: .500124931, y: .499904811, z: .500124931, w: -.499845207} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToetCont2 + position: {x: -.070400089, y: -.0100088995, z: .0511382371} + rotation: {x: .500124931, y: .499904811, z: .500124931, w: -.499845207} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LegTwist + position: {x: -.218940049, y: -2.2649765e-06, z: 1.67846679e-06} + rotation: {x: 3.7475188e-06, y: -4.02979161e-08, z: -8.3817504e-09, w: 1} + scale: {x: 1.00000012, y: .999999642, z: 1} + transformModified: 1 + - name: GRFL_R_UpLegTwist + position: {x: -.222877577, y: 2.12192532e-07, z: -1.44004821e-06} + rotation: {x: -6.49628737e-06, y: -1.91790939e-08, z: 1.86252058e-09, w: 1} + scale: {x: 1, y: 1.00000048, z: .999999881} + transformModified: 1 + - name: GRFL_R_WeaponUpLeg + position: {x: -.0882377103, y: -.0690808371, z: .092299208} + rotation: {x: -.42418626, y: -.490432173, z: -.563405335, w: .511973381} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine + position: {x: -.0537130684, y: -1.09999995e-07, z: 0} + rotation: {x: -1.49953007e-06, y: 4.00017643e-06, z: -.0001175, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine1 + position: {x: -.102978058, y: 2.20999982e-06, z: 5.80000005e-07} + rotation: {x: 0, y: -0, z: -.0275969971, w: .999619186} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine2 + position: {x: -.11120224, y: -4.09999984e-07, z: 1.19999996e-07} + rotation: {x: -9.97427151e-07, y: -7.16884614e-08, z: .0716884658, w: .997427106} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Shoulder + position: {x: -.262152851, y: -.0135208592, z: .0175698902} + rotation: {x: -.628225923, y: .0417463295, z: .768776059, w: .112128533} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Arm + position: {x: -.142532095, y: 2.43e-06, z: 2.14999977e-06} + rotation: {x: -.0651536882, y: .10150025, z: .0453099608, w: .991665125} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ArmTwist + position: {x: -.137837648, y: -5.60283661e-06, z: -9.30786155e-06} + rotation: {x: -3.64856169e-05, y: -2.83899606e-08, z: -2.25790284e-08, w: 1} + scale: {x: 1.00000012, y: 1, z: .999999881} + transformModified: 1 + - name: GRFL_L_ForeArm + position: {x: -.275676727, y: -1.8499999e-05, z: -1.8570001e-05} + rotation: {x: -7.29987951e-05, y: -2.30038331e-05, z: 5.24983225e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ForeArmTwist + position: {x: -.130735159, y: 6.78539254e-06, z: -2.4414062e-06} + rotation: {x: 2.48327797e-05, y: 2.23531131e-08, z: 4.60882568e-08, w: 1} + scale: {x: 1, y: .999999881, z: 1} + transformModified: 1 + - name: GRFL_L_Hand + position: {x: -.261472285, y: 8.44999977e-06, z: -4.74999979e-06} + rotation: {x: -.704738617, y: -.057397712, z: -.0571566224, w: .704827726} + scale: {x: .999998987, y: 1, z: .999998987} + transformModified: 1 + - name: GRFL_L_HandIndex1 + position: {x: -.095776327, y: -.0151403099, z: -.0346578397} + rotation: {x: 9.56464191e-06, y: 5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandIndex2 + position: {x: -.0343346, y: 1.06999994e-06, z: 9.00000003e-08} + rotation: {x: 0, y: -0, z: -2.20000002e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandIndex3 + position: {x: -.0272727199, y: -5.29999966e-07, z: 5.99999979e-08} + rotation: {x: -5.75000013e-05, y: -6.80000012e-05, z: -3.91000032e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandIndexNub + position: {x: -.0224964898, y: 9.09999983e-07, z: -4.59999995e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999998987, y: 1.00000095, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddle1 + position: {x: -.0964138359, y: -.0195490494, z: -.0124867} + rotation: {x: .000173987937, y: 1.95817938e-05, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandMiddle2 + position: {x: -.0390045568, y: 9.09999983e-07, z: -1.49999991e-07} + rotation: {x: 0, y: -0, z: -1.15000003e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddle3 + position: {x: -.0275521111, y: 0, z: 9.99999941e-08} + rotation: {x: -1.65000001e-05, y: -.000118999997, z: -1.96350003e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddleNub + position: {x: -.0263429992, y: 3.99999976e-07, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .99999702, y: 1.00000298, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinky1 + position: {x: -.0813450962, y: -.0131341899, z: .0287686102} + rotation: {x: 9.56464191e-06, y: 5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandPinky2 + position: {x: -.0261870194, y: 7.59999978e-07, z: -1.59999999e-07} + rotation: {x: -1.70003823e-05, y: -.000152999957, z: -2.50260109e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinky3 + position: {x: -.0207361598, y: 2.99999982e-07, z: -4.9999997e-08} + rotation: {x: .000117000003, y: -.000146999999, z: 1.71990013e-08, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinkyNub + position: {x: -.0242307298, y: 3.0999999e-07, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999997973, y: 1.00000203, z: 1} + transformModified: 1 + - name: GRFL_L_HandRing1 + position: {x: -.0907382146, y: -.0154798096, z: .00950988941} + rotation: {x: 9.96748986e-06, y: 8.0569572e-07, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_HandRing2 + position: {x: -.0322008096, y: -2.60000002e-06, z: -5.19999958e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandRing3 + position: {x: -.0256997608, y: -1.67999997e-06, z: -3.70000009e-07} + rotation: {x: -8.3000501e-05, y: -6.74993789e-05, z: -7.5056023e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandRingNub + position: {x: -.0251795184, y: -2.32000002e-06, z: 4.11999963e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999998987, y: 1.00000203, z: .999998987} + transformModified: 1 + - name: GRFL_L_HandThumb1 + position: {x: -.02020308, y: .00359573006, z: -.0426593497} + rotation: {x: .373463929, y: -.322897226, z: .210430756, w: .843789637} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumb2 + position: {x: -.0357955508, y: -1.04999992e-06, z: -1.36999995e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00000203, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumb3 + position: {x: -.0304246489, y: -1.89999994e-07, z: -1.21999994e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumbNub + position: {x: -.0317073092, y: -3.99999976e-07, z: -6.09999972e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999997973, y: 1, z: 1.00000203} + transformModified: 1 + - name: GRFL_L_WeaponHand + position: {x: -.0912700668, y: .00989476964, z: -1.65000006e-06} + rotation: {x: .707105458, y: .70710808, z: -.000160443684, w: -.000114871196} + scale: {x: 1, y: .999997973, z: 1.00000405} + transformModified: 1 + - name: GRFL_Neck + position: {x: -.270938993, y: -3.39999985e-07, z: 3.30000006e-07} + rotation: {x: 1.48831407e-06, y: -1.86872967e-07, z: -.12458197, w: .992209315} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Head + position: {x: -.121566005, y: 5.69999997e-07, z: 1.89999994e-07} + rotation: {x: 3.77128345e-06, y: -3.20584172e-06, z: .0807773992, w: .996732175} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_HeadNub + position: {x: -.156721354, y: -1.19999996e-07, z: 2.86899995e-05} + rotation: {x: -3.50048822e-06, y: 3.49951165e-06, z: .000139500014, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Jaw + position: {x: -.0024800098, y: .0243914202, z: -4.73e-06} + rotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_JawEnd + position: {x: -.0821328238, y: .0395425186, z: 3.80999973e-06} + rotation: {x: 6.36395362e-06, y: -1.41424971e-06, z: .707102835, w: .707110822} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_LipLower + position: {x: -.0822167844, y: -.00128129998, z: 3.44999989e-06} + rotation: {x: 6.47002817e-05, y: 6.47002598e-05, z: .707106709, w: .707106888} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipLower + position: {x: .000612639997, y: -.00284460979, z: .0111090392} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipLower + position: {x: .00061280001, y: -.00284874998, z: -.01110797} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue + position: {x: -.0304686688, y: .0110845398, z: 9.19999991e-07} + rotation: {x: 0, y: 0, z: .116483465, w: .993192673} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue1 + position: {x: -.0200694297, y: 1.49999991e-07, z: 0} + rotation: {x: 0, y: -0, z: -.069369249, w: .997591078} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue2 + position: {x: -.0180615783, y: 1.49999991e-07, z: 1.49999991e-07} + rotation: {x: 0, y: -0, z: -.0400008224, w: .999199629} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_BrowInner + position: {x: -.0830490887, y: .096471101, z: .0135989897} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_BrowOuter + position: {x: -.0883542076, y: .0881281048, z: .0408725962} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Cheek + position: {x: -.028859688, y: .0934227705, z: .0355801694} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Eye + position: {x: -.0675242394, y: .0730532706, z: .0310988799} + rotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipCorner + position: {x: -.00183150999, y: .0965826884, z: .0230260883} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LowerEyelid + position: {x: -.0618235581, y: .088723354, z: .031141039} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LowerEyelash + position: {x: .00237685977, y: .00998187996, z: -4.27999976e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpperEyelid + position: {x: -.0727746412, y: .0889763609, z: .0311018396} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpperEeylash + position: {x: -.00331923994, y: .00914268009, z: -4.11999963e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_LipUpper + position: {x: -.00767929014, y: .113349177, z: -1.91000004e-06} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipUpper + position: {x: .00144195999, y: -.00500203017, z: .0130938692} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipUpper + position: {x: .00144179992, y: -.00500230026, z: -.0130937696} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Nose + position: {x: -.041046463, y: .123948783, z: -2.02000001e-06} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Nostril + position: {x: .00970000029, y: -.0171994604, z: .015002789} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Nostril + position: {x: .00969987921, y: -.0171997491, z: -.01500249} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_BrowInner + position: {x: -.083049193, y: .0964708105, z: -.01360247} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_BrowOuter + position: {x: -.0883541852, y: .0881272778, z: -.0408759005} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Cheek + position: {x: -.028859688, y: .0934220776, z: -.0355835892} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Eye + position: {x: -.0675247237, y: .0730528757, z: -.0310994405} + rotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipCorner + position: {x: -.00183150999, y: .096582219, z: -.0230295788} + rotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LowerEyelid + position: {x: -.0618235767, y: .0887227133, z: -.0311443489} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LowerEyelash + position: {x: .00237747002, y: .00998201035, z: -1.01300002e-05} + rotation: {x: -8.80000298e-05, y: -5.49955985e-06, z: -5.00048418e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpperEyelid + position: {x: -.0727746561, y: .088975735, z: -.0311051607} + rotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpperEeylash + position: {x: -.00331833004, y: .00914276019, z: -8.54999962e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Shoulder + position: {x: -.262152821, y: -.0135208089, z: -.0175733902} + rotation: {x: .628225923, y: -.0417466648, z: .768776, w: .112128943} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Arm + position: {x: -.142526835, y: 1.82999997e-06, z: -1.07999995e-06} + rotation: {x: .0651536882, y: -.10150025, z: .0453099608, w: .991665125} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ArmTwist + position: {x: -.137838468, y: -1.01900096e-05, z: 9.30786155e-06} + rotation: {x: 3.64726584e-05, y: -5.00423631e-08, z: -3.9361332e-09, w: 1} + scale: {x: 1, y: 1, z: 1.00000024} + transformModified: 1 + - name: GRFL_R_ForeArm + position: {x: -.275677025, y: -2.03e-05, z: 1.87699989e-05} + rotation: {x: 7.29987951e-05, y: 2.30038331e-05, z: 5.24983225e-05, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ForeArmTwist + position: {x: -.130735159, y: 3.43799593e-06, z: 2.89916989e-06} + rotation: {x: -2.48420947e-05, y: 2.23489245e-08, z: 2.18793836e-08, w: 1} + scale: {x: .99999994, y: .999999881, z: .999999821} + transformModified: 1 + - name: GRFL_R_Hand + position: {x: -.26147002, y: 6.97999985e-06, z: 4.87999978e-06} + rotation: {x: .704738617, y: .057397712, z: -.0571566224, w: .704827726} + scale: {x: 1, y: 1, z: .999997973} + transformModified: 1 + - name: GRFL_R_HandIndex1 + position: {x: -.0957772136, y: -.0151400398, z: .0346599594} + rotation: {x: -9.56464191e-06, y: -5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandIndex2 + position: {x: -.03433479, y: -1.49999991e-07, z: 1.19999996e-07} + rotation: {x: 2.34000014e-10, y: 5.19999994e-05, z: -4.50000016e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandIndex3 + position: {x: -.02727261, y: -1.49999991e-07, z: -4.9999997e-08} + rotation: {x: 0, y: 6.50000002e-05, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandIndexNub + position: {x: -.0224963389, y: 4.89999991e-07, z: -6.09999972e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .99999702, y: 1.00000298, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddle1 + position: {x: -.0964141861, y: -.0195488594, z: .0124897398} + rotation: {x: -.000173987937, y: -1.95817938e-05, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandMiddle2 + position: {x: -.0390049778, y: 6.09999972e-07, z: -1.09999995e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddle3 + position: {x: -.0275520291, y: 4.59999995e-07, z: -9.99999994e-09} + rotation: {x: 2.99999992e-05, y: -.000127000007, z: 3.81000032e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddleNub + position: {x: -.0263427701, y: 1.09999995e-07, z: -1.49999991e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00001705, y: .999994993, z: .999988019} + transformModified: 1 + - name: GRFL_R_HandPinky1 + position: {x: -.0813494921, y: -.0131344292, z: -.0287625287} + rotation: {x: -9.56464191e-06, y: -5.78944082e-06, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandPinky2 + position: {x: -.0261873286, y: -2.99999982e-07, z: -9.00000003e-08} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandPinky3 + position: {x: -.0207360797, y: 6.09999972e-07, z: 7.99999995e-08} + rotation: {x: 5.50000004e-05, y: .000142000019, z: -7.81000065e-09, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandPinkyNub + position: {x: -.0242307298, y: -1.29999989e-07, z: 3.0999999e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00000405, y: 1, z: .99999702} + transformModified: 1 + - name: GRFL_R_HandRing1 + position: {x: -.0907426402, y: -.0154802399, z: -.00950896926} + rotation: {x: -9.96748986e-06, y: -8.0569572e-07, z: .0805695727, w: .996748984} + scale: {x: 1, y: 1, z: 1.00000405} + transformModified: 1 + - name: GRFL_R_HandRing2 + position: {x: -.0322008617, y: -3.20999993e-06, z: -3.79999989e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandRing3 + position: {x: -.0256996099, y: -9.19999991e-07, z: -2.79999995e-07} + rotation: {x: 8.00003982e-05, y: 5.34993997e-05, z: -7.50427989e-06, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandRingNub + position: {x: -.0251793694, y: -2.66999996e-06, z: 4.42999999e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00001597, y: .999996006, z: .999988019} + transformModified: 1 + - name: GRFL_R_HandThumb1 + position: {x: -.0202066395, y: .00359566975, z: .0426644906} + rotation: {x: -.373463929, y: .322897226, z: .210430756, w: .843789637} + scale: {x: .999997973, y: 1.00000203, z: 1.00000203} + transformModified: 1 + - name: GRFL_R_HandThumb2 + position: {x: -.0357957408, y: -7.79999937e-07, z: -1.05999993e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.00000405, y: .999998987, z: .99999702} + transformModified: 1 + - name: GRFL_R_HandThumb3 + position: {x: -.0304582585, y: 7.99999995e-08, z: -1.06999994e-06} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandThumbNub + position: {x: -.0317073092, y: -4.89999991e-07, z: -6.09999972e-07} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: .999997973, y: 1.00000298, z: 1} + transformModified: 1 + - name: GRFL_R_WeaponHand + position: {x: -.0912747234, y: .00989434961, z: -1.19999993e-06} + rotation: {x: .000159099262, y: -.000111015412, z: -.707105219, w: .707108319} + scale: {x: 1, y: .999998987, z: 1.00000501} + transformModified: 1 + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 3 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models.meta new file mode 100644 index 0000000..f3e4648 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 11de4f5e604022c48932bcb3d159b2b1 +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/GRFL_Head_Liza.FBX b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/GRFL_Head_Liza.FBX new file mode 100644 index 0000000..2e56a8b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/GRFL_Head_Liza.FBX differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/GRFL_Head_Liza.FBX.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/GRFL_Head_Liza.FBX.meta new file mode 100644 index 0000000..5dcd75f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/GRFL_Head_Liza.FBX.meta @@ -0,0 +1,1419 @@ +fileFormatVersion: 2 +guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2 +timeCreated: 1457966463 +licenseType: Free +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: GRFL_Head + 100002: GRFL_Head_Liza + 100004: //RootNode + 100006: GRFL_HeadNub + 100008: GRFL_Hips + 100010: GRFL_Jaw + 100012: GRFL_JawEnd + 100014: GRFL_L_Arm + 100016: GRFL_L_ArmTwist + 100018: GRFL_L_BrowInner + 100020: GRFL_L_BrowOuter + 100022: GRFL_L_Cheek + 100024: GRFL_L_Eye + 100026: GRFL_L_Foot + 100028: GRFL_L_FootCont1 + 100030: GRFL_L_FootCont2 + 100032: GRFL_L_FootCont3 + 100034: GRFL_L_FootCont4 + 100036: GRFL_L_ForeArm + 100038: GRFL_L_ForeArmTwist + 100040: GRFL_L_Hand + 100042: GRFL_L_HandIndex1 + 100044: GRFL_L_HandIndex2 + 100046: GRFL_L_HandIndex3 + 100048: GRFL_L_HandIndexNub + 100050: GRFL_L_HandMiddle1 + 100052: GRFL_L_HandMiddle2 + 100054: GRFL_L_HandMiddle3 + 100056: GRFL_L_HandMiddleNub + 100058: GRFL_L_HandPinky1 + 100060: GRFL_L_HandPinky2 + 100062: GRFL_L_HandPinky3 + 100064: GRFL_L_HandPinkyNub + 100066: GRFL_L_HandRing1 + 100068: GRFL_L_HandRing2 + 100070: GRFL_L_HandRing3 + 100072: GRFL_L_HandRingNub + 100074: GRFL_L_HandThumb1 + 100076: GRFL_L_HandThumb2 + 100078: GRFL_L_HandThumb3 + 100080: GRFL_L_HandThumbNub + 100082: GRFL_L_Leg + 100084: GRFL_L_LegTwist + 100086: GRFL_L_LipCorner + 100088: GRFL_L_LipLower + 100090: GRFL_L_LipUpper + 100092: GRFL_L_LowerEyelash + 100094: GRFL_L_LowerEyelid + 100096: GRFL_L_Nostril + 100098: GRFL_L_Shoulder + 100100: GRFL_L_ToeBase + 100102: GRFL_L_ToeBaseNub + 100104: GRFL_L_ToetCont1 + 100106: GRFL_L_ToetCont2 + 100108: GRFL_L_UpLeg + 100110: GRFL_L_UpLegTwist + 100112: GRFL_L_UpperEeylash + 100114: GRFL_L_UpperEyelid + 100116: GRFL_L_WeaponHand + 100118: GRFL_L_WeaponUpLeg + 100120: GRFL_LipLower + 100122: GRFL_LipUpper + 100124: GRFL_Neck + 100126: GRFL_Nose + 100128: GRFL_R_Arm + 100130: GRFL_R_ArmTwist + 100132: GRFL_R_BrowInner + 100134: GRFL_R_BrowOuter + 100136: GRFL_R_Cheek + 100138: GRFL_R_Eye + 100140: GRFL_R_Foot + 100142: GRFL_R_FootCont1 + 100144: GRFL_R_FootCont2 + 100146: GRFL_R_FootCont3 + 100148: GRFL_R_FootCont4 + 100150: GRFL_R_ForeArm + 100152: GRFL_R_ForeArmTwist + 100154: GRFL_R_Hand + 100156: GRFL_R_HandIndex1 + 100158: GRFL_R_HandIndex2 + 100160: GRFL_R_HandIndex3 + 100162: GRFL_R_HandIndexNub + 100164: GRFL_R_HandMiddle1 + 100166: GRFL_R_HandMiddle2 + 100168: GRFL_R_HandMiddle3 + 100170: GRFL_R_HandMiddleNub + 100172: GRFL_R_HandPinky1 + 100174: GRFL_R_HandPinky2 + 100176: GRFL_R_HandPinky3 + 100178: GRFL_R_HandPinkyNub + 100180: GRFL_R_HandRing1 + 100182: GRFL_R_HandRing2 + 100184: GRFL_R_HandRing3 + 100186: GRFL_R_HandRingNub + 100188: GRFL_R_HandThumb1 + 100190: GRFL_R_HandThumb2 + 100192: GRFL_R_HandThumb3 + 100194: GRFL_R_HandThumbNub + 100196: GRFL_R_Leg + 100198: GRFL_R_LegTwist + 100200: GRFL_R_LipCorner + 100202: GRFL_R_LipLower + 100204: GRFL_R_LipUpper + 100206: GRFL_R_LowerEyelash + 100208: GRFL_R_LowerEyelid + 100210: GRFL_R_Nostril + 100212: GRFL_R_Shoulder + 100214: GRFL_R_ToeBase + 100216: GRFL_R_ToeBaseNub + 100218: GRFL_R_ToetCont1 + 100220: GRFL_R_ToetCont2 + 100222: GRFL_R_UpLeg + 100224: GRFL_R_UpLegTwist + 100226: GRFL_R_UpperEeylash + 100228: GRFL_R_UpperEyelid + 100230: GRFL_R_WeaponHand + 100232: GRFL_R_WeaponUpLeg + 100234: GRFL_Spine + 100236: GRFL_Spine1 + 100238: GRFL_Spine2 + 100240: GRFL_Tongue + 100242: GRFL_Tongue1 + 100244: GRFL_Tongue2 + 100246: GRH_DownTeeth_Liza + 100248: GRH_EyeLashes_Liza + 100250: GRH_LEye_Liza + 100252: GRH_REye_Liza + 100254: GRH_Tongue_Liza + 100256: GRH_UpperTeeth_Liza + 400000: GRFL_Head + 400002: GRFL_Head_Liza + 400004: //RootNode + 400006: GRFL_HeadNub + 400008: GRFL_Hips + 400010: GRFL_Jaw + 400012: GRFL_JawEnd + 400014: GRFL_L_Arm + 400016: GRFL_L_ArmTwist + 400018: GRFL_L_BrowInner + 400020: GRFL_L_BrowOuter + 400022: GRFL_L_Cheek + 400024: GRFL_L_Eye + 400026: GRFL_L_Foot + 400028: GRFL_L_FootCont1 + 400030: GRFL_L_FootCont2 + 400032: GRFL_L_FootCont3 + 400034: GRFL_L_FootCont4 + 400036: GRFL_L_ForeArm + 400038: GRFL_L_ForeArmTwist + 400040: GRFL_L_Hand + 400042: GRFL_L_HandIndex1 + 400044: GRFL_L_HandIndex2 + 400046: GRFL_L_HandIndex3 + 400048: GRFL_L_HandIndexNub + 400050: GRFL_L_HandMiddle1 + 400052: GRFL_L_HandMiddle2 + 400054: GRFL_L_HandMiddle3 + 400056: GRFL_L_HandMiddleNub + 400058: GRFL_L_HandPinky1 + 400060: GRFL_L_HandPinky2 + 400062: GRFL_L_HandPinky3 + 400064: GRFL_L_HandPinkyNub + 400066: GRFL_L_HandRing1 + 400068: GRFL_L_HandRing2 + 400070: GRFL_L_HandRing3 + 400072: GRFL_L_HandRingNub + 400074: GRFL_L_HandThumb1 + 400076: GRFL_L_HandThumb2 + 400078: GRFL_L_HandThumb3 + 400080: GRFL_L_HandThumbNub + 400082: GRFL_L_Leg + 400084: GRFL_L_LegTwist + 400086: GRFL_L_LipCorner + 400088: GRFL_L_LipLower + 400090: GRFL_L_LipUpper + 400092: GRFL_L_LowerEyelash + 400094: GRFL_L_LowerEyelid + 400096: GRFL_L_Nostril + 400098: GRFL_L_Shoulder + 400100: GRFL_L_ToeBase + 400102: GRFL_L_ToeBaseNub + 400104: GRFL_L_ToetCont1 + 400106: GRFL_L_ToetCont2 + 400108: GRFL_L_UpLeg + 400110: GRFL_L_UpLegTwist + 400112: GRFL_L_UpperEeylash + 400114: GRFL_L_UpperEyelid + 400116: GRFL_L_WeaponHand + 400118: GRFL_L_WeaponUpLeg + 400120: GRFL_LipLower + 400122: GRFL_LipUpper + 400124: GRFL_Neck + 400126: GRFL_Nose + 400128: GRFL_R_Arm + 400130: GRFL_R_ArmTwist + 400132: GRFL_R_BrowInner + 400134: GRFL_R_BrowOuter + 400136: GRFL_R_Cheek + 400138: GRFL_R_Eye + 400140: GRFL_R_Foot + 400142: GRFL_R_FootCont1 + 400144: GRFL_R_FootCont2 + 400146: GRFL_R_FootCont3 + 400148: GRFL_R_FootCont4 + 400150: GRFL_R_ForeArm + 400152: GRFL_R_ForeArmTwist + 400154: GRFL_R_Hand + 400156: GRFL_R_HandIndex1 + 400158: GRFL_R_HandIndex2 + 400160: GRFL_R_HandIndex3 + 400162: GRFL_R_HandIndexNub + 400164: GRFL_R_HandMiddle1 + 400166: GRFL_R_HandMiddle2 + 400168: GRFL_R_HandMiddle3 + 400170: GRFL_R_HandMiddleNub + 400172: GRFL_R_HandPinky1 + 400174: GRFL_R_HandPinky2 + 400176: GRFL_R_HandPinky3 + 400178: GRFL_R_HandPinkyNub + 400180: GRFL_R_HandRing1 + 400182: GRFL_R_HandRing2 + 400184: GRFL_R_HandRing3 + 400186: GRFL_R_HandRingNub + 400188: GRFL_R_HandThumb1 + 400190: GRFL_R_HandThumb2 + 400192: GRFL_R_HandThumb3 + 400194: GRFL_R_HandThumbNub + 400196: GRFL_R_Leg + 400198: GRFL_R_LegTwist + 400200: GRFL_R_LipCorner + 400202: GRFL_R_LipLower + 400204: GRFL_R_LipUpper + 400206: GRFL_R_LowerEyelash + 400208: GRFL_R_LowerEyelid + 400210: GRFL_R_Nostril + 400212: GRFL_R_Shoulder + 400214: GRFL_R_ToeBase + 400216: GRFL_R_ToeBaseNub + 400218: GRFL_R_ToetCont1 + 400220: GRFL_R_ToetCont2 + 400222: GRFL_R_UpLeg + 400224: GRFL_R_UpLegTwist + 400226: GRFL_R_UpperEeylash + 400228: GRFL_R_UpperEyelid + 400230: GRFL_R_WeaponHand + 400232: GRFL_R_WeaponUpLeg + 400234: GRFL_Spine + 400236: GRFL_Spine1 + 400238: GRFL_Spine2 + 400240: GRFL_Tongue + 400242: GRFL_Tongue1 + 400244: GRFL_Tongue2 + 400246: GRH_DownTeeth_Liza + 400248: GRH_EyeLashes_Liza + 400250: GRH_LEye_Liza + 400252: GRH_REye_Liza + 400254: GRH_Tongue_Liza + 400256: GRH_UpperTeeth_Liza + 4300000: GRH_EyeLashes_Liza + 4300002: GRH_UpperTeeth_Liza + 4300004: GRH_LEye_Liza + 4300006: GRH_DownTeeth_Liza + 4300008: GRH_Tongue_Liza + 4300010: GRH_REye_Liza + 4300012: GRFL_Head_Liza + 7400000: Take 001 + 9500000: //RootNode + 13700000: GRFL_Head_Liza + 13700002: GRH_DownTeeth_Liza + 13700004: GRH_EyeLashes_Liza + 13700006: GRH_LEye_Liza + 13700008: GRH_REye_Liza + 13700010: GRH_Tongue_Liza + 13700012: GRH_UpperTeeth_Liza + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleRotations: 1 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 3 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + importAnimation: 0 + copyAvatar: 0 + humanDescription: + human: + - boneName: GRFL_Hips + humanName: Hips + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Spine1 + humanName: Spine + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Spine2 + humanName: Chest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Neck + humanName: Neck + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_Head + humanName: Head + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Arm + humanName: LeftUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Arm + humanName: RightUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_ForeArm + humanName: RightLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Eye + humanName: LeftEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Eye + humanName: RightEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Shoulder + humanName: LeftShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_ForeArm + humanName: LeftLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Hand + humanName: LeftHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Shoulder + humanName: RightShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Hand + humanName: RightHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_UpLeg + humanName: LeftUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Leg + humanName: LeftLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_Foot + humanName: LeftFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_ToeBase + humanName: LeftToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_UpLeg + humanName: RightUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Leg + humanName: RightLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_Foot + humanName: RightFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_ToeBase + humanName: RightToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb1 + humanName: Left Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb2 + humanName: Left Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandThumb3 + humanName: Left Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex1 + humanName: Left Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex2 + humanName: Left Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandIndex3 + humanName: Left Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle1 + humanName: Left Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle2 + humanName: Left Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandMiddle3 + humanName: Left Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing1 + humanName: Left Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing2 + humanName: Left Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandRing3 + humanName: Left Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky1 + humanName: Left Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky2 + humanName: Left Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_L_HandPinky3 + humanName: Left Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb1 + humanName: Right Thumb Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb2 + humanName: Right Thumb Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandThumb3 + humanName: Right Thumb Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex1 + humanName: Right Index Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex2 + humanName: Right Index Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandIndex3 + humanName: Right Index Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle1 + humanName: Right Middle Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle2 + humanName: Right Middle Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandMiddle3 + humanName: Right Middle Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing1 + humanName: Right Ring Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing2 + humanName: Right Ring Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandRing3 + humanName: Right Ring Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky1 + humanName: Right Little Proximal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky2 + humanName: Right Little Intermediate + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: GRFL_R_HandPinky3 + humanName: Right Little Distal + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + skeleton: + - name: GRFL_Head_Liza(Clone) + position: {x: 0, y: 0, z: 0} + rotation: {x: -0.00000013315805, y: 0, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Head_Liza + position: {x: 0.00000003, y: 0, z: 0} + rotation: {x: -0.70710665, y: 0, z: -0, w: 0.7071069} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Hips + position: {x: 0.00000007, y: 0.9776801, z: -0.01368988} + rotation: {x: 0.49999225, y: -0.50000864, z: -0.49999526, w: 0.5000039} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpLeg + position: {x: 0.0054277, y: -0.0184653, z: 0.09365425} + rotation: {x: -0.0005475, y: 0.9999999, z: 0.0000045018223, w: 0.0000033264873} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Leg + position: {x: -0.44575575, y: 0.00000031, z: 0.000010549999} + rotation: {x: 0.000013082994, y: -0.000011405496, z: 0.007246437, w: 0.9999738} + scale: {x: 1, y: 1, z: 0.999999} + transformModified: 1 + - name: GRFL_L_Foot + position: {x: -0.43787983, y: -0.0000047599997, z: 0.00000495} + rotation: {x: -0.0000073727897, y: 0.000019049723, z: -0.00668645, w: 0.99997765} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont1 + position: {x: -0.08865639, y: 0.124516055, z: 0.04686112} + rotation: {x: 0.7071072, y: -0.0000030130211, z: 0.70710635, w: 0.0000030130245} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont2 + position: {x: -0.08865634, y: -0.045784, z: 0.04686121} + rotation: {x: 0.7071072, y: -0.0000030130211, z: 0.70710635, w: 0.0000030130245} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont3 + position: {x: -0.08865627, y: 0.12451598, z: -0.051138878} + rotation: {x: 0.7071072, y: -0.0000030130211, z: 0.70710635, w: 0.0000030130245} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_FootCont4 + position: {x: -0.08865623, y: -0.045784038, z: -0.051138792} + rotation: {x: 0.7071072, y: -0.0000030130211, z: 0.70710635, w: 0.0000030130245} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToeBase + position: {x: -0.078656666, y: 0.12451593, z: 0.0000009} + rotation: {x: 0.000066114524, y: -0.00006894287, z: -0.70710635, w: 0.7071072} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToeBaseNub + position: {x: -0.05106352, y: -0.00000009, z: -0.0000041999997} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToetCont1 + position: {x: -0.070399925, y: -0.00999072, z: 0.04686238} + rotation: {x: 0.5000619, y: 0.49987787, z: 0.5000619, w: -0.4999983} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ToetCont2 + position: {x: -0.07040191, y: -0.0100093195, z: -0.051137645} + rotation: {x: 0.5000619, y: 0.49987787, z: 0.5000619, w: -0.4999983} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LegTwist + position: {x: -0.21893992, y: -0.0000024580954, z: 0.0000025367735} + rotation: {x: -0.0000037458324, y: 0.00000006330812, z: -0.000000001396747, + w: 1} + scale: {x: 0.9999998, y: 1.0000002, z: 0.99999994} + transformModified: 1 + - name: GRFL_L_UpLegTwist + position: {x: -0.2228778, y: 0.00000025272368, z: 0.0000050258636} + rotation: {x: 0.000006500034, y: -0.0000000022918902, z: 0.000000005529741, + w: 1} + scale: {x: 1.0000002, y: 0.99999976, z: 0.9999999} + transformModified: 1 + - name: GRFL_L_WeaponUpLeg + position: {x: -0.08823878, y: -0.069080606, z: -0.09229388} + rotation: {x: 0.5634052, y: 0.5119734, z: 0.42418623, w: -0.49043232} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpLeg + position: {x: 0.0054263696, y: -0.01846565, z: -0.093649976} + rotation: {x: -0.0005475, y: 0.9999999, z: -0.0000045018223, w: -0.0000033264873} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Leg + position: {x: -0.4457557, y: 0.00000040999998, z: -0.00000291} + rotation: {x: -0.000013082994, y: 0.000011405496, z: 0.007246437, w: 0.9999738} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Foot + position: {x: -0.43788016, y: -0.0000045399997, z: 0.0000032399998} + rotation: {x: 0.0000073727897, y: -0.000019049723, z: -0.00668645, w: 0.99997765} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont1 + position: {x: -0.08865704, y: 0.124515876, z: -0.04685747} + rotation: {x: 0.7071068, y: -0.0000062614376, z: 0.7071068, w: -0.000005978967} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont2 + position: {x: -0.088656984, y: -0.04578409, z: -0.04685814} + rotation: {x: 0.7071068, y: -0.0000062614376, z: 0.7071068, w: -0.000005978967} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont3 + position: {x: -0.08865541, y: 0.124515474, z: 0.051142547} + rotation: {x: 0.7071068, y: -0.0000062614376, z: 0.7071068, w: -0.000005978967} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_FootCont4 + position: {x: -0.088655345, y: -0.04578449, z: 0.051141866} + rotation: {x: 0.7071068, y: -0.0000062614376, z: 0.7071068, w: -0.000005978967} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToeBase + position: {x: -0.0786562, y: 0.124515735, z: 0.0000023799998} + rotation: {x: -0.000066114524, y: 0.00006894287, z: -0.70710635, w: 0.7071072} + scale: {x: 0.999999, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToeBaseNub + position: {x: -0.05106892, y: -0.00000012, z: -0.00000448} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 0.999999, z: 1.000001} + transformModified: 1 + - name: GRFL_R_ToetCont1 + position: {x: -0.07040009, y: -0.0099918, z: -0.046861757} + rotation: {x: 0.50012493, y: 0.4999048, z: 0.50012493, w: -0.4998452} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ToetCont2 + position: {x: -0.07040009, y: -0.0100088995, z: 0.051138237} + rotation: {x: 0.50012493, y: 0.4999048, z: 0.50012493, w: -0.4998452} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LegTwist + position: {x: -0.21894005, y: -0.0000022697448, z: 0.0000016784668} + rotation: {x: 0.0000037475188, y: -0.000000040297916, z: -0.00000000838175, + w: 1} + scale: {x: 1.0000001, y: 0.99999964, z: 1} + transformModified: 1 + - name: GRFL_R_UpLegTwist + position: {x: -0.22287758, y: 0.00000021219253, z: -0.0000014400482} + rotation: {x: -0.0000064962874, y: -0.000000019179094, z: 0.0000000018625206, + w: 1} + scale: {x: 1, y: 1.0000005, z: 0.9999999} + transformModified: 1 + - name: GRFL_R_WeaponUpLeg + position: {x: -0.08823771, y: -0.06908084, z: 0.09229921} + rotation: {x: -0.42418626, y: -0.49043217, z: -0.56340533, w: 0.5119734} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine + position: {x: -0.05371307, y: -0.000000109999995, z: 0} + rotation: {x: -0.0000014995301, y: 0.0000040001764, z: -0.0001175, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine1 + position: {x: -0.10297806, y: 0.0000022099998, z: 0.00000058} + rotation: {x: 0, y: -0, z: -0.027596997, w: 0.9996192} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Spine2 + position: {x: -0.11120224, y: -0.00000040999998, z: 0.00000012} + rotation: {x: -0.0000009974272, y: -0.00000007168846, z: 0.071688466, w: 0.9974271} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Shoulder + position: {x: -0.26215285, y: -0.013520859, z: 0.01756989} + rotation: {x: -0.6282259, y: 0.04174633, z: 0.76877606, w: 0.11212853} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Arm + position: {x: -0.1425321, y: 0.00000243, z: 0.0000021499998} + rotation: {x: -0.06515369, y: 0.10150025, z: 0.04530996, w: 0.9916651} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ArmTwist + position: {x: -0.13783765, y: -0.0000056028366, z: -0.000009307862} + rotation: {x: -0.000036485617, y: -0.00000002838996, z: -0.000000022579028, + w: 1} + scale: {x: 1.0000001, y: 1, z: 0.9999999} + transformModified: 1 + - name: GRFL_L_ForeArm + position: {x: -0.27567673, y: -0.000018499999, z: -0.000018570001} + rotation: {x: -0.000072998795, y: -0.000023003833, z: 0.000052498322, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_ForeArmTwist + position: {x: -0.13073516, y: 0.0000067853925, z: -0.0000024414062} + rotation: {x: 0.00002483278, y: 0.000000022353113, z: 0.000000046088257, w: 1} + scale: {x: 1, y: 0.9999999, z: 1} + transformModified: 1 + - name: GRFL_L_Hand + position: {x: -0.26147228, y: 0.00000845, z: -0.00000475} + rotation: {x: -0.7047386, y: -0.057397712, z: -0.057156622, w: 0.7048277} + scale: {x: 0.999999, y: 1, z: 0.999999} + transformModified: 1 + - name: GRFL_L_HandIndex1 + position: {x: -0.09577633, y: -0.01514031, z: -0.03465784} + rotation: {x: 0.000009564642, y: 0.000005789441, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000002} + transformModified: 1 + - name: GRFL_L_HandIndex2 + position: {x: -0.0343346, y: 0.0000010699999, z: 0.00000009} + rotation: {x: 0, y: -0, z: -0.000022, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandIndex3 + position: {x: -0.02727272, y: -0.00000052999997, z: 0.00000006} + rotation: {x: -0.0000575, y: -0.000068, z: -0.0000000039100003, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandIndexNub + position: {x: -0.02249649, y: 0.00000091, z: -0.00000046} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 0.999999, y: 1.000001, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddle1 + position: {x: -0.096413836, y: -0.01954905, z: -0.0124867} + rotation: {x: 0.00017398794, y: 0.000019581794, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000002} + transformModified: 1 + - name: GRFL_L_HandMiddle2 + position: {x: -0.039004557, y: 0.00000091, z: -0.00000014999999} + rotation: {x: 0, y: -0, z: -0.0000115, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddle3 + position: {x: -0.027552111, y: 0, z: 0.000000099999994} + rotation: {x: -0.0000165, y: -0.000119, z: -0.0000000019635, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandMiddleNub + position: {x: -0.026343, y: 0.00000039999998, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 0.999997, y: 1.000003, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinky1 + position: {x: -0.081345096, y: -0.01313419, z: 0.02876861} + rotation: {x: 0.000009564642, y: 0.000005789441, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000002} + transformModified: 1 + - name: GRFL_L_HandPinky2 + position: {x: -0.02618702, y: 0.00000076, z: -0.00000016} + rotation: {x: -0.000017000382, y: -0.00015299996, z: -0.000002502601, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinky3 + position: {x: -0.02073616, y: 0.00000029999998, z: -0.000000049999997} + rotation: {x: 0.000117, y: -0.000147, z: 0.000000017199001, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandPinkyNub + position: {x: -0.02423073, y: 0.00000031, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 0.999998, y: 1.000002, z: 1} + transformModified: 1 + - name: GRFL_L_HandRing1 + position: {x: -0.090738215, y: -0.01547981, z: 0.009509889} + rotation: {x: 0.00000996749, y: 0.0000008056957, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000002} + transformModified: 1 + - name: GRFL_L_HandRing2 + position: {x: -0.03220081, y: -0.0000026, z: -0.00000051999996} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandRing3 + position: {x: -0.02569976, y: -0.00000168, z: -0.00000037} + rotation: {x: -0.0000830005, y: -0.00006749938, z: -0.0000075056023, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandRingNub + position: {x: -0.025179518, y: -0.00000232, z: 0.0000041199996} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 0.999999, y: 1.000002, z: 0.999999} + transformModified: 1 + - name: GRFL_L_HandThumb1 + position: {x: -0.02020308, y: 0.00359573, z: -0.04265935} + rotation: {x: 0.37346393, y: -0.32289723, z: 0.21043076, w: 0.84378964} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumb2 + position: {x: -0.03579555, y: -0.0000010499999, z: -0.00000137} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.000002, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumb3 + position: {x: -0.030424649, y: -0.00000019, z: -0.00000122} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_HandThumbNub + position: {x: -0.03170731, y: -0.00000039999998, z: -0.00000061} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 0.999998, y: 1, z: 1.000002} + transformModified: 1 + - name: GRFL_L_WeaponHand + position: {x: -0.09127007, y: 0.00989477, z: -0.0000016500001} + rotation: {x: 0.70710546, y: 0.7071081, z: -0.00016044368, w: -0.000114871196} + scale: {x: 1, y: 0.999998, z: 1.000004} + transformModified: 1 + - name: GRFL_Neck + position: {x: -0.270939, y: -0.00000033999999, z: 0.00000033} + rotation: {x: 0.0000014883141, y: -0.00000018687297, z: -0.12458197, w: 0.9922093} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Head + position: {x: -0.121566005, y: 0.00000057, z: 0.00000019} + rotation: {x: 0.0000037712834, y: -0.0000032058417, z: 0.0807774, w: 0.9967322} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_HeadNub + position: {x: -0.15672135, y: -0.00000012, z: 0.00002869} + rotation: {x: -0.0000035004882, y: 0.0000034995116, z: 0.00013950001, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Jaw + position: {x: -0.0024800098, y: 0.02439142, z: -0.00000473} + rotation: {x: -0.0000056568565, y: 0.0000007070944, z: -0.7071053, w: 0.7071084} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_JawEnd + position: {x: -0.082132824, y: 0.03954252, z: 0.0000038099997} + rotation: {x: 0.0000063639536, y: -0.0000014142497, z: 0.70710284, w: 0.7071108} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_LipLower + position: {x: -0.082216784, y: -0.0012813, z: 0.00000345} + rotation: {x: 0.00006470028, y: 0.00006470026, z: 0.7071067, w: 0.7071069} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipLower + position: {x: 0.00061264, y: -0.0028446098, z: 0.011109039} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipLower + position: {x: 0.0006128, y: -0.00284875, z: -0.01110797} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue + position: {x: -0.030468669, y: 0.01108454, z: 0.00000092} + rotation: {x: 0, y: 0, z: 0.116483465, w: 0.9931927} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue1 + position: {x: -0.02006943, y: 0.00000014999999, z: 0} + rotation: {x: 0, y: -0, z: -0.06936925, w: 0.9975911} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Tongue2 + position: {x: -0.018061578, y: 0.00000014999999, z: 0.00000014999999} + rotation: {x: 0, y: -0, z: -0.040000822, w: 0.9991996} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_BrowInner + position: {x: -0.08304909, y: 0.0964711, z: 0.01359899} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_BrowOuter + position: {x: -0.08835421, y: 0.088128105, z: 0.040872596} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Cheek + position: {x: -0.028859688, y: 0.09342277, z: 0.03558017} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Eye + position: {x: -0.06752424, y: 0.07305327, z: 0.03109888} + rotation: {x: -0.0000056568565, y: 0.0000007070944, z: -0.7071053, w: 0.7071084} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipCorner + position: {x: -0.00183151, y: 0.09658269, z: 0.023026088} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LowerEyelid + position: {x: -0.061823558, y: 0.088723354, z: 0.031141039} + rotation: {x: 0.00008799999, y: 0.000004000176, z: 0.000001999648, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LowerEyelash + position: {x: 0.0023768598, y: 0.00998188, z: -0.0000042799998} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpperEyelid + position: {x: -0.07277464, y: 0.08897636, z: 0.03110184} + rotation: {x: 0.00008799999, y: 0.000004000176, z: 0.000001999648, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_UpperEeylash + position: {x: -0.00331924, y: 0.00914268, z: -0.0000041199996} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_LipUpper + position: {x: -0.00767929, y: 0.11334918, z: -0.00000191} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_LipUpper + position: {x: 0.00144196, y: -0.00500203, z: 0.013093869} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipUpper + position: {x: 0.0014417999, y: -0.0050023003, z: -0.01309377} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_Nose + position: {x: -0.041046463, y: 0.12394878, z: -0.00000202} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_L_Nostril + position: {x: 0.0097, y: -0.01719946, z: 0.015002789} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Nostril + position: {x: 0.009699879, y: -0.01719975, z: -0.01500249} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_BrowInner + position: {x: -0.08304919, y: 0.09647081, z: -0.01360247} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_BrowOuter + position: {x: -0.088354185, y: 0.08812728, z: -0.0408759} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Cheek + position: {x: -0.028859688, y: 0.09342208, z: -0.03558359} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Eye + position: {x: -0.06752472, y: 0.073052876, z: -0.03109944} + rotation: {x: -0.0000056568565, y: 0.0000007070944, z: -0.7071053, w: 0.7071084} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LipCorner + position: {x: -0.00183151, y: 0.09658222, z: -0.023029579} + rotation: {x: -3.5e-12, y: -0.000001, z: -0.0000035, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LowerEyelid + position: {x: -0.061823577, y: 0.08872271, z: -0.031144349} + rotation: {x: 0.00008799999, y: 0.000004000176, z: 0.000001999648, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_LowerEyelash + position: {x: 0.00237747, y: 0.00998201, z: -0.00001013} + rotation: {x: -0.00008800003, y: -0.00000549956, z: -0.000005000484, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpperEyelid + position: {x: -0.072774656, y: 0.088975735, z: -0.03110516} + rotation: {x: 0.00008799999, y: 0.000004000176, z: 0.000001999648, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_UpperEeylash + position: {x: -0.00331833, y: 0.00914276, z: -0.00000855} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Shoulder + position: {x: -0.26215282, y: -0.013520809, z: -0.01757339} + rotation: {x: 0.6282259, y: -0.041746665, z: 0.768776, w: 0.11212894} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_Arm + position: {x: -0.14252684, y: 0.00000183, z: -0.00000108} + rotation: {x: 0.06515369, y: -0.10150025, z: 0.04530996, w: 0.9916651} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ArmTwist + position: {x: -0.13783847, y: -0.00001019001, z: 0.000009307862} + rotation: {x: 0.00003647266, y: -0.000000050042363, z: -0.000000003936133, w: 1} + scale: {x: 1, y: 1, z: 1.0000002} + transformModified: 1 + - name: GRFL_R_ForeArm + position: {x: -0.27567703, y: -0.0000203, z: 0.000018769999} + rotation: {x: 0.000072998795, y: 0.000023003833, z: 0.000052498322, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_ForeArmTwist + position: {x: -0.13073516, y: 0.000003437996, z: 0.0000028991699} + rotation: {x: -0.000024842095, y: 0.000000022348924, z: 0.000000021879384, w: 1} + scale: {x: 0.99999994, y: 0.9999999, z: 0.9999998} + transformModified: 1 + - name: GRFL_R_Hand + position: {x: -0.26147002, y: 0.00000698, z: 0.00000488} + rotation: {x: 0.7047386, y: 0.057397712, z: -0.057156622, w: 0.7048277} + scale: {x: 1, y: 1, z: 0.999998} + transformModified: 1 + - name: GRFL_R_HandIndex1 + position: {x: -0.09577721, y: -0.01514004, z: 0.03465996} + rotation: {x: -0.000009564642, y: -0.000005789441, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000004} + transformModified: 1 + - name: GRFL_R_HandIndex2 + position: {x: -0.03433479, y: -0.00000014999999, z: 0.00000012} + rotation: {x: 2.34e-10, y: 0.000052, z: -0.0000045, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandIndex3 + position: {x: -0.02727261, y: -0.00000014999999, z: -0.000000049999997} + rotation: {x: 0, y: 0.000065, z: -0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandIndexNub + position: {x: -0.022496339, y: 0.00000049, z: -0.00000061} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 0.999997, y: 1.000003, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddle1 + position: {x: -0.096414186, y: -0.01954886, z: 0.01248974} + rotation: {x: -0.00017398794, y: -0.000019581794, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000004} + transformModified: 1 + - name: GRFL_R_HandMiddle2 + position: {x: -0.039004978, y: 0.00000061, z: -0.000000109999995} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddle3 + position: {x: -0.02755203, y: 0.00000046, z: -0.00000001} + rotation: {x: 0.00003, y: -0.000127, z: 0.0000000038100003, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandMiddleNub + position: {x: -0.02634277, y: 0.000000109999995, z: -0.00000014999999} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.000017, y: 0.999995, z: 0.999988} + transformModified: 1 + - name: GRFL_R_HandPinky1 + position: {x: -0.08134949, y: -0.013134429, z: -0.028762529} + rotation: {x: -0.000009564642, y: -0.000005789441, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000004} + transformModified: 1 + - name: GRFL_R_HandPinky2 + position: {x: -0.026187329, y: -0.00000029999998, z: -0.00000009} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandPinky3 + position: {x: -0.02073608, y: 0.00000061, z: 0.00000008} + rotation: {x: 0.000055, y: 0.00014200002, z: -0.000000007810001, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandPinkyNub + position: {x: -0.02423073, y: -0.00000012999999, z: 0.00000031} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.000004, y: 1, z: 0.999997} + transformModified: 1 + - name: GRFL_R_HandRing1 + position: {x: -0.09074264, y: -0.01548024, z: -0.009508969} + rotation: {x: -0.00000996749, y: -0.0000008056957, z: 0.08056957, w: 0.996749} + scale: {x: 1, y: 1, z: 1.000004} + transformModified: 1 + - name: GRFL_R_HandRing2 + position: {x: -0.03220086, y: -0.00000321, z: -0.00000038} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandRing3 + position: {x: -0.02569961, y: -0.00000092, z: -0.00000028} + rotation: {x: 0.0000800004, y: 0.0000534994, z: -0.00000750428, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandRingNub + position: {x: -0.02517937, y: -0.00000267, z: 0.00000443} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.000016, y: 0.999996, z: 0.999988} + transformModified: 1 + - name: GRFL_R_HandThumb1 + position: {x: -0.02020664, y: 0.0035956698, z: 0.04266449} + rotation: {x: -0.37346393, y: 0.32289723, z: 0.21043076, w: 0.84378964} + scale: {x: 0.999998, y: 1.000002, z: 1.000002} + transformModified: 1 + - name: GRFL_R_HandThumb2 + position: {x: -0.03579574, y: -0.00000077999994, z: -0.0000010599999} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1.000004, y: 0.999999, z: 0.999997} + transformModified: 1 + - name: GRFL_R_HandThumb3 + position: {x: -0.030458258, y: 0.00000008, z: -0.0000010699999} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRFL_R_HandThumbNub + position: {x: -0.03170731, y: -0.00000049, z: -0.00000061} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 0.999998, y: 1.000003, z: 1} + transformModified: 1 + - name: GRFL_R_WeaponHand + position: {x: -0.09127472, y: 0.00989435, z: -0.0000011999999} + rotation: {x: 0.00015909926, y: -0.00011101541, z: -0.7071052, w: 0.7071083} + scale: {x: 1, y: 0.999999, z: 1.000005} + transformModified: 1 + - name: GRH_DownTeeth_Liza + position: {x: -0.0000009039751, y: 1.6360105, z: 0.069111325} + rotation: {x: -0.7071065, y: -0.00000006181722, z: 0.000000061817275, w: 0.7071072} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRH_EyeLashes_Liza + position: {x: 0.00000064988615, y: 1.7027332, z: 0.07721802} + rotation: {x: -0.70710665, y: 0, z: -0, w: 0.7071069} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRH_LEye_Liza + position: {x: -0.031099739, y: 1.7027959, z: 0.061282195} + rotation: {x: -0.70710665, y: 0, z: -0, w: 0.7071069} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRH_REye_Liza + position: {x: 0.031098574, y: 1.7027959, z: 0.061282195} + rotation: {x: -0.70710665, y: 0, z: -0, w: 0.7071069} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRH_Tongue_Liza + position: {x: -0.0000009083863, y: 1.6266668, z: 0.043089904} + rotation: {x: -0.70710665, y: -0.00000016858726, z: 0.00000084293697, w: 0.7071069} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + - name: GRH_UpperTeeth_Liza + position: {x: -0.0000008798357, y: 1.6360105, z: 0.069099575} + rotation: {x: -0.70710665, y: 0, z: -0, w: 0.7071069} + scale: {x: 1, y: 1, z: 1} + transformModified: 1 + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 3 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials.meta new file mode 100644 index 0000000..b816216 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2fa26e47b8eb49e44b9bf9c85772f890 +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRFL_Head_Liza.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRFL_Head_Liza.mat new file mode 100644 index 0000000..53ad527 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRFL_Head_Liza.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRFL_Head_Liza + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: 12c7deedee0941c44881246aefb382c2, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 5f0ec7bc628cf664da7883ec21a03dd2, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 2800000, guid: 51864301bba2b2e4d90418f93af740cf, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 2800000, guid: a8d0d351b13bcbc4da3b5f3870b0bfdd, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.1897979e-33, b: 0, a: 1.189792e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRFL_Head_Liza.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRFL_Head_Liza.mat.meta new file mode 100644 index 0000000..2b5ca17 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRFL_Head_Liza.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 818a303ce836fce4291f06023b2b5e6c +timeCreated: 1449063069 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_EyeLashes_Liza.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_EyeLashes_Liza.mat new file mode 100644 index 0000000..3b883d1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_EyeLashes_Liza.mat @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRH_EyeLashes_Liza + m_Shader: {fileID: 4800000, guid: c482e20001a8cfb4f8e3f040b1e41319, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: 3000 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: bbe933c0cee217d4f81885d76a0c4eff, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _SrcBlend + second: 1 + data: + first: + name: _DstBlend + second: 0 + data: + first: + name: _Cutoff + second: .5 + data: + first: + name: _Parallax + second: .0199999996 + data: + first: + name: _ZWrite + second: 1 + data: + first: + name: _Glossiness + second: .5 + data: + first: + name: _BumpScale + second: 1 + data: + first: + name: _OcclusionStrength + second: 1 + data: + first: + name: _DetailNormalMapScale + second: 1 + data: + first: + name: _UVSec + second: 0 + data: + first: + name: _Mode + second: 0 + data: + first: + name: _Metallic + second: 0 + m_Colors: + data: + first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_EyeLashes_Liza.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_EyeLashes_Liza.mat.meta new file mode 100644 index 0000000..1bd1e46 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_EyeLashes_Liza.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d51fde0a2c43c14e879d91c34c75238 +timeCreated: 1449063069 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Iris_Liza.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Iris_Liza.mat new file mode 100644 index 0000000..3e390bc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Iris_Liza.mat @@ -0,0 +1,148 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRH_Iris_Liza + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: f45d0cb5cbb4d534381b532e5aa90cd0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _SpecGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.515 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.143335e-33, b: 0, a: 1.14332915e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _SpecColor + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Iris_Liza.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Iris_Liza.mat.meta new file mode 100644 index 0000000..5ba6a0a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Iris_Liza.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 234af14dc174fea43ac67396cc7a629d +timeCreated: 1449063069 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Lens_Liza.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Lens_Liza.mat new file mode 100644 index 0000000..3b6f4c5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Lens_Liza.mat @@ -0,0 +1,140 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRH_Lens_Liza + m_Shader: {fileID: 45, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _SpecGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 10 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.973 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Mode + second: 3 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 0 + m_Colors: + - first: + name: + second: {r: 0, g: 1.1434085e-33, b: 0, a: 1.1434026e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 0} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _SpecColor + second: {r: 0.09558821, g: 0.09558821, b: 0.09558821, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Lens_Liza.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Lens_Liza.mat.meta new file mode 100644 index 0000000..741c472 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Lens_Liza.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d1c7e083b931724694854819181f2c0 +timeCreated: 1449063069 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Teeth_Liza.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Teeth_Liza.mat new file mode 100644 index 0000000..684d36d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Teeth_Liza.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRH_Teeth_Liza + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: 17a94466f03df4243a462879b4ebce38, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 5d068429afa4ceb4d93dae2f6512dc9e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 2800000, guid: ee49b4c41e64c8d408fb58748d8ee25a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 2800000, guid: db0bdc14c971fda418041bb0a8fb7bae, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.007705e-33, b: 0, a: 1.0076991e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Teeth_Liza.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Teeth_Liza.mat.meta new file mode 100644 index 0000000..8bc2964 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Teeth_Liza.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd784f0da77ffee4a94c8b87e5742319 +timeCreated: 1449063069 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Tongue_Liza.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Tongue_Liza.mat new file mode 100644 index 0000000..a5cfe62 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Tongue_Liza.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GRH_Tongue_Liza + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: 740b7aeb311c28c4ab397964524ae176, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 0de41fd65ba25834687dbba9aff19879, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 2800000, guid: cbd8cf6953e52de4f890658f386a20a5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 2800000, guid: c3a3d766720fa8a468ef4342e0e12957, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.0080665e-33, b: 0, a: 1.0080606e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Tongue_Liza.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Tongue_Liza.mat.meta new file mode 100644 index 0000000..0272b54 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Materials/GRH_Tongue_Liza.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a566dd48be8b5949a7230b4a6cf0f3b +timeCreated: 1449063069 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza.meta new file mode 100644 index 0000000..c09c559 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 462ebf4b841b84f4e9db00efab9202a0 +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_AO.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_AO.tif new file mode 100644 index 0000000..0213362 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_AO.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_AO.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_AO.tif.meta new file mode 100644 index 0000000..8424b9d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_AO.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: a8d0d351b13bcbc4da3b5f3870b0bfdd +timeCreated: 1449157654 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_C.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_C.tif new file mode 100644 index 0000000..62eb959 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_C.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_C.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_C.tif.meta new file mode 100644 index 0000000..7594229 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_C.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 5f0ec7bc628cf664da7883ec21a03dd2 +timeCreated: 1449157647 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_MS.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_MS.tif new file mode 100644 index 0000000..687f4e5 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_MS.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_MS.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_MS.tif.meta new file mode 100644 index 0000000..7427bbb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_MS.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 51864301bba2b2e4d90418f93af740cf +timeCreated: 1449302232 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 4 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_N.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_N.tif new file mode 100644 index 0000000..fad6bfd Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_N.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_N.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_N.tif.meta new file mode 100644 index 0000000..98392d1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRFL_Head_Liza_N.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 12c7deedee0941c44881246aefb382c2 +timeCreated: 1449157636 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_EyeLashesF_CO.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_EyeLashesF_CO.tif new file mode 100644 index 0000000..ad0aab6 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_EyeLashesF_CO.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_EyeLashesF_CO.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_EyeLashesF_CO.tif.meta new file mode 100644 index 0000000..ad0fee3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_EyeLashesF_CO.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: bbe933c0cee217d4f81885d76a0c4eff +timeCreated: 1449157655 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 4 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_C_Blue_01.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_C_Blue_01.tif new file mode 100644 index 0000000..01dd202 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_C_Blue_01.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_C_Blue_01.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_C_Blue_01.tif.meta new file mode 100644 index 0000000..3412150 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_C_Blue_01.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: f45d0cb5cbb4d534381b532e5aa90cd0 +timeCreated: 1449157661 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_N.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_N.tif new file mode 100644 index 0000000..7da637f Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_N.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_N.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_N.tif.meta new file mode 100644 index 0000000..f8f4fa1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Eyes_N.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 9a22871de78c30d4f85ef2e772a54d41 +timeCreated: 1449157652 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_AO.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_AO.tif new file mode 100644 index 0000000..71b4002 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_AO.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_AO.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_AO.tif.meta new file mode 100644 index 0000000..1623479 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_AO.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: db0bdc14c971fda418041bb0a8fb7bae +timeCreated: 1449157658 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_C.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_C.tif new file mode 100644 index 0000000..c4d078a Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_C.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_C.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_C.tif.meta new file mode 100644 index 0000000..44f1748 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_C.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 5d068429afa4ceb4d93dae2f6512dc9e +timeCreated: 1449157645 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_MS.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_MS.tif new file mode 100644 index 0000000..8b4f1fc Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_MS.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_MS.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_MS.tif.meta new file mode 100644 index 0000000..82cb8a4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_MS.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: ee49b4c41e64c8d408fb58748d8ee25a +timeCreated: 1449157659 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 4 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_N.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_N.tif new file mode 100644 index 0000000..533140e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_N.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_N.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_N.tif.meta new file mode 100644 index 0000000..b1b76cf --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Teeth_N.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 17a94466f03df4243a462879b4ebce38 +timeCreated: 1449157636 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_AO.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_AO.tif new file mode 100644 index 0000000..5a73a3b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_AO.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_AO.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_AO.tif.meta new file mode 100644 index 0000000..dba2e3b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_AO.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: c3a3d766720fa8a468ef4342e0e12957 +timeCreated: 1449157655 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_C.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_C.tif new file mode 100644 index 0000000..2222965 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_C.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_C.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_C.tif.meta new file mode 100644 index 0000000..87cc111 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_C.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 0de41fd65ba25834687dbba9aff19879 +timeCreated: 1449157634 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_MS.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_MS.tif new file mode 100644 index 0000000..692e182 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_MS.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_MS.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_MS.tif.meta new file mode 100644 index 0000000..51ffc5d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_MS.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: cbd8cf6953e52de4f890658f386a20a5 +timeCreated: 1449157658 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 4 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_N.tif b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_N.tif new file mode 100644 index 0000000..959ad4c Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_N.tif differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_N.tif.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_N.tif.meta new file mode 100644 index 0000000..cd899fb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Models/Textures_Head_Liza/GRH_Tongue_N.tif.meta @@ -0,0 +1,56 @@ +fileFormatVersion: 2 +guid: 740b7aeb311c28c4ab397964524ae176 +timeCreated: 1449157647 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs.meta new file mode 100644 index 0000000..827a9db --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ad5dd56fc4405b84d811993c1f51c1b1 +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs/GRFLHead_Liza.prefab b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs/GRFLHead_Liza.prefab new file mode 100644 index 0000000..fdbb9e6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs/GRFLHead_Liza.prefab @@ -0,0 +1,3939 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &100222 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 482206} + m_Layer: 0 + m_Name: GRFL_L_Shoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &101328 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 449870} + m_Layer: 0 + m_Name: GRFL_R_HandRing2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &101800 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 445528} + m_Layer: 0 + m_Name: GRFL_L_HandMiddle1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &104270 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 486430} + m_Layer: 0 + m_Name: GRFL_R_HandPinky3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &104578 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 457220} + m_Layer: 0 + m_Name: GRFL_R_HandPinky2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &105226 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 435664} + m_Layer: 0 + m_Name: GRFL_R_BrowOuter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &106304 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 465374} + - 137: {fileID: 13716978} + m_Layer: 0 + m_Name: GRH_DownTeeth_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &106402 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 422722} + m_Layer: 0 + m_Name: GRFL_L_WeaponUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &106786 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 476844} + m_Layer: 0 + m_Name: GRFL_R_HandRingNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &107820 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 405548} + m_Layer: 0 + m_Name: GRFL_L_Foot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &108718 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 437998} + m_Layer: 0 + m_Name: GRFL_R_FootCont4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &109086 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 417692} + m_Layer: 0 + m_Name: GRFL_L_HandThumb3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &109366 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 464154} + m_Layer: 0 + m_Name: GRFL_Head + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &109926 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 409512} + m_Layer: 0 + m_Name: GRFL_R_UpperEeylash + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &110430 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 437520} + m_Layer: 0 + m_Name: GRFL_L_HandIndex3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &110444 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 459106} + m_Layer: 0 + m_Name: GRFL_L_LipLower + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &111458 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 418938} + m_Layer: 0 + m_Name: GRFL_R_HandThumbNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &113384 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 454852} + m_Layer: 0 + m_Name: GRFL_L_HandRing3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &114816 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 487294} + m_Layer: 0 + m_Name: GRFL_L_Hand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &116364 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 449310} + m_Layer: 0 + m_Name: GRFL_L_LowerEyelid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &117628 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 486390} + m_Layer: 0 + m_Name: GRFL_L_FootCont3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &118600 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 446666} + m_Layer: 0 + m_Name: GRFL_R_HandMiddleNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &119290 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 410480} + m_Layer: 0 + m_Name: GRFL_R_ToetCont1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &120156 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 466656} + m_Layer: 0 + m_Name: GRFL_R_ForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &120454 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 420418} + m_Layer: 0 + m_Name: GRFL_L_Eye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &120932 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 499164} + m_Layer: 0 + m_Name: GRFL_L_HandMiddleNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &121084 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 479494} + m_Layer: 0 + m_Name: GRFL_L_HandIndex2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &121176 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 455590} + m_Layer: 0 + m_Name: GRFL_L_ForeArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &121946 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 435972} + - 137: {fileID: 13794336} + m_Layer: 0 + m_Name: GRFL_Head_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &122418 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 422894} + m_Layer: 0 + m_Name: GRFL_Spine1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &125038 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 447940} + m_Layer: 0 + m_Name: GRFL_R_HandThumb1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &125092 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 456528} + - 137: {fileID: 13703752} + m_Layer: 0 + m_Name: GRH_LEye_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &125292 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 456572} + m_Layer: 0 + m_Name: GRFL_L_BrowInner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &127538 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 412548} + m_Layer: 0 + m_Name: GRFL_L_HandMiddle2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &127544 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 405942} + m_Layer: 0 + m_Name: GRFL_L_HandMiddle3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &128220 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 498224} + m_Layer: 0 + m_Name: GRFL_L_LipCorner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &128298 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 496744} + m_Layer: 0 + m_Name: GRFL_LipUpper + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &128914 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 490544} + m_Layer: 0 + m_Name: GRFL_R_Eye + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &129190 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 467568} + m_Layer: 0 + m_Name: GRFL_R_HandThumb3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &129262 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 457004} + m_Layer: 0 + m_Name: GRFL_L_HandPinky1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &129382 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 442400} + m_Layer: 0 + m_Name: GRFL_L_UpLegTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &130534 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 422052} + m_Layer: 0 + m_Name: GRFL_R_LipUpper + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &130584 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 448332} + m_Layer: 0 + m_Name: GRFL_Tongue2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &131210 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 412732} + m_Layer: 0 + m_Name: GRFL_R_HandIndexNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &132176 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 425346} + m_Layer: 0 + m_Name: GRFL_R_LowerEyelash + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &133598 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 426816} + m_Layer: 0 + m_Name: GRFL_R_Cheek + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &135548 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 491068} + m_Layer: 0 + m_Name: GRFL_L_HandPinky3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &136700 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 404874} + m_Layer: 0 + m_Name: GRFL_JawEnd + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &136872 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 487626} + m_Layer: 0 + m_Name: GRFL_Spine2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &136914 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 466814} + m_Layer: 0 + m_Name: GRFL_L_FootCont4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &137460 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 464718} + m_Layer: 0 + m_Name: GRFL_R_Arm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &140436 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 437540} + - 137: {fileID: 13773646} + m_Layer: 0 + m_Name: GRH_EyeLashes_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &141850 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 403482} + m_Layer: 0 + m_Name: GRFL_LipLower + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &142264 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 400154} + m_Layer: 0 + m_Name: GRFL_L_ToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &143130 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 469578} + m_Layer: 0 + m_Name: GRFL_L_HandRingNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &144160 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 433150} + m_Layer: 0 + m_Name: GRFL_L_HandThumbNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &145962 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 479646} + m_Layer: 0 + m_Name: GRFL_R_HandRing1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &146262 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 487086} + m_Layer: 0 + m_Name: GRFL_R_FootCont3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &148386 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 475180} + m_Layer: 0 + m_Name: GRFL_R_HandMiddle2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &148654 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 469164} + m_Layer: 0 + m_Name: GRFL_R_LipCorner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &148726 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 459452} + m_Layer: 0 + m_Name: GRFL_R_ToeBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &150348 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 412806} + m_Layer: 0 + m_Name: GRFL_R_LegTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &150394 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 404224} + m_Layer: 0 + m_Name: GRFL_L_LegTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &150944 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 470114} + m_Layer: 0 + m_Name: GRFL_L_ForeArmTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &151642 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 470936} + m_Layer: 0 + m_Name: GRFL_R_HandMiddle1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &152394 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 422310} + m_Layer: 0 + m_Name: GRFL_Tongue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &152566 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 461492} + m_Layer: 0 + m_Name: GRFL_L_FootCont1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &153300 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 430404} + m_Layer: 0 + m_Name: GRFL_R_FootCont2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &155758 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 439752} + m_Layer: 0 + m_Name: GRFL_L_ToeBaseNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &156546 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 487270} + m_Layer: 0 + m_Name: GRFL_R_FootCont1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &158928 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 423724} + m_Layer: 0 + m_Name: GRFL_Nose + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &160022 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 419266} + m_Layer: 0 + m_Name: GRFL_L_ToetCont2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &160076 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 445520} + m_Layer: 0 + m_Name: GRFL_R_HandRing3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &161168 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 465182} + m_Layer: 0 + m_Name: GRFL_L_HandPinky2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &161556 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 473398} + m_Layer: 0 + m_Name: GRFL_L_Arm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &161618 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 498680} + - 95: {fileID: 9532216} + m_Layer: 0 + m_Name: GRFLHead_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &161876 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 450682} + m_Layer: 0 + m_Name: GRFL_L_UpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &161962 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 438780} + m_Layer: 0 + m_Name: GRFL_R_BrowInner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &162614 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 431194} + m_Layer: 0 + m_Name: GRFL_L_WeaponHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &162676 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 434940} + m_Layer: 0 + m_Name: GRFL_R_ForeArmTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &163560 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 460656} + m_Layer: 0 + m_Name: GRFL_L_LowerEyelash + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &165282 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 471694} + m_Layer: 0 + m_Name: GRFL_R_LowerEyelid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &166356 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 445046} + m_Layer: 0 + m_Name: GRFL_L_HandThumb1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &168314 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 404372} + m_Layer: 0 + m_Name: GRFL_R_Hand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &168444 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 447440} + m_Layer: 0 + m_Name: GRFL_L_HandPinkyNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &168570 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 437268} + m_Layer: 0 + m_Name: GRFL_Neck + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &168788 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 436540} + m_Layer: 0 + m_Name: GRFL_R_Foot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &169628 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 474968} + m_Layer: 0 + m_Name: GRFL_R_UpperEyelid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &170820 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 404538} + m_Layer: 0 + m_Name: GRFL_R_HandMiddle3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &171172 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 480030} + m_Layer: 0 + m_Name: GRFL_Hips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &171416 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 474136} + m_Layer: 0 + m_Name: GRFL_L_LipUpper + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &172200 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 441090} + m_Layer: 0 + m_Name: GRFL_L_HandRing2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &173266 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 450208} + m_Layer: 0 + m_Name: GRFL_L_HandIndexNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &174158 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 485440} + m_Layer: 0 + m_Name: GRFL_R_Shoulder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &174508 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 457388} + m_Layer: 0 + m_Name: GRFL_L_UpperEeylash + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &175298 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 454826} + m_Layer: 0 + m_Name: GRFL_R_Leg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &175766 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 401824} + - 137: {fileID: 13755412} + m_Layer: 0 + m_Name: GRH_REye_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &179838 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 438476} + m_Layer: 0 + m_Name: GRFL_L_Leg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &179978 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 482300} + m_Layer: 0 + m_Name: GRFL_R_UpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &180218 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 486506} + - 137: {fileID: 13708650} + m_Layer: 0 + m_Name: GRH_UpperTeeth_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &180732 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 476532} + m_Layer: 0 + m_Name: GRFL_L_HandIndex1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &180752 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 443216} + m_Layer: 0 + m_Name: GRFL_Jaw + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &180766 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 487702} + m_Layer: 0 + m_Name: GRFL_HeadNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &181102 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 415578} + m_Layer: 0 + m_Name: GRFL_L_ArmTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &181958 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 480060} + m_Layer: 0 + m_Name: GRFL_R_ToetCont2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &181996 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 459058} + m_Layer: 0 + m_Name: GRFL_R_WeaponHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &182030 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 498156} + m_Layer: 0 + m_Name: GRFL_L_FootCont2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &183398 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 406288} + m_Layer: 0 + m_Name: GRFL_R_ToeBaseNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &183904 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 443526} + m_Layer: 0 + m_Name: GRFL_R_Nostril + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &184056 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 496538} + m_Layer: 0 + m_Name: GRFL_R_HandThumb2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &184948 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 450638} + m_Layer: 0 + m_Name: GRFL_Spine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &185846 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 415134} + m_Layer: 0 + m_Name: GRFL_L_BrowOuter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &186114 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 497346} + m_Layer: 0 + m_Name: GRFL_L_HandRing1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &187808 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 427104} + m_Layer: 0 + m_Name: GRFL_Tongue1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &188248 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 485100} + - 137: {fileID: 13784936} + m_Layer: 0 + m_Name: GRH_Tongue_Liza + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &188378 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 480668} + m_Layer: 0 + m_Name: GRFL_R_ArmTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &188612 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 475568} + m_Layer: 0 + m_Name: GRFL_R_HandIndex2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &189190 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 467358} + m_Layer: 0 + m_Name: GRFL_R_HandPinky1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &189202 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 463418} + m_Layer: 0 + m_Name: GRFL_R_WeaponUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &191256 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 431650} + m_Layer: 0 + m_Name: GRFL_R_HandIndex1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &191368 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 459262} + m_Layer: 0 + m_Name: GRFL_R_HandPinkyNub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &191754 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 404142} + m_Layer: 0 + m_Name: GRFL_L_UpperEyelid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &192738 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 452474} + m_Layer: 0 + m_Name: GRFL_L_Nostril + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &193178 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 472714} + m_Layer: 0 + m_Name: GRFL_R_UpLegTwist + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &195614 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 484980} + m_Layer: 0 + m_Name: GRFL_L_Cheek + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &198266 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 431818} + m_Layer: 0 + m_Name: GRFL_L_HandThumb2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &198864 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 456620} + m_Layer: 0 + m_Name: GRFL_R_LipLower + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &199248 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 410232} + m_Layer: 0 + m_Name: GRFL_R_HandIndex3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &199932 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 4 + m_Component: + - 4: {fileID: 465644} + m_Layer: 0 + m_Name: GRFL_L_ToetCont1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400154 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 142264} + m_LocalRotation: {x: 6.61145241e-05, y: -6.89428707e-05, z: -.707106352, w: .707107186} + m_LocalPosition: {x: -.078656666, y: .124515928, z: 8.99999975e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 439752} + - {fileID: 465644} + - {fileID: 419266} + m_Father: {fileID: 405548} + m_RootOrder: 4 +--- !u!4 &401824 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 175766} + m_LocalRotation: {x: -.70710665, y: 0, z: -0, w: .707106888} + m_LocalPosition: {x: .0310985744, y: 1.70279586, z: .0612821952} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 498680} + m_RootOrder: 5 +--- !u!4 &403482 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 141850} + m_LocalRotation: {x: 6.47002817e-05, y: 6.47002598e-05, z: .707106709, w: .707106888} + m_LocalPosition: {x: -.0822167844, y: -.00128129998, z: 3.44999989e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 459106} + - {fileID: 456620} + m_Father: {fileID: 443216} + m_RootOrder: 1 +--- !u!4 &404142 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 191754} + m_LocalRotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + m_LocalPosition: {x: -.0727746412, y: .0889763609, z: .0311018396} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 457388} + m_Father: {fileID: 464154} + m_RootOrder: 8 +--- !u!4 &404224 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 150394} + m_LocalRotation: {x: -3.74583237e-06, y: 6.33081214e-08, z: -1.39674705e-09, w: 1} + m_LocalPosition: {x: -.218939915, y: -2.45809542e-06, z: 2.53677354e-06} + m_LocalScale: {x: .999999821, y: 1.00000024, z: .99999994} + m_Children: [] + m_Father: {fileID: 438476} + m_RootOrder: 1 +--- !u!4 &404372 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168314} + m_LocalRotation: {x: .704738617, y: .057397712, z: -.0571566224, w: .704827726} + m_LocalPosition: {x: -.26147002, y: 6.97999985e-06, z: 4.87999978e-06} + m_LocalScale: {x: 1, y: 1, z: .999997973} + m_Children: + - {fileID: 431650} + - {fileID: 470936} + - {fileID: 467358} + - {fileID: 479646} + - {fileID: 447940} + - {fileID: 459058} + m_Father: {fileID: 466656} + m_RootOrder: 1 +--- !u!4 &404538 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 170820} + m_LocalRotation: {x: 2.99999992e-05, y: -.000127000007, z: 3.81000032e-09, w: 1} + m_LocalPosition: {x: -.0275520291, y: 4.59999995e-07, z: -9.99999994e-09} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 446666} + m_Father: {fileID: 475180} + m_RootOrder: 0 +--- !u!4 &404874 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 136700} + m_LocalRotation: {x: 6.36395362e-06, y: -1.41424971e-06, z: .707102835, w: .707110822} + m_LocalPosition: {x: -.0821328238, y: .0395425186, z: 3.80999973e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 443216} + m_RootOrder: 0 +--- !u!4 &405548 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 107820} + m_LocalRotation: {x: -7.3727897e-06, y: 1.90497231e-05, z: -.00668644998, w: .999977648} + m_LocalPosition: {x: -.437879831, y: -4.75999968e-06, z: 4.94999995e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 461492} + - {fileID: 498156} + - {fileID: 486390} + - {fileID: 466814} + - {fileID: 400154} + m_Father: {fileID: 438476} + m_RootOrder: 0 +--- !u!4 &405942 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 127544} + m_LocalRotation: {x: -1.65000001e-05, y: -.000118999997, z: -1.96350003e-09, w: 1} + m_LocalPosition: {x: -.0275521111, y: 0, z: 9.99999941e-08} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 499164} + m_Father: {fileID: 412548} + m_RootOrder: 0 +--- !u!4 &406288 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183398} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0510689206, y: -1.19999996e-07, z: -4.47999992e-06} + m_LocalScale: {x: 1, y: .999998987, z: 1.00000095} + m_Children: [] + m_Father: {fileID: 459452} + m_RootOrder: 0 +--- !u!4 &409512 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 109926} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.00331833004, y: .00914276019, z: -8.54999962e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 474968} + m_RootOrder: 0 +--- !u!4 &410232 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 199248} + m_LocalRotation: {x: 0, y: 6.50000002e-05, z: -0, w: 1} + m_LocalPosition: {x: -.02727261, y: -1.49999991e-07, z: -4.9999997e-08} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 412732} + m_Father: {fileID: 475568} + m_RootOrder: 0 +--- !u!4 &410480 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 119290} + m_LocalRotation: {x: .500124931, y: .499904811, z: .500124931, w: -.499845207} + m_LocalPosition: {x: -.070400089, y: -.00999180041, z: -.0468617566} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459452} + m_RootOrder: 1 +--- !u!4 &412548 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 127538} + m_LocalRotation: {x: 0, y: -0, z: -1.15000003e-05, w: 1} + m_LocalPosition: {x: -.0390045568, y: 9.09999983e-07, z: -1.49999991e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 405942} + m_Father: {fileID: 445528} + m_RootOrder: 0 +--- !u!4 &412732 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 131210} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0224963389, y: 4.89999991e-07, z: -6.09999972e-07} + m_LocalScale: {x: .99999702, y: 1.00000298, z: 1} + m_Children: [] + m_Father: {fileID: 410232} + m_RootOrder: 0 +--- !u!4 &412806 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 150348} + m_LocalRotation: {x: 3.7475188e-06, y: -4.02979161e-08, z: -8.3817504e-09, w: 1} + m_LocalPosition: {x: -.218940049, y: -2.26974475e-06, z: 1.67846679e-06} + m_LocalScale: {x: 1.00000012, y: .999999642, z: 1} + m_Children: [] + m_Father: {fileID: 454826} + m_RootOrder: 1 +--- !u!4 &415134 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 185846} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.0883542076, y: .0881281048, z: .0408725962} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 3 +--- !u!4 &415578 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181102} + m_LocalRotation: {x: -3.64856169e-05, y: -2.83899606e-08, z: -2.25790284e-08, w: 1} + m_LocalPosition: {x: -.137837648, y: -5.60283661e-06, z: -9.30786155e-06} + m_LocalScale: {x: 1.00000012, y: 1, z: .999999881} + m_Children: [] + m_Father: {fileID: 473398} + m_RootOrder: 0 +--- !u!4 &417692 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 109086} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0304246489, y: -1.89999994e-07, z: -1.21999994e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 433150} + m_Father: {fileID: 431818} + m_RootOrder: 0 +--- !u!4 &418938 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 111458} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0317073092, y: -4.89999991e-07, z: -6.09999972e-07} + m_LocalScale: {x: .999997973, y: 1.00000298, z: 1} + m_Children: [] + m_Father: {fileID: 467568} + m_RootOrder: 0 +--- !u!4 &419266 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 160022} + m_LocalRotation: {x: .500061929, y: .49987787, z: .500061929, w: -.499998301} + m_LocalPosition: {x: -.070401907, y: -.0100093195, z: -.0511376448} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 400154} + m_RootOrder: 2 +--- !u!4 &420418 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120454} + m_LocalRotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + m_LocalPosition: {x: -.0675242394, y: .0730532706, z: .0310988799} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 5 +--- !u!4 &422052 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130534} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: .00144179992, y: -.00500230026, z: -.0130937696} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 496744} + m_RootOrder: 1 +--- !u!4 &422310 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152394} + m_LocalRotation: {x: 0, y: 0, z: .116483465, w: .993192673} + m_LocalPosition: {x: -.0304686688, y: .0110845398, z: 9.19999991e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 427104} + m_Father: {fileID: 443216} + m_RootOrder: 2 +--- !u!4 &422722 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 106402} + m_LocalRotation: {x: .563405216, y: .511973381, z: .42418623, w: -.490432322} + m_LocalPosition: {x: -.0882387832, y: -.0690806061, z: -.0922938809} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 450682} + m_RootOrder: 2 +--- !u!4 &422894 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 122418} + m_LocalRotation: {x: 0, y: -0, z: -.0275969971, w: .999619186} + m_LocalPosition: {x: -.102978058, y: 2.20999982e-06, z: 5.80000005e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 487626} + m_Father: {fileID: 450638} + m_RootOrder: 0 +--- !u!4 &423724 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 158928} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.041046463, y: .123948783, z: -2.02000001e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 452474} + - {fileID: 443526} + m_Father: {fileID: 464154} + m_RootOrder: 10 +--- !u!4 &425346 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 132176} + m_LocalRotation: {x: -8.80000298e-05, y: -5.49955985e-06, z: -5.00048418e-06, w: 1} + m_LocalPosition: {x: .00237747002, y: .00998201035, z: -1.01300002e-05} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 471694} + m_RootOrder: 0 +--- !u!4 &426816 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 133598} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.028859688, y: .0934220776, z: -.0355835892} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 13 +--- !u!4 &427104 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 187808} + m_LocalRotation: {x: 0, y: -0, z: -.069369249, w: .997591078} + m_LocalPosition: {x: -.0200694297, y: 1.49999991e-07, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 448332} + m_Father: {fileID: 422310} + m_RootOrder: 0 +--- !u!4 &430404 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 153300} + m_LocalRotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + m_LocalPosition: {x: -.0886569843, y: -.0457840897, z: -.0468581393} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 436540} + m_RootOrder: 1 +--- !u!4 &431194 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 162614} + m_LocalRotation: {x: .707105458, y: .70710808, z: -.000160443684, w: -.000114871196} + m_LocalPosition: {x: -.0912700668, y: .00989476964, z: -1.65000006e-06} + m_LocalScale: {x: 1, y: .999997973, z: 1.00000405} + m_Children: [] + m_Father: {fileID: 487294} + m_RootOrder: 5 +--- !u!4 &431650 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 191256} + m_LocalRotation: {x: -9.56464191e-06, y: -5.78944082e-06, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.0957772136, y: -.0151400398, z: .0346599594} + m_LocalScale: {x: 1, y: 1, z: 1.00000405} + m_Children: + - {fileID: 475568} + m_Father: {fileID: 404372} + m_RootOrder: 0 +--- !u!4 &431818 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 198266} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0357955508, y: -1.04999992e-06, z: -1.36999995e-06} + m_LocalScale: {x: 1.00000203, y: 1, z: 1} + m_Children: + - {fileID: 417692} + m_Father: {fileID: 445046} + m_RootOrder: 0 +--- !u!4 &433150 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 144160} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0317073092, y: -3.99999976e-07, z: -6.09999972e-07} + m_LocalScale: {x: .999997973, y: 1, z: 1.00000203} + m_Children: [] + m_Father: {fileID: 417692} + m_RootOrder: 0 +--- !u!4 &434940 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 162676} + m_LocalRotation: {x: -2.48420947e-05, y: 2.23489245e-08, z: 2.18793836e-08, w: 1} + m_LocalPosition: {x: -.130735159, y: 3.43799593e-06, z: 2.89916989e-06} + m_LocalScale: {x: .99999994, y: .999999881, z: .999999821} + m_Children: [] + m_Father: {fileID: 466656} + m_RootOrder: 0 +--- !u!4 &435664 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 105226} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.0883541852, y: .0881272778, z: -.0408759005} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 12 +--- !u!4 &435972 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 121946} + m_LocalRotation: {x: -.70710665, y: 0, z: -0, w: .707106888} + m_LocalPosition: {x: 2.99999989e-08, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 498680} + m_RootOrder: 0 +--- !u!4 &436540 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168788} + m_LocalRotation: {x: 7.3727897e-06, y: -1.90497231e-05, z: -.00668644998, w: .999977648} + m_LocalPosition: {x: -.437880158, y: -4.53999974e-06, z: 3.23999984e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 487270} + - {fileID: 430404} + - {fileID: 487086} + - {fileID: 437998} + - {fileID: 459452} + m_Father: {fileID: 454826} + m_RootOrder: 0 +--- !u!4 &437268 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168570} + m_LocalRotation: {x: 1.48831407e-06, y: -1.86872967e-07, z: -.12458197, w: .992209315} + m_LocalPosition: {x: -.270938993, y: -3.39999985e-07, z: 3.30000006e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 464154} + m_Father: {fileID: 487626} + m_RootOrder: 1 +--- !u!4 &437520 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 110430} + m_LocalRotation: {x: -5.75000013e-05, y: -6.80000012e-05, z: -3.91000032e-09, w: 1} + m_LocalPosition: {x: -.0272727199, y: -5.29999966e-07, z: 5.99999979e-08} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 450208} + m_Father: {fileID: 479494} + m_RootOrder: 0 +--- !u!4 &437540 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 140436} + m_LocalRotation: {x: -.70710665, y: 0, z: -0, w: .707106888} + m_LocalPosition: {x: 6.49886147e-07, y: 1.70273316, z: .0772180185} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 498680} + m_RootOrder: 3 +--- !u!4 &437998 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 108718} + m_LocalRotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + m_LocalPosition: {x: -.0886553451, y: -.0457844883, z: .0511418656} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 436540} + m_RootOrder: 3 +--- !u!4 &438476 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 179838} + m_LocalRotation: {x: 1.3082994e-05, y: -1.14054956e-05, z: .00724643702, w: .999973774} + m_LocalPosition: {x: -.44575575, y: 3.0999999e-07, z: 1.05499994e-05} + m_LocalScale: {x: 1, y: 1, z: .999998987} + m_Children: + - {fileID: 405548} + - {fileID: 404224} + m_Father: {fileID: 450682} + m_RootOrder: 0 +--- !u!4 &438780 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161962} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.083049193, y: .0964708105, z: -.01360247} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 11 +--- !u!4 &439752 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 155758} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.051063519, y: -9.00000003e-08, z: -4.19999969e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 400154} + m_RootOrder: 0 +--- !u!4 &441090 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 172200} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0322008096, y: -2.60000002e-06, z: -5.19999958e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 454852} + m_Father: {fileID: 497346} + m_RootOrder: 0 +--- !u!4 &442400 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 129382} + m_LocalRotation: {x: 6.50003403e-06, y: -2.29189023e-09, z: 5.52974111e-09, w: 1} + m_LocalPosition: {x: -.2228778, y: 2.5272368e-07, z: 5.02586363e-06} + m_LocalScale: {x: 1.00000024, y: .999999762, z: .999999881} + m_Children: [] + m_Father: {fileID: 450682} + m_RootOrder: 1 +--- !u!4 &443216 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 180752} + m_LocalRotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + m_LocalPosition: {x: -.0024800098, y: .0243914202, z: -4.73e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 404874} + - {fileID: 403482} + - {fileID: 422310} + m_Father: {fileID: 464154} + m_RootOrder: 1 +--- !u!4 &443526 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183904} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: .00969987921, y: -.0171997491, z: -.01500249} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 423724} + m_RootOrder: 1 +--- !u!4 &445046 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 166356} + m_LocalRotation: {x: .373463929, y: -.322897226, z: .210430756, w: .843789637} + m_LocalPosition: {x: -.02020308, y: .00359573006, z: -.0426593497} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 431818} + m_Father: {fileID: 487294} + m_RootOrder: 4 +--- !u!4 &445520 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 160076} + m_LocalRotation: {x: 8.00003982e-05, y: 5.34993997e-05, z: -7.50427989e-06, w: 1} + m_LocalPosition: {x: -.0256996099, y: -9.19999991e-07, z: -2.79999995e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 476844} + m_Father: {fileID: 449870} + m_RootOrder: 0 +--- !u!4 &445528 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 101800} + m_LocalRotation: {x: .000173987937, y: 1.95817938e-05, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.0964138359, y: -.0195490494, z: -.0124867} + m_LocalScale: {x: 1, y: 1, z: 1.00000203} + m_Children: + - {fileID: 412548} + m_Father: {fileID: 487294} + m_RootOrder: 1 +--- !u!4 &446666 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118600} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0263427701, y: 1.09999995e-07, z: -1.49999991e-07} + m_LocalScale: {x: 1.00001705, y: .999994993, z: .999988019} + m_Children: [] + m_Father: {fileID: 404538} + m_RootOrder: 0 +--- !u!4 &447440 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168444} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0242307298, y: 3.0999999e-07, z: 0} + m_LocalScale: {x: .999997973, y: 1.00000203, z: 1} + m_Children: [] + m_Father: {fileID: 491068} + m_RootOrder: 0 +--- !u!4 &447940 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 125038} + m_LocalRotation: {x: -.373463929, y: .322897226, z: .210430756, w: .843789637} + m_LocalPosition: {x: -.0202066395, y: .00359566975, z: .0426644906} + m_LocalScale: {x: .999997973, y: 1.00000203, z: 1.00000203} + m_Children: + - {fileID: 496538} + m_Father: {fileID: 404372} + m_RootOrder: 4 +--- !u!4 &448332 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130584} + m_LocalRotation: {x: 0, y: -0, z: -.0400008224, w: .999199629} + m_LocalPosition: {x: -.0180615783, y: 1.49999991e-07, z: 1.49999991e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 427104} + m_RootOrder: 0 +--- !u!4 &449310 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116364} + m_LocalRotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + m_LocalPosition: {x: -.0618235581, y: .088723354, z: .031141039} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 460656} + m_Father: {fileID: 464154} + m_RootOrder: 7 +--- !u!4 &449870 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 101328} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0322008617, y: -3.20999993e-06, z: -3.79999989e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 445520} + m_Father: {fileID: 479646} + m_RootOrder: 0 +--- !u!4 &450208 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 173266} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0224964898, y: 9.09999983e-07, z: -4.59999995e-07} + m_LocalScale: {x: .999998987, y: 1.00000095, z: 1} + m_Children: [] + m_Father: {fileID: 437520} + m_RootOrder: 0 +--- !u!4 &450638 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 184948} + m_LocalRotation: {x: -1.49953007e-06, y: 4.00017643e-06, z: -.0001175, w: 1} + m_LocalPosition: {x: -.0537130684, y: -1.09999995e-07, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 422894} + m_Father: {fileID: 480030} + m_RootOrder: 2 +--- !u!4 &450682 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161876} + m_LocalRotation: {x: -.000547499978, y: .999999881, z: 4.50182233e-06, w: 3.32648733e-06} + m_LocalPosition: {x: .0054277, y: -.0184652992, z: .0936542526} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 438476} + - {fileID: 442400} + - {fileID: 422722} + m_Father: {fileID: 480030} + m_RootOrder: 0 +--- !u!4 &452474 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 192738} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: .00970000029, y: -.0171994604, z: .015002789} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 423724} + m_RootOrder: 0 +--- !u!4 &454826 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 175298} + m_LocalRotation: {x: -1.3082994e-05, y: 1.14054956e-05, z: .00724643702, w: .999973774} + m_LocalPosition: {x: -.44575569, y: 4.09999984e-07, z: -2.90999992e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 436540} + - {fileID: 412806} + m_Father: {fileID: 482300} + m_RootOrder: 0 +--- !u!4 &454852 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 113384} + m_LocalRotation: {x: -8.3000501e-05, y: -6.74993789e-05, z: -7.5056023e-06, w: 1} + m_LocalPosition: {x: -.0256997608, y: -1.67999997e-06, z: -3.70000009e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 469578} + m_Father: {fileID: 441090} + m_RootOrder: 0 +--- !u!4 &455590 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 121176} + m_LocalRotation: {x: -7.29987951e-05, y: -2.30038331e-05, z: 5.24983225e-05, w: 1} + m_LocalPosition: {x: -.275676727, y: -1.8499999e-05, z: -1.8570001e-05} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 470114} + - {fileID: 487294} + m_Father: {fileID: 473398} + m_RootOrder: 1 +--- !u!4 &456528 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 125092} + m_LocalRotation: {x: -.70710665, y: 0, z: -0, w: .707106888} + m_LocalPosition: {x: -.0310997386, y: 1.70279586, z: .0612821952} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 498680} + m_RootOrder: 4 +--- !u!4 &456572 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 125292} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.0830490887, y: .096471101, z: .0135989897} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 2 +--- !u!4 &456620 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 198864} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: .00061280001, y: -.00284874998, z: -.01110797} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 403482} + m_RootOrder: 1 +--- !u!4 &457004 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 129262} + m_LocalRotation: {x: 9.56464191e-06, y: 5.78944082e-06, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.0813450962, y: -.0131341899, z: .0287686102} + m_LocalScale: {x: 1, y: 1, z: 1.00000203} + m_Children: + - {fileID: 465182} + m_Father: {fileID: 487294} + m_RootOrder: 2 +--- !u!4 &457220 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 104578} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0261873286, y: -2.99999982e-07, z: -9.00000003e-08} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 486430} + m_Father: {fileID: 467358} + m_RootOrder: 0 +--- !u!4 &457388 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 174508} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.00331923994, y: .00914268009, z: -4.11999963e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 404142} + m_RootOrder: 0 +--- !u!4 &459058 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181996} + m_LocalRotation: {x: .000159099262, y: -.000111015412, z: -.707105219, w: .707108319} + m_LocalPosition: {x: -.0912747234, y: .00989434961, z: -1.19999993e-06} + m_LocalScale: {x: 1, y: .999998987, z: 1.00000501} + m_Children: [] + m_Father: {fileID: 404372} + m_RootOrder: 5 +--- !u!4 &459106 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 110444} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: .000612639997, y: -.00284460979, z: .0111090392} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 403482} + m_RootOrder: 0 +--- !u!4 &459262 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 191368} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0242307298, y: -1.29999989e-07, z: 3.0999999e-07} + m_LocalScale: {x: 1.00000405, y: 1, z: .99999702} + m_Children: [] + m_Father: {fileID: 486430} + m_RootOrder: 0 +--- !u!4 &459452 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 148726} + m_LocalRotation: {x: -6.61145241e-05, y: 6.89428707e-05, z: -.707106352, w: .707107186} + m_LocalPosition: {x: -.0786561966, y: .124515735, z: 2.37999984e-06} + m_LocalScale: {x: .999998987, y: 1, z: 1} + m_Children: + - {fileID: 406288} + - {fileID: 410480} + - {fileID: 480060} + m_Father: {fileID: 436540} + m_RootOrder: 4 +--- !u!4 &460656 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 163560} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: .00237685977, y: .00998187996, z: -4.27999976e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 449310} + m_RootOrder: 0 +--- !u!4 &461492 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152566} + m_LocalRotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + m_LocalPosition: {x: -.0886563882, y: .124516055, z: .0468611196} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 405548} + m_RootOrder: 0 +--- !u!4 &463418 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189202} + m_LocalRotation: {x: -.42418626, y: -.490432173, z: -.563405335, w: .511973381} + m_LocalPosition: {x: -.0882377103, y: -.0690808371, z: .092299208} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 482300} + m_RootOrder: 2 +--- !u!4 &464154 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 109366} + m_LocalRotation: {x: 3.77128345e-06, y: -3.20584172e-06, z: .0807773992, w: .996732175} + m_LocalPosition: {x: -.121566005, y: 5.69999997e-07, z: 1.89999994e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 487702} + - {fileID: 443216} + - {fileID: 456572} + - {fileID: 415134} + - {fileID: 484980} + - {fileID: 420418} + - {fileID: 498224} + - {fileID: 449310} + - {fileID: 404142} + - {fileID: 496744} + - {fileID: 423724} + - {fileID: 438780} + - {fileID: 435664} + - {fileID: 426816} + - {fileID: 490544} + - {fileID: 469164} + - {fileID: 471694} + - {fileID: 474968} + m_Father: {fileID: 437268} + m_RootOrder: 0 +--- !u!4 &464718 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 137460} + m_LocalRotation: {x: .0651536882, y: -.10150025, z: .0453099608, w: .991665125} + m_LocalPosition: {x: -.142526835, y: 1.82999997e-06, z: -1.07999995e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 480668} + - {fileID: 466656} + m_Father: {fileID: 485440} + m_RootOrder: 0 +--- !u!4 &465182 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161168} + m_LocalRotation: {x: -1.70003823e-05, y: -.000152999957, z: -2.50260109e-06, w: 1} + m_LocalPosition: {x: -.0261870194, y: 7.59999978e-07, z: -1.59999999e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 491068} + m_Father: {fileID: 457004} + m_RootOrder: 0 +--- !u!4 &465374 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 106304} + m_LocalRotation: {x: -.707106471, y: -6.1817218e-08, z: 6.18172749e-08, w: .707107186} + m_LocalPosition: {x: -9.03975092e-07, y: 1.63601053, z: .0691113248} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 498680} + m_RootOrder: 2 +--- !u!4 &465644 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 199932} + m_LocalRotation: {x: .500061929, y: .49987787, z: .500061929, w: -.499998301} + m_LocalPosition: {x: -.0703999251, y: -.00999072008, z: .0468623787} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 400154} + m_RootOrder: 1 +--- !u!4 &466656 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120156} + m_LocalRotation: {x: 7.29987951e-05, y: 2.30038331e-05, z: 5.24983225e-05, w: 1} + m_LocalPosition: {x: -.275677025, y: -2.03e-05, z: 1.87699989e-05} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 434940} + - {fileID: 404372} + m_Father: {fileID: 464718} + m_RootOrder: 1 +--- !u!4 &466814 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 136914} + m_LocalRotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + m_LocalPosition: {x: -.0886562318, y: -.0457840376, z: -.0511387922} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 405548} + m_RootOrder: 3 +--- !u!4 &467358 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189190} + m_LocalRotation: {x: -9.56464191e-06, y: -5.78944082e-06, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.0813494921, y: -.0131344292, z: -.0287625287} + m_LocalScale: {x: 1, y: 1, z: 1.00000405} + m_Children: + - {fileID: 457220} + m_Father: {fileID: 404372} + m_RootOrder: 2 +--- !u!4 &467568 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 129190} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0304582585, y: 7.99999995e-08, z: -1.06999994e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 418938} + m_Father: {fileID: 496538} + m_RootOrder: 0 +--- !u!4 &469164 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 148654} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.00183150999, y: .096582219, z: -.0230295788} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 15 +--- !u!4 &469578 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 143130} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0251795184, y: -2.32000002e-06, z: 4.11999963e-06} + m_LocalScale: {x: .999998987, y: 1.00000203, z: .999998987} + m_Children: [] + m_Father: {fileID: 454852} + m_RootOrder: 0 +--- !u!4 &470114 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 150944} + m_LocalRotation: {x: 2.48327797e-05, y: 2.23531131e-08, z: 4.60882568e-08, w: 1} + m_LocalPosition: {x: -.130735159, y: 6.78539254e-06, z: -2.4414062e-06} + m_LocalScale: {x: 1, y: .999999881, z: 1} + m_Children: [] + m_Father: {fileID: 455590} + m_RootOrder: 0 +--- !u!4 &470936 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 151642} + m_LocalRotation: {x: -.000173987937, y: -1.95817938e-05, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.0964141861, y: -.0195488594, z: .0124897398} + m_LocalScale: {x: 1, y: 1, z: 1.00000405} + m_Children: + - {fileID: 475180} + m_Father: {fileID: 404372} + m_RootOrder: 1 +--- !u!4 &471694 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 165282} + m_LocalRotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + m_LocalPosition: {x: -.0618235767, y: .0887227133, z: -.0311443489} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 425346} + m_Father: {fileID: 464154} + m_RootOrder: 16 +--- !u!4 &472714 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 193178} + m_LocalRotation: {x: -6.49628737e-06, y: -1.91790939e-08, z: 1.86252058e-09, w: 1} + m_LocalPosition: {x: -.222877577, y: 2.12192532e-07, z: -1.44004821e-06} + m_LocalScale: {x: 1, y: 1.00000048, z: .999999881} + m_Children: [] + m_Father: {fileID: 482300} + m_RootOrder: 1 +--- !u!4 &473398 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161556} + m_LocalRotation: {x: -.0651536882, y: .10150025, z: .0453099608, w: .991665125} + m_LocalPosition: {x: -.142532095, y: 2.43e-06, z: 2.14999977e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 415578} + - {fileID: 455590} + m_Father: {fileID: 482206} + m_RootOrder: 0 +--- !u!4 &474136 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 171416} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: .00144195999, y: -.00500203017, z: .0130938692} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 496744} + m_RootOrder: 0 +--- !u!4 &474968 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 169628} + m_LocalRotation: {x: 8.79999934e-05, y: 4.00017598e-06, z: 1.99964802e-06, w: 1} + m_LocalPosition: {x: -.0727746561, y: .088975735, z: -.0311051607} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 409512} + m_Father: {fileID: 464154} + m_RootOrder: 17 +--- !u!4 &475180 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 148386} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0390049778, y: 6.09999972e-07, z: -1.09999995e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 404538} + m_Father: {fileID: 470936} + m_RootOrder: 0 +--- !u!4 &475568 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 188612} + m_LocalRotation: {x: 2.34000014e-10, y: 5.19999994e-05, z: -4.50000016e-06, w: 1} + m_LocalPosition: {x: -.03433479, y: -1.49999991e-07, z: 1.19999996e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 410232} + m_Father: {fileID: 431650} + m_RootOrder: 0 +--- !u!4 &476532 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 180732} + m_LocalRotation: {x: 9.56464191e-06, y: 5.78944082e-06, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.095776327, y: -.0151403099, z: -.0346578397} + m_LocalScale: {x: 1, y: 1, z: 1.00000203} + m_Children: + - {fileID: 479494} + m_Father: {fileID: 487294} + m_RootOrder: 0 +--- !u!4 &476844 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 106786} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0251793694, y: -2.66999996e-06, z: 4.42999999e-06} + m_LocalScale: {x: 1.00001597, y: .999996006, z: .999988019} + m_Children: [] + m_Father: {fileID: 445520} + m_RootOrder: 0 +--- !u!4 &479494 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 121084} + m_LocalRotation: {x: 0, y: -0, z: -2.20000002e-05, w: 1} + m_LocalPosition: {x: -.0343346, y: 1.06999994e-06, z: 9.00000003e-08} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 437520} + m_Father: {fileID: 476532} + m_RootOrder: 0 +--- !u!4 &479646 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 145962} + m_LocalRotation: {x: -9.96748986e-06, y: -8.0569572e-07, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.0907426402, y: -.0154802399, z: -.00950896926} + m_LocalScale: {x: 1, y: 1, z: 1.00000405} + m_Children: + - {fileID: 449870} + m_Father: {fileID: 404372} + m_RootOrder: 3 +--- !u!4 &480030 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 171172} + m_LocalRotation: {x: .499992251, y: -.500008643, z: -.499995261, w: .500003874} + m_LocalPosition: {x: 6.99999987e-08, y: .977680087, z: -.0136898803} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 450682} + - {fileID: 482300} + - {fileID: 450638} + m_Father: {fileID: 498680} + m_RootOrder: 1 +--- !u!4 &480060 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181958} + m_LocalRotation: {x: .500124931, y: .499904811, z: .500124931, w: -.499845207} + m_LocalPosition: {x: -.070400089, y: -.0100088995, z: .0511382371} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 459452} + m_RootOrder: 2 +--- !u!4 &480668 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 188378} + m_LocalRotation: {x: 3.64726584e-05, y: -5.00423631e-08, z: -3.9361332e-09, w: 1} + m_LocalPosition: {x: -.137838468, y: -1.01900096e-05, z: 9.30786155e-06} + m_LocalScale: {x: 1, y: 1, z: 1.00000024} + m_Children: [] + m_Father: {fileID: 464718} + m_RootOrder: 0 +--- !u!4 &482206 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100222} + m_LocalRotation: {x: -.628225923, y: .0417463295, z: .768776059, w: .112128533} + m_LocalPosition: {x: -.262152851, y: -.0135208592, z: .0175698902} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 473398} + m_Father: {fileID: 487626} + m_RootOrder: 0 +--- !u!4 &482300 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 179978} + m_LocalRotation: {x: -.000547499978, y: .999999881, z: -4.50182233e-06, w: -3.32648733e-06} + m_LocalPosition: {x: .00542636961, y: -.0184656493, z: -.093649976} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 454826} + - {fileID: 472714} + - {fileID: 463418} + m_Father: {fileID: 480030} + m_RootOrder: 1 +--- !u!4 &484980 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 195614} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.028859688, y: .0934227705, z: .0355801694} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 4 +--- !u!4 &485100 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 188248} + m_LocalRotation: {x: -.70710665, y: -1.68587263e-07, z: 8.4293697e-07, w: .707106888} + m_LocalPosition: {x: -9.08386312e-07, y: 1.62666678, z: .0430899039} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 498680} + m_RootOrder: 6 +--- !u!4 &485440 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 174158} + m_LocalRotation: {x: .628225923, y: -.0417466648, z: .768776, w: .112128943} + m_LocalPosition: {x: -.262152821, y: -.0135208089, z: -.0175733902} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 464718} + m_Father: {fileID: 487626} + m_RootOrder: 2 +--- !u!4 &486390 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 117628} + m_LocalRotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + m_LocalPosition: {x: -.088656269, y: .12451598, z: -.0511388779} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 405548} + m_RootOrder: 2 +--- !u!4 &486430 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 104270} + m_LocalRotation: {x: 5.50000004e-05, y: .000142000019, z: -7.81000065e-09, w: 1} + m_LocalPosition: {x: -.0207360797, y: 6.09999972e-07, z: 7.99999995e-08} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 459262} + m_Father: {fileID: 457220} + m_RootOrder: 0 +--- !u!4 &486506 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 180218} + m_LocalRotation: {x: -.70710665, y: 0, z: -0, w: .707106888} + m_LocalPosition: {x: -8.79835682e-07, y: 1.63601053, z: .0690995753} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 498680} + m_RootOrder: 7 +--- !u!4 &487086 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 146262} + m_LocalRotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + m_LocalPosition: {x: -.0886554122, y: .124515474, z: .0511425473} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 436540} + m_RootOrder: 2 +--- !u!4 &487270 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 156546} + m_LocalRotation: {x: .707106829, y: -6.26143765e-06, z: .707106829, w: -5.97896678e-06} + m_LocalPosition: {x: -.0886570364, y: .124515876, z: -.0468574688} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 436540} + m_RootOrder: 0 +--- !u!4 &487294 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 114816} + m_LocalRotation: {x: -.704738617, y: -.057397712, z: -.0571566224, w: .704827726} + m_LocalPosition: {x: -.261472285, y: 8.44999977e-06, z: -4.74999979e-06} + m_LocalScale: {x: .999998987, y: 1, z: .999998987} + m_Children: + - {fileID: 476532} + - {fileID: 445528} + - {fileID: 457004} + - {fileID: 497346} + - {fileID: 445046} + - {fileID: 431194} + m_Father: {fileID: 455590} + m_RootOrder: 1 +--- !u!4 &487626 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 136872} + m_LocalRotation: {x: -9.97427151e-07, y: -7.16884614e-08, z: .0716884658, w: .997427106} + m_LocalPosition: {x: -.11120224, y: -4.09999984e-07, z: 1.19999996e-07} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 482206} + - {fileID: 437268} + - {fileID: 485440} + m_Father: {fileID: 422894} + m_RootOrder: 0 +--- !u!4 &487702 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 180766} + m_LocalRotation: {x: -3.50048822e-06, y: 3.49951165e-06, z: .000139500014, w: 1} + m_LocalPosition: {x: -.156721354, y: -1.19999996e-07, z: 2.86899995e-05} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 0 +--- !u!4 &490544 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 128914} + m_LocalRotation: {x: -5.6568565e-06, y: 7.07094387e-07, z: -.707105279, w: .707108378} + m_LocalPosition: {x: -.0675247237, y: .0730528757, z: -.0310994405} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 14 +--- !u!4 &491068 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 135548} + m_LocalRotation: {x: .000117000003, y: -.000146999999, z: 1.71990013e-08, w: 1} + m_LocalPosition: {x: -.0207361598, y: 2.99999982e-07, z: -4.9999997e-08} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 447440} + m_Father: {fileID: 465182} + m_RootOrder: 0 +--- !u!4 &496538 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 184056} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0357957408, y: -7.79999937e-07, z: -1.05999993e-06} + m_LocalScale: {x: 1.00000405, y: .999998987, z: .99999702} + m_Children: + - {fileID: 467568} + m_Father: {fileID: 447940} + m_RootOrder: 0 +--- !u!4 &496744 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 128298} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.00767929014, y: .113349177, z: -1.91000004e-06} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 474136} + - {fileID: 422052} + m_Father: {fileID: 464154} + m_RootOrder: 9 +--- !u!4 &497346 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 186114} + m_LocalRotation: {x: 9.96748986e-06, y: 8.0569572e-07, z: .0805695727, w: .996748984} + m_LocalPosition: {x: -.0907382146, y: -.0154798096, z: .00950988941} + m_LocalScale: {x: 1, y: 1, z: 1.00000203} + m_Children: + - {fileID: 441090} + m_Father: {fileID: 487294} + m_RootOrder: 3 +--- !u!4 &498156 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 182030} + m_LocalRotation: {x: .707107186, y: -3.01302111e-06, z: .707106352, w: 3.01302452e-06} + m_LocalPosition: {x: -.0886563435, y: -.0457840003, z: .046861209} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 405548} + m_RootOrder: 1 +--- !u!4 &498224 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 128220} + m_LocalRotation: {x: -3.49999999e-12, y: -9.99999997e-07, z: -3.50000005e-06, w: 1} + m_LocalPosition: {x: -.00183150999, y: .0965826884, z: .0230260883} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 464154} + m_RootOrder: 6 +--- !u!4 &498680 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161618} + m_LocalRotation: {x: -1.33158053e-07, y: 0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 435972} + - {fileID: 480030} + - {fileID: 465374} + - {fileID: 437540} + - {fileID: 456528} + - {fileID: 401824} + - {fileID: 485100} + - {fileID: 486506} + m_Father: {fileID: 0} + m_RootOrder: 0 +--- !u!4 &499164 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120932} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -.0263429992, y: 3.99999976e-07, z: 0} + m_LocalScale: {x: .99999702, y: 1.00000298, z: 1} + m_Children: [] + m_Father: {fileID: 405942} + m_RootOrder: 0 +--- !u!95 &9532216 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161618} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 1 + m_UpdateMode: 0 + m_ApplyRootMotion: 1 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!137 &13703752 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 125092} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: 234af14dc174fea43ac67396cc7a629d, type: 2} + - {fileID: 2100000, guid: 6d1c7e083b931724694854819181f2c0, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_Mesh: {fileID: 4300004, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Bones: + - {fileID: 420418} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 420418} + m_AABB: + m_Center: {x: -.00233746041, y: 9.48086381e-07, z: 4.44240868e-07} + m_Extent: {x: .0132346572, y: .0155686736, z: .0155686196} + m_DirtyAABB: 0 +--- !u!137 &13708650 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 180218} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: dd784f0da77ffee4a94c8b87e5742319, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_Mesh: {fileID: 4300002, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Bones: + - {fileID: 464154} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 464154} + m_AABB: + m_Center: {x: -.00688338559, y: .0829520077, z: -4.71249223e-07} + m_Extent: {x: .00702434871, y: .0204528347, z: .0240029898} + m_DirtyAABB: 0 +--- !u!137 &13716978 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 106304} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: dd784f0da77ffee4a94c8b87e5742319, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_Mesh: {fileID: 4300006, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Bones: + - {fileID: 443216} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 443216} + m_AABB: + m_Center: {x: -.0569811873, y: .00978237018, z: 4.53367829e-06} + m_Extent: {x: .0207121782, y: .00833300501, z: .0240090992} + m_DirtyAABB: 0 +--- !u!137 &13755412 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 175766} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: 234af14dc174fea43ac67396cc7a629d, type: 2} + - {fileID: 2100000, guid: 6d1c7e083b931724694854819181f2c0, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_Mesh: {fileID: 4300010, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Bones: + - {fileID: 490544} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 490544} + m_AABB: + m_Center: {x: -.0023374455, y: 9.48086381e-07, z: 4.40515578e-07} + m_Extent: {x: .0132346572, y: .0155686736, z: .0155686196} + m_DirtyAABB: 0 +--- !u!137 &13773646 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 140436} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: 6d51fde0a2c43c14e879d91c34c75238, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_Mesh: {fileID: 4300000, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Bones: + - {fileID: 464154} + - {fileID: 474968} + - {fileID: 409512} + - {fileID: 471694} + - {fileID: 425346} + - {fileID: 404142} + - {fileID: 457388} + - {fileID: 449310} + - {fileID: 460656} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 464154} + m_AABB: + m_Center: {x: -.0675030649, y: .0887691006, z: -3.20374966e-07} + m_Extent: {x: .00896474347, y: .00876539946, z: .050019335} + m_DirtyAABB: 0 +--- !u!137 &13784936 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 188248} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: 7a566dd48be8b5949a7230b4a6cf0f3b, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_Mesh: {fileID: 4300008, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Bones: + - {fileID: 427104} + - {fileID: 448332} + - {fileID: 443216} + - {fileID: 422310} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 443216} + m_AABB: + m_Center: {x: -.0404470861, y: .00918784365, z: 4.58024442e-06} + m_Extent: {x: .0322027951, y: .0139365941, z: .0170998033} + m_DirtyAABB: 0 +--- !u!137 &13794336 +SkinnedMeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 121946} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_Materials: + - {fileID: 2100000, guid: 818a303ce836fce4291f06023b2b5e6c, type: 2} + m_SubsetIndices: + m_StaticBatchRoot: {fileID: 0} + m_UseLightProbes: 1 + m_ReflectionProbeUsage: 1 + m_ProbeAnchor: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_ImportantGI: 0 + m_AutoUVMaxDistance: .5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 0 + m_Mesh: {fileID: 4300012, guid: 78eeaefa0ea89dd42a7c7a9b9f9b0ba2, type: 3} + m_Bones: + - {fileID: 487626} + - {fileID: 437268} + - {fileID: 464154} + - {fileID: 443216} + - {fileID: 438780} + - {fileID: 435664} + - {fileID: 423724} + - {fileID: 443526} + - {fileID: 496744} + - {fileID: 422052} + - {fileID: 469164} + - {fileID: 426816} + - {fileID: 471694} + - {fileID: 456620} + - {fileID: 404874} + - {fileID: 403482} + - {fileID: 474136} + - {fileID: 456572} + - {fileID: 459106} + - {fileID: 474968} + - {fileID: 415134} + - {fileID: 452474} + - {fileID: 498224} + - {fileID: 484980} + - {fileID: 449310} + - {fileID: 404142} + m_BlendShapeWeights: [] + m_RootBone: {fileID: 487626} + m_AABB: + m_Center: {x: -.444897354, y: .0483058542, z: -5.14090061e-07} + m_Extent: {x: .122695878, y: .120688617, z: .0874823034} + m_DirtyAABB: 0 +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 161618} + m_IsPrefabParent: 1 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs/GRFLHead_Liza.prefab.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs/GRFLHead_Liza.prefab.meta new file mode 100644 index 0000000..a1ec410 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Prefabs/GRFLHead_Liza.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f189c4378462f6e44a9440ee7ba50ef7 +timeCreated: 1457968512 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders.meta new file mode 100644 index 0000000..8a18786 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b1546a4d36ec9c84292ea0ae09b08bdc +folderAsset: yes +timeCreated: 1459974853 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders/DoubleSided_Alpha-Diffuse.shader b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders/DoubleSided_Alpha-Diffuse.shader new file mode 100644 index 0000000..cc44b09 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders/DoubleSided_Alpha-Diffuse.shader @@ -0,0 +1,31 @@ +Shader "Legacy Shaders/DoubleSided/Transparent/Diffuse" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + LOD 200 + Cull Off + +CGPROGRAM +#pragma surface surf Lambert alpha:blend + +sampler2D _MainTex; +fixed4 _Color; + +struct Input { + float2 uv_MainTex; +}; + +void surf (Input IN, inout SurfaceOutput o) { + fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; + o.Albedo = c.rgb; + o.Alpha = c.a; +} +ENDCG +} + +Fallback "Legacy Shaders/Transparent/VertexLit" +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders/DoubleSided_Alpha-Diffuse.shader.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders/DoubleSided_Alpha-Diffuse.shader.meta new file mode 100644 index 0000000..6b1ba5e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/Shaders/DoubleSided_Alpha-Diffuse.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c482e20001a8cfb4f8e3f040b1e41319 +timeCreated: 1436280349 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/readme.txt b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/readme.txt new file mode 100644 index 0000000..9f36d2b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/readme.txt @@ -0,0 +1,2 @@ +GRFLHead_Liza model by Vit3D. Used with permission. +Full versions of this and other models by Vit3D can be found here: https://www.assetstore.unity3d.com/en/#!/search/page=1/sortby=relevance/query=publisher:15211 \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/readme.txt.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/readme.txt.meta new file mode 100644 index 0000000..568cdd9 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/GRFL_Head_Liza/readme.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ee3bbb6114307ee4db71e5057488cfe2 +timeCreated: 1459975338 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Example.controller b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Example.controller new file mode 100644 index 0000000..fcc295c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Example.controller @@ -0,0 +1,333 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-8929485125533522456 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Point Back_trigger + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -3163044785674491725} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.2 + m_TransitionOffset: 0 + m_ExitTime: 0.9 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-7572659218366436189 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: None + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -7188467422068249441} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 0} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-7188467422068249441 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Point Back_trigger + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 8947151264476550016} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.2 + m_TransitionOffset: 0 + m_ExitTime: 0.9 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-3163044785674491725 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Point Back 0 + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1852227490439198599} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -203655887218126122, guid: 328d68d08fb507048a7c8e6f41c2ae7b, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Lincoln Example + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: Wave_trigger + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: Point Back_trigger + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 110793644} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: LipSync Gestures + m_StateMachine: {fileID: 9155812137598636774} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1102 &110278372 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: standing_idle_unarmed_2 + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: bfc6ad7ce0c217143bab1dad067232cb, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &110793644 +AnimatorStateMachine: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 110278372} + m_Position: {x: 48, y: 216, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: + - first: {fileID: 0} + second: [] + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 110278372} +--- !u!1101 &1852227490439198599 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 7190499641410170075} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.2 + m_TransitionOffset: 0 + m_ExitTime: 0.9 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 2 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &2434668956363557509 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -7572659218366436189} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.2 + m_TransitionOffset: 0 + m_ExitTime: 0.9 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 2 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &7190499641410170075 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: None 0 + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -8929485125533522456} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 0} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &8947151264476550016 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Point Back + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 2434668956363557509} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -203655887218126122, guid: 328d68d08fb507048a7c8e6f41c2ae7b, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &9155812137598636774 +AnimatorStateMachine: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LipSync Gestures + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -7572659218366436189} + m_Position: {x: 200, y: 0, z: 0} + - serializedVersion: 1 + m_State: {fileID: 8947151264476550016} + m_Position: {x: 235, y: 65, z: 0} + - serializedVersion: 1 + m_State: {fileID: 7190499641410170075} + m_Position: {x: 270, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -3163044785674491725} + m_Position: {x: 305, y: 195, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -7572659218366436189} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Example.controller.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Example.controller.meta new file mode 100644 index 0000000..2b9f393 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Example.controller.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 57a040ade2046cc49b15b2a4e1271449 +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Mask.mask b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Mask.mask new file mode 100644 index 0000000..4dd304f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Mask.mask @@ -0,0 +1,486 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1011 &101100000 +AvatarMask: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Lincoln Mask + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: Beards + m_Weight: 0 + - m_Path: Beards/Poses__Beards + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Blink_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Blink_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsDown_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsDown_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsIn_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsIn_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsOuterLower_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsOuterLower_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsUp_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/BrowsUp_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/CheekPuff_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/CheekPuff_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/EyesWide_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/EyesWide_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Frown_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Frown_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Jaw_Down_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Jaw_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Jaw_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Jaw_Up_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/JawBackward_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/JawForeward_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/JawRotateY_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/JawRotateY_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/JawRotateZ_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/JawRotateZ_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/LowerLipDown_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/LowerLipDown_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/LowerLipIn_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/LowerLipOut_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Midmouth_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Midmouth_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/MouthDown_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/MouthNarrow_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/MouthNarrow_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/MouthOpen_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/MouthUp_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/MouthWhistle_NarrowAdjust_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/MouthWhistle_NarrowAdjust_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/NoseScrunch_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/NoseScrunch_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Smile_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Smile_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Squint_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/Squint_Right_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/UpperLipIn_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/UpperLipOut_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/UpperLipUp_Left_4 + m_Weight: 0 + - m_Path: Beards/Poses__Beards/UpperLipUp_Right_4 + m_Weight: 0 + - m_Path: Body + m_Weight: 0 + - m_Path: Body/Poses__Body + m_Weight: 0 + - m_Path: Body/Poses__Body/Blink_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/Blink_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsDown_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsDown_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsIn_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsIn_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsOuterLower_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsOuterLower_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsUp_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/BrowsUp_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/CheekPuff_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/CheekPuff_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/EyesWide_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/EyesWide_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/Frown_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/Frown_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/Jaw_Down + m_Weight: 0 + - m_Path: Body/Poses__Body/Jaw_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/Jaw_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/Jaw_Up + m_Weight: 0 + - m_Path: Body/Poses__Body/JawBackward + m_Weight: 0 + - m_Path: Body/Poses__Body/JawForeward + m_Weight: 0 + - m_Path: Body/Poses__Body/JawRotateY_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/JawRotateY_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/JawRotateZ_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/JawRotateZ_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/LowerLipDown_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/LowerLipDown_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/LowerLipIn + m_Weight: 0 + - m_Path: Body/Poses__Body/LowerLipOut + m_Weight: 0 + - m_Path: Body/Poses__Body/Midmouth_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/Midmouth_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/MouthDown + m_Weight: 0 + - m_Path: Body/Poses__Body/MouthNarrow_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/MouthNarrow_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/MouthOpen + m_Weight: 0 + - m_Path: Body/Poses__Body/MouthUp + m_Weight: 0 + - m_Path: Body/Poses__Body/MouthWhistle_NarrowAdjust_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/MouthWhistle_NarrowAdjust_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/NoseScrunch_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/NoseScrunch_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/Smile_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/Smile_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/Squint_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/Squint_Right + m_Weight: 0 + - m_Path: Body/Poses__Body/TongueUp + m_Weight: 0 + - m_Path: Body/Poses__Body/UpperLipIn + m_Weight: 0 + - m_Path: Body/Poses__Body/UpperLipOut + m_Weight: 0 + - m_Path: Body/Poses__Body/UpperLipUp_Left + m_Weight: 0 + - m_Path: Body/Poses__Body/UpperLipUp_Right + m_Weight: 0 + - m_Path: Bottoms + m_Weight: 0 + - m_Path: Eyelashes + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Blink_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Blink_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsDown_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsDown_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsIn_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsIn_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsOuterLower_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsOuterLower_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsUp_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/BrowsUp_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/CheekPuff_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/CheekPuff_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/EyesWide_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/EyesWide_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Frown_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Frown_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Jaw_Down_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Jaw_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Jaw_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Jaw_Up_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/JawBackward_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/JawForeward_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/JawRotateY_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/JawRotateY_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/JawRotateZ_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/JawRotateZ_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/LowerLipDown_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/LowerLipDown_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/LowerLipIn_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/LowerLipOut_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Midmouth_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Midmouth_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/MouthDown_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/MouthNarrow_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/MouthNarrow_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/MouthOpen_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/MouthUp_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/MouthWhistle_NarrowAdjust_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/MouthWhistle_NarrowAdjust_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/NoseScrunch_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/NoseScrunch_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Smile_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Smile_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Squint_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/Squint_Right_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/TongueUp_2 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/UpperLipIn_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/UpperLipOut_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/UpperLipUp_Left_3 + m_Weight: 0 + - m_Path: Eyelashes/Poses__Eyelashes/UpperLipUp_Right_3 + m_Weight: 0 + - m_Path: Eyes + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Blink_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Blink_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsDown_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsDown_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsIn_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsIn_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsOuterLower_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsOuterLower_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsUp_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/BrowsUp_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/CheekPuff_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/CheekPuff_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/EyesWide_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/EyesWide_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Frown_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Frown_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Jaw_Down_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Jaw_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Jaw_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Jaw_Up_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/JawBackward_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/JawForeward_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/JawRotateY_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/JawRotateY_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/JawRotateZ_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/JawRotateZ_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/LowerLipDown_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/LowerLipDown_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/LowerLipIn_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/LowerLipOut_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Midmouth_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Midmouth_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/MouthDown_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/MouthNarrow_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/MouthNarrow_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/MouthOpen_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/MouthUp_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/MouthWhistle_NarrowAdjust_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/MouthWhistle_NarrowAdjust_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/NoseScrunch_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/NoseScrunch_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Smile_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Smile_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Squint_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/Squint_Right_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/UpperLipIn_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/UpperLipOut_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/UpperLipUp_Left_2 + m_Weight: 0 + - m_Path: Eyes/Poses__Eyes/UpperLipUp_Right_2 + m_Weight: 0 + - m_Path: Hats + m_Weight: 0 + - m_Path: mixamorig_Hips + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_LeftUpLeg + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_LeftUpLeg/mixamorig_LeftLeg + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_LeftUpLeg/mixamorig_LeftLeg/mixamorig_LeftFoot + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_LeftUpLeg/mixamorig_LeftLeg/mixamorig_LeftFoot/mixamorig_LeftToeBase + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_LeftUpLeg/mixamorig_LeftLeg/mixamorig_LeftFoot/mixamorig_LeftToeBase/mixamorig_LeftToe_End + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_RightUpLeg + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_RightUpLeg/mixamorig_RightLeg + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_RightUpLeg/mixamorig_RightLeg/mixamorig_RightFoot + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_RightUpLeg/mixamorig_RightLeg/mixamorig_RightFoot/mixamorig_RightToeBase + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_RightUpLeg/mixamorig_RightLeg/mixamorig_RightFoot/mixamorig_RightToeBase/mixamorig_RightToe_End + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1 + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2 + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_LeftShoulder + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_LeftShoulder/mixamorig_LeftArm + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_LeftShoulder/mixamorig_LeftArm/mixamorig_LeftForeArm + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_LeftShoulder/mixamorig_LeftArm/mixamorig_LeftForeArm/mixamorig_LeftHand + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_Neck + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_Neck/mixamorig_Head + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_Neck/mixamorig_Head/mixamorig_HeadTop_End + m_Weight: 0 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_Neck/mixamorig_Head/mixamorig_LeftEye + m_Weight: 0 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_Neck/mixamorig_Head/mixamorig_RightEye + m_Weight: 0 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_RightShoulder + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_RightShoulder/mixamorig_RightArm + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_RightShoulder/mixamorig_RightArm/mixamorig_RightForeArm + m_Weight: 1 + - m_Path: mixamorig_Hips/mixamorig_Spine/mixamorig_Spine1/mixamorig_Spine2/mixamorig_RightShoulder/mixamorig_RightArm/mixamorig_RightForeArm/mixamorig_RightHand + m_Weight: 1 + - m_Path: Shoes + m_Weight: 0 + - m_Path: Tops + m_Weight: 0 diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Mask.mask.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Mask.mask.meta new file mode 100644 index 0000000..34feb6f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Mask.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 540bc9ab5fef74043963d0302cd44ada +timeCreated: 1437425095 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures.meta new file mode 100644 index 0000000..ed66856 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d61c583bb307bee4785d12fe0a91475d +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_diffuse.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_diffuse.png new file mode 100644 index 0000000..55377e9 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_diffuse.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_diffuse.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_diffuse.png.meta new file mode 100644 index 0000000..d0a36a4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_diffuse.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: a32cb51f6e9db004e8c7ef5f7f9f100c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_gloss.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_gloss.png new file mode 100644 index 0000000..f300d6e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_gloss.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_gloss.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_gloss.png.meta new file mode 100644 index 0000000..34f5a74 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_gloss.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 2edcff8034718c448a854ebd2c0d737c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_normal.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_normal.png new file mode 100644 index 0000000..af3e14d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_normal.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_normal.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_normal.png.meta new file mode 100644 index 0000000..1b8ebff --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Beard_normal.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 3fa08ee3021cfe54fb9aaa0f71c1c156 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_diffuse.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_diffuse.png new file mode 100644 index 0000000..ebe49b0 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_diffuse.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_diffuse.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_diffuse.png.meta new file mode 100644 index 0000000..7175d55 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_diffuse.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: a5d680e44578953459f24156558b542d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_gloss.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_gloss.png new file mode 100644 index 0000000..5500616 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_gloss.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_gloss.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_gloss.png.meta new file mode 100644 index 0000000..c1a0049 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_gloss.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 177216f15edd2bb43b3e3ad0b845ca95 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_normal.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_normal.png new file mode 100644 index 0000000..13c37fc Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_normal.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_normal.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_normal.png.meta new file mode 100644 index 0000000..c85a3db --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_normal.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: cb6af8c920cfd92408f56d8471a65c2d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_specular.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_specular.png new file mode 100644 index 0000000..eea677d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_specular.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_specular.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_specular.png.meta new file mode 100644 index 0000000..d63f48d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Body_specular.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 5aa389b59ca902e4899628c0469bfe89 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_diffuse.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_diffuse.png new file mode 100644 index 0000000..d04f91b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_diffuse.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_diffuse.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_diffuse.png.meta new file mode 100644 index 0000000..f411a2f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_diffuse.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: c06b2bf205950834cbf7f19289949d13 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_gloss.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_gloss.png new file mode 100644 index 0000000..ffc2c44 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_gloss.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_gloss.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_gloss.png.meta new file mode 100644 index 0000000..c0ab46b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_gloss.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 871d574d9bf600641b2e338c4be4bd52 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_normal.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_normal.png new file mode 100644 index 0000000..c34735e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_normal.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_normal.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_normal.png.meta new file mode 100644 index 0000000..a43384c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_normal.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 9cc9f3dc047b00641ae99c3644ec59b7 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_specular.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_specular.png new file mode 100644 index 0000000..686eb2c Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_specular.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_specular.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_specular.png.meta new file mode 100644 index 0000000..279d3c2 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Bottom_specular.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 4bb63bc338b93f947997e8a522ec8e0c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_diffuse.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_diffuse.png new file mode 100644 index 0000000..bec99dd Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_diffuse.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_diffuse.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_diffuse.png.meta new file mode 100644 index 0000000..7f8003f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_diffuse.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 5e7cef8ab4979e0448c1cb25d853be63 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_gloss.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_gloss.png new file mode 100644 index 0000000..9b11c8b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_gloss.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_gloss.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_gloss.png.meta new file mode 100644 index 0000000..d81e22a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_gloss.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 2b51678715126754bbe5337b57edd57d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_normal.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_normal.png new file mode 100644 index 0000000..c05bb95 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_normal.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_normal.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_normal.png.meta new file mode 100644 index 0000000..520e8bb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_normal.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ee760443b9215984e8be39c40c1a849f +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_specular.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_specular.png new file mode 100644 index 0000000..9b11c8b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_specular.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_specular.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_specular.png.meta new file mode 100644 index 0000000..e92c9be --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Hat_specular.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: d9372471cca3b14408a8d8f5f33559be +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_diffuse.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_diffuse.png new file mode 100644 index 0000000..ac21b0d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_diffuse.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_diffuse.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_diffuse.png.meta new file mode 100644 index 0000000..037ff9b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_diffuse.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: c33bd13d876ad9045b95b7bea57585ac +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_gloss.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_gloss.png new file mode 100644 index 0000000..600b1cd Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_gloss.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_gloss.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_gloss.png.meta new file mode 100644 index 0000000..665f273 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_gloss.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: deed7c7c0a936eb46919ae5790c56ab8 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_normal.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_normal.png new file mode 100644 index 0000000..1461f0f Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_normal.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_normal.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_normal.png.meta new file mode 100644 index 0000000..f846ee7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_normal.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: d490f255dcdf34242ba73959136dfade +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_specular.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_specular.png new file mode 100644 index 0000000..46568dc Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_specular.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_specular.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_specular.png.meta new file mode 100644 index 0000000..191b3d7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Shoes_specular.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: b39bfb1d3305479429f97d84277a7ffc +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_diffuse.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_diffuse.png new file mode 100644 index 0000000..6bb4b5e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_diffuse.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_diffuse.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_diffuse.png.meta new file mode 100644 index 0000000..32bd638 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_diffuse.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 101ec6bb9b89e434bbec385df633ba4c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_gloss.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_gloss.png new file mode 100644 index 0000000..0fa1603 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_gloss.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_gloss.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_gloss.png.meta new file mode 100644 index 0000000..f9b9060 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_gloss.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: ef16b873d6168244596d1242a2690035 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_normal.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_normal.png new file mode 100644 index 0000000..a3706e7 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_normal.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_normal.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_normal.png.meta new file mode 100644 index 0000000..d9f7a9d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_normal.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: fef99d35ea679444697070995aa8c0ca +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 1 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_specular.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_specular.png new file mode 100644 index 0000000..8805fd4 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_specular.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_specular.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_specular.png.meta new file mode 100644 index 0000000..4d9b2af --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Lincoln Textures/lincoln_Top_specular.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 22de2326ad1a35f4ead05cacd4d45f25 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials.meta new file mode 100644 index 0000000..c885f2d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5e84f9c482f0e2440a2fef2b4c74032d +folderAsset: yes +timeCreated: 1428778472 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #105.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #105.mat new file mode 100644 index 0000000..cb7e19c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #105.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #105' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #105.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #105.mat.meta new file mode 100644 index 0000000..aecaf53 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #105.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5705011d282332d4c8abc315f887cbc7 +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #125.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #125.mat new file mode 100644 index 0000000..2dd10ad --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #125.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #125' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #125.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #125.mat.meta new file mode 100644 index 0000000..2cbd02b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #125.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 94f19895c9c3a304387c552d43ef0d4d +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #135.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #135.mat new file mode 100644 index 0000000..cf08a07 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #135.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #135' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #135.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #135.mat.meta new file mode 100644 index 0000000..a932368 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #135.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5a724bf06b4cbe42989591a1197d89d +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #35.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #35.mat new file mode 100644 index 0000000..9633e41 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #35.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #35' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #35.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #35.mat.meta new file mode 100644 index 0000000..a6cc649 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #35.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 32fd14e3a7029944bb292521c6c2a63b +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #55.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #55.mat new file mode 100644 index 0000000..f6dc97d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #55.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #55' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #55.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #55.mat.meta new file mode 100644 index 0000000..d4b9e3b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #55.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 67e91f4268f878f4d91ed687497d0fe2 +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #75.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #75.mat new file mode 100644 index 0000000..526f042 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #75.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #75' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #75.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #75.mat.meta new file mode 100644 index 0000000..26968b7 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #75.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a7eda2230e15f824aa4a04f5bf7d21e8 +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #85.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #85.mat new file mode 100644 index 0000000..ab3be4c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #85.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #85' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #85.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #85.mat.meta new file mode 100644 index 0000000..08cd241 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #85.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d0abc1de9d774d4c8984227ddefd1f3 +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #95.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #95.mat new file mode 100644 index 0000000..fb903a5 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #95.mat @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 'Material #95' + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _SrcBlend + second: 1 + data: + first: + name: _DstBlend + second: 0 + data: + first: + name: _Cutoff + second: 0.5 + data: + first: + name: _Parallax + second: 0.02 + data: + first: + name: _ZWrite + second: 1 + data: + first: + name: _Glossiness + second: 0.5 + data: + first: + name: _BumpScale + second: 1 + data: + first: + name: _OcclusionStrength + second: 1 + data: + first: + name: _DetailNormalMapScale + second: 1 + data: + first: + name: _UVSec + second: 0 + data: + first: + name: _Mode + second: 0 + data: + first: + name: _Metallic + second: 0 + m_Colors: + data: + first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + data: + first: + name: _Color + second: {r: 0.588, g: 0.588, b: 0.588, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #95.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #95.mat.meta new file mode 100644 index 0000000..20f0715 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/Material #95.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6bb32c53d56d034b9ebff082cb74ed4 +timeCreated: 1491346937 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/background.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/background.mat new file mode 100644 index 0000000..802b87b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/background.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: background + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 3fdf250cec4ffe347af2c473f00865ae, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.1424608e-33, b: 0, a: 1.1424549e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/background.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/background.mat.meta new file mode 100644 index 0000000..1790f4f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/background.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 911aa5d0dcffd9240b819d7f8849c52c +timeCreated: 1437411527 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Beard_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Beard_diffuse.mat new file mode 100644 index 0000000..93ea661 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Beard_diffuse.mat @@ -0,0 +1,140 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: lincoln_Beard_diffuse + m_Shader: {fileID: 45, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON _EMISSION _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: 3fa08ee3021cfe54fb9aaa0f71c1c156, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: a32cb51f6e9db004e8c7ef5f7f9f100c, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _SpecGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 25.61 + - first: + name: _Cutoff + second: 0 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 10 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.155 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 2 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _Shininess + second: 0.17795019 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 5 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 0 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _SpecColor + second: {r: 0.2205882, g: 0.2205882, b: 0.2205882, a: 0} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Beard_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Beard_diffuse.mat.meta new file mode 100644 index 0000000..0b9c389 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Beard_diffuse.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 7639fe857dd957b45b4a5cd512043041 +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Body_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Body_diffuse.mat new file mode 100644 index 0000000..270237b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Body_diffuse.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: lincoln_Body_diffuse + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: cb6af8c920cfd92408f56d8471a65c2d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: a5d680e44578953459f24156558b542d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.132 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.1503395e-33, b: 0, a: 1.1503336e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Body_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Body_diffuse.mat.meta new file mode 100644 index 0000000..01fadce --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Body_diffuse.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1880cba827ee51d41a078290574b218b +timeCreated: 1491346413 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Bottom_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Bottom_diffuse.mat new file mode 100644 index 0000000..10fb387 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Bottom_diffuse.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: lincoln_Bottom_diffuse + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: 9cc9f3dc047b00641ae99c3644ec59b7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: c06b2bf205950834cbf7f19289949d13, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.084 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.15009265e-33, b: 0, a: 1.1500868e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Bottom_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Bottom_diffuse.mat.meta new file mode 100644 index 0000000..573ceb6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Bottom_diffuse.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: c75b4ef0d2ec8a5468c404e6016cb617 +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eye_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eye_diffuse.mat new file mode 100644 index 0000000..3a0d63d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eye_diffuse.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: lincoln_Eye_diffuse + m_Shader: {fileID: 45, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: a5d680e44578953459f24156558b542d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.886 + - _GlossyReflections: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19852942, g: 0.19852942, b: 0.19852942, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eye_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eye_diffuse.mat.meta new file mode 100644 index 0000000..38d3e6b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eye_diffuse.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: b4824d23ae5403b47add72f1413110dc +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eyelash_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eyelash_diffuse.mat new file mode 100644 index 0000000..e5d80f6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eyelash_diffuse.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: lincoln_Eyelash_diffuse + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON _NORMALMAP + m_LightmapFlags: 5 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: a5d680e44578953459f24156558b542d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: cb6af8c920cfd92408f56d8471a65c2d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _SrcBlend + second: 5 + data: + first: + name: _DstBlend + second: 10 + data: + first: + name: _Cutoff + second: .5 + data: + first: + name: _Parallax + second: .0199999996 + data: + first: + name: _ZWrite + second: 0 + data: + first: + name: _Glossiness + second: 0 + data: + first: + name: _BumpScale + second: 1 + data: + first: + name: _OcclusionStrength + second: 1 + data: + first: + name: _DetailNormalMapScale + second: 1 + data: + first: + name: _UVSec + second: 0 + data: + first: + name: _Mode + second: 2 + data: + first: + name: _Metallic + second: 0 + m_Colors: + data: + first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eyelash_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eyelash_diffuse.mat.meta new file mode 100644 index 0000000..2f0e18b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Eyelash_diffuse.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: bae21052dadf95443bacebf61af2d180 +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Hat_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Hat_diffuse.mat new file mode 100644 index 0000000..51eaf5a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Hat_diffuse.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: lincoln_Hat_diffuse + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: ee760443b9215984e8be39c40c1a849f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 5e7cef8ab4979e0448c1cb25d853be63, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.479 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.1505864e-33, b: 0, a: 1.1505805e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Hat_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Hat_diffuse.mat.meta new file mode 100644 index 0000000..d945bcc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Hat_diffuse.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 134256085b30cd54e8d7901e803356c9 +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Shoes_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Shoes_diffuse.mat new file mode 100644 index 0000000..3c3885d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Shoes_diffuse.mat @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: lincoln_Shoes_diffuse + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _NORMALMAP + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: c33bd13d876ad9045b95b7bea57585ac, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: d490f255dcdf34242ba73959136dfade, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + data: + first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _SrcBlend + second: 1 + data: + first: + name: _DstBlend + second: 0 + data: + first: + name: _Cutoff + second: .5 + data: + first: + name: _Parallax + second: .0199999996 + data: + first: + name: _ZWrite + second: 1 + data: + first: + name: _Glossiness + second: .545000017 + data: + first: + name: _BumpScale + second: 1 + data: + first: + name: _OcclusionStrength + second: 1 + data: + first: + name: _DetailNormalMapScale + second: 1 + data: + first: + name: _UVSec + second: 0 + data: + first: + name: _Mode + second: 0 + data: + first: + name: _Metallic + second: 0 + m_Colors: + data: + first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + data: + first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Shoes_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Shoes_diffuse.mat.meta new file mode 100644 index 0000000..02d125c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Shoes_diffuse.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: d7aacf9a239c81648a8ebac11cd24dbf +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Top_diffuse.mat b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Top_diffuse.mat new file mode 100644 index 0000000..bb1e846 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Top_diffuse.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: lincoln_Top_diffuse + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: fef99d35ea679444697070995aa8c0ca, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 101ec6bb9b89e434bbec385df633ba4c, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.136 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: + second: {r: 0, g: 1.1508332e-33, b: 0, a: 1.1508273e-33} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Top_diffuse.mat.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Top_diffuse.mat.meta new file mode 100644 index 0000000..99bd240 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/Materials/lincoln_Top_diffuse.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: a4a99770a9405f043a126fee39e093f4 +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln.fbx b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln.fbx new file mode 100644 index 0000000..9a8e65e Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln.fbx differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln.fbx.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln.fbx.meta new file mode 100644 index 0000000..5ad6a79 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln.fbx.meta @@ -0,0 +1,585 @@ +fileFormatVersion: 2 +guid: 954cc2e2a795089478410e4488b669ff +ModelImporter: + serializedVersion: 23 + fileIDToRecycleName: + 100000: Beards + 100002: Body + 100004: Bottoms + 100006: Eyelashes + 100008: Eyes + 100010: Hats + 100012: //RootNode + 100014: mixamorig_Head + 100016: mixamorig_HeadTop_End + 100018: mixamorig_Hips + 100020: mixamorig_LeftArm + 100022: mixamorig_LeftEye + 100024: mixamorig_LeftFoot + 100026: mixamorig_LeftForeArm + 100028: mixamorig_LeftHand + 100030: mixamorig_LeftLeg + 100032: mixamorig_LeftShoulder + 100034: mixamorig_LeftToe_End + 100036: mixamorig_LeftToeBase + 100038: mixamorig_LeftUpLeg + 100040: mixamorig_Neck + 100042: mixamorig_RightArm + 100044: mixamorig_RightEye + 100046: mixamorig_RightFoot + 100048: mixamorig_RightForeArm + 100050: mixamorig_RightHand + 100052: mixamorig_RightLeg + 100054: mixamorig_RightShoulder + 100056: mixamorig_RightToe_End + 100058: mixamorig_RightToeBase + 100060: mixamorig_RightUpLeg + 100062: mixamorig_Spine + 100064: mixamorig_Spine1 + 100066: mixamorig_Spine2 + 100068: Shoes + 100070: Tops + 400000: Beards + 400002: Body + 400004: Bottoms + 400006: Eyelashes + 400008: Eyes + 400010: Hats + 400012: //RootNode + 400014: mixamorig_Head + 400016: mixamorig_HeadTop_End + 400018: mixamorig_Hips + 400020: mixamorig_LeftArm + 400022: mixamorig_LeftEye + 400024: mixamorig_LeftFoot + 400026: mixamorig_LeftForeArm + 400028: mixamorig_LeftHand + 400030: mixamorig_LeftLeg + 400032: mixamorig_LeftShoulder + 400034: mixamorig_LeftToe_End + 400036: mixamorig_LeftToeBase + 400038: mixamorig_LeftUpLeg + 400040: mixamorig_Neck + 400042: mixamorig_RightArm + 400044: mixamorig_RightEye + 400046: mixamorig_RightFoot + 400048: mixamorig_RightForeArm + 400050: mixamorig_RightHand + 400052: mixamorig_RightLeg + 400054: mixamorig_RightShoulder + 400056: mixamorig_RightToe_End + 400058: mixamorig_RightToeBase + 400060: mixamorig_RightUpLeg + 400062: mixamorig_Spine + 400064: mixamorig_Spine1 + 400066: mixamorig_Spine2 + 400068: Shoes + 400070: Tops + 4300000: Body + 4300002: Eyes + 4300004: Eyelashes + 4300006: Hats + 4300008: Tops + 4300010: Bottoms + 4300012: Beards + 4300014: Shoes + 7400000: Take 001 + 9500000: //RootNode + 13700000: Beards + 13700002: Body + 13700004: Bottoms + 13700006: Eyelashes + 13700008: Eyes + 13700010: Hats + 13700012: Shoes + 13700014: Tops + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #105' + second: {fileID: 2100000, guid: 5705011d282332d4c8abc315f887cbc7, type: 2} + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #125' + second: {fileID: 2100000, guid: 94f19895c9c3a304387c552d43ef0d4d, type: 2} + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #135' + second: {fileID: 2100000, guid: c5a724bf06b4cbe42989591a1197d89d, type: 2} + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #35' + second: {fileID: 2100000, guid: 32fd14e3a7029944bb292521c6c2a63b, type: 2} + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #55' + second: {fileID: 2100000, guid: 67e91f4268f878f4d91ed687497d0fe2, type: 2} + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #75' + second: {fileID: 2100000, guid: a7eda2230e15f824aa4a04f5bf7d21e8, type: 2} + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #85' + second: {fileID: 2100000, guid: 6d0abc1de9d774d4c8984227ddefd1f3, type: 2} + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: 'Material #95' + second: {fileID: 2100000, guid: f6bb32c53d56d034b9ebff082cb74ed4, type: 2} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 0 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 3 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + importVisibility: 0 + importBlendShapes: 1 + importCameras: 0 + importLights: 0 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + previousCalculatedGlobalScale: 0.01 + hasPreviousCalculatedGlobalScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 0 + normalCalculationMode: 0 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 1 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: + - boneName: mixamorig_Hips + humanName: Hips + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftUpLeg + humanName: LeftUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightUpLeg + humanName: RightUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftLeg + humanName: LeftLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightLeg + humanName: RightLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftFoot + humanName: LeftFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightFoot + humanName: RightFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_Spine + humanName: Spine + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_Spine1 + humanName: Chest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_Neck + humanName: Neck + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_Head + humanName: Head + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftShoulder + humanName: LeftShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightShoulder + humanName: RightShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftArm + humanName: LeftUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightArm + humanName: RightUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftForeArm + humanName: LeftLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightForeArm + humanName: RightLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftHand + humanName: LeftHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightHand + humanName: RightHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftToeBase + humanName: LeftToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightToeBase + humanName: RightToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_LeftEye + humanName: LeftEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig_RightEye + humanName: RightEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + skeleton: + - name: lincoln1(Clone) + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Beards + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Body + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Bottoms + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Eyelashes + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Eyes + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Hats + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Shoes + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: Tops + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_Hips + parentName: + position: {x: 0.000016375532, y: 1.0056573, z: -0.0004517655} + rotation: {x: 0.00000006299378, y: -0.000010700876, z: 0.0003350414, w: 0.99999994} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_Spine + parentName: + position: {x: -0.000020827501, y: 0.09868545, z: -0.0152929} + rotation: {x: -0.0707681, y: 0.000030791998, z: -0.00028281036, w: 0.9974928} + scale: {x: 0.9999999, y: 0.9999999, z: 1} + - name: mixamorig_Spine1 + parentName: + position: {x: -4.6566128e-12, y: 0.11425712, z: 0} + rotation: {x: 0.016107325, y: -0.000001476919, z: -0.00009168036, w: 0.9998703} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_Spine2 + parentName: + position: {x: -0, y: 0.13540038, z: 0.000000009536743} + rotation: {x: -0.0000000074060065, y: -2.493426e-12, z: -8.3019336e-21, w: 1} + scale: {x: 1, y: 1.0000002, z: 1} + - name: mixamorig_RightShoulder + parentName: + position: {x: 0.059450474, y: 0.09147766, z: 0.018344564} + rotation: {x: 0.53135324, y: 0.606568, z: -0.477639, w: 0.34871215} + scale: {x: 1.0000001, y: 1.0000002, z: 1.0000001} + - name: mixamorig_RightArm + parentName: + position: {x: -0, y: 0.12652656, z: 0.00000015258789} + rotation: {x: -0.0109069245, y: -0.0008580114, z: 0.07841894, w: 0.9968605} + scale: {x: 1, y: 1.0000002, z: 1.0000005} + - name: mixamorig_RightForeArm + parentName: + position: {x: -0, y: 0.28208038, z: 0} + rotation: {x: -0.024590738, y: -0.0012900351, z: 0.05237223, w: 0.998324} + scale: {x: 1, y: 1.0000001, z: 1.0000001} + - name: mixamorig_RightHand + parentName: + position: {x: -0, y: 0.26820427, z: -0.00000030517577} + rotation: {x: -8.6736174e-19, y: 6.018531e-36, z: -6.938894e-18, w: 1} + scale: {x: 1.0000002, y: 1, z: 1} + - name: mixamorig_LeftShoulder + parentName: + position: {x: -0.059448536, y: 0.09176086, z: 0.018396644} + rotation: {x: -0.52696013, y: 0.6127964, z: -0.47158813, w: -0.35270128} + scale: {x: 1, y: 1, z: 1.0000001} + - name: mixamorig_LeftArm + parentName: + position: {x: -0, y: 0.12651931, z: 0} + rotation: {x: -0.012298831, y: 0.00097398297, z: -0.07893738, w: 0.9968033} + scale: {x: 1, y: 1.0000002, z: 1.0000001} + - name: mixamorig_LeftForeArm + parentName: + position: {x: -0, y: 0.28202465, z: 0} + rotation: {x: -0.013589607, y: 0.0007501364, z: -0.055113856, w: 0.99838734} + scale: {x: 1, y: 1, z: 0.9999999} + - name: mixamorig_LeftHand + parentName: + position: {x: -0, y: 0.26824567, z: 0} + rotation: {x: -2.9143357e-16, y: 8.326673e-17, z: 1.0408341e-16, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_Neck + parentName: + position: {x: -0.000011545718, y: 0.15150161, z: 0.028294163} + rotation: {x: 0.05469191, y: 0.000010737474, z: 0.000040660965, w: 0.99850327} + scale: {x: 1, y: 1.0000001, z: 1.0000001} + - name: mixamorig_Head + parentName: + position: {x: -0.00006384085, y: 0.10531967, z: 0.030171199} + rotation: {x: 0, y: -0, z: -2.4865104e-28, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_HeadTop_End + parentName: + position: {x: 0.000085874606, y: 0.18782684, z: 0.06796168} + rotation: {x: 1.16e-42, y: -1.7439706e-16, z: 6.653809e-27, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_RightEye + parentName: + position: {x: 0.027561687, y: 0.07868774, z: 0.0842445} + rotation: {x: -1.093e-42, y: -1.7439706e-16, z: -6.270888e-27, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_LeftEye + parentName: + position: {x: -0.027833842, y: 0.07868729, z: 0.08424459} + rotation: {x: -1.093e-42, y: -1.7439706e-16, z: -6.270888e-27, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig_LeftUpLeg + parentName: + position: {x: -0.08159253, y: -0.06755989, z: 0.0013438762} + rotation: {x: 0.0000044690973, y: -0.0022939285, z: 0.99994105, w: 0.010617862} + scale: {x: 1, y: 0.99999994, z: 1} + - name: mixamorig_LeftLeg + parentName: + position: {x: 0.000000009536743, y: 0.4037361, z: -5.9604643e-10} + rotation: {x: -0.027027108, y: -0.000045808934, z: 0.020161662, w: 0.9994314} + scale: {x: 1, y: 0.9999998, z: 0.9999999} + - name: mixamorig_LeftFoot + parentName: + position: {x: 0.0000000047683715, y: 0.4134798, z: -0.0000000047683715} + rotation: {x: 0.44996545, y: 0.018056054, z: -0.012573516, w: 0.89277494} + scale: {x: 0.9999999, y: 0.9999998, z: 1.0000002} + - name: mixamorig_LeftToeBase + parentName: + position: {x: 0.000000019073486, y: 0.16364929, z: 0} + rotation: {x: 0.34331164, y: -0.036923204, z: 0.0135083, w: 0.9383983} + scale: {x: 1, y: 1.0000002, z: 1} + - name: mixamorig_LeftToe_End + parentName: + position: {x: -0, y: 0.09952715, z: 0.0000000011920929} + rotation: {x: -4.3368087e-19, y: 3.266159e-18, z: 3.035766e-18, w: 1} + scale: {x: 0.9999999, y: 0.99999976, z: 0.9999999} + - name: mixamorig_RightUpLeg + parentName: + position: {x: 0.08148818, y: -0.06878204, z: 0.0012808596} + rotation: {x: 0.00012460223, y: 0.0062779235, z: 0.9999332, w: -0.009711106} + scale: {x: 1, y: 0.99999994, z: 1} + - name: mixamorig_RightLeg + parentName: + position: {x: 0.000000009536743, y: 0.40680394, z: 0} + rotation: {x: -0.044299483, y: 0.00021050526, z: -0.02015168, w: 0.998815} + scale: {x: 0.99999994, y: 0.9999997, z: 0.9999998} + - name: mixamorig_RightFoot + parentName: + position: {x: -0, y: 0.40984797, z: -0.0000000047683715} + rotation: {x: 0.45749548, y: -0.019559072, z: 0.013184314, w: 0.8888991} + scale: {x: 0.99999994, y: 1.0000002, z: 1} + - name: mixamorig_RightToeBase + parentName: + position: {x: -0, y: 0.16248356, z: 0} + rotation: {x: 0.34322548, y: 0.03764588, z: -0.0137692485, w: 0.9383973} + scale: {x: 0.99999976, y: 1, z: 0.99999994} + - name: mixamorig_RightToe_End + parentName: + position: {x: -0, y: 0.09888336, z: -0.0000000023841857} + rotation: {x: 1.517883e-18, y: -2.1985502e-16, z: 4.3368087e-19, w: 1} + scale: {x: 1.0000002, y: 1, z: 1} + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 0 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 3 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln@standing_idle_unarmed_2.fbx b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln@standing_idle_unarmed_2.fbx new file mode 100644 index 0000000..988f779 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln@standing_idle_unarmed_2.fbx differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln@standing_idle_unarmed_2.fbx.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln@standing_idle_unarmed_2.fbx.meta new file mode 100644 index 0000000..5ddd741 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/lincoln@standing_idle_unarmed_2.fbx.meta @@ -0,0 +1,560 @@ +fileFormatVersion: 2 +guid: bfc6ad7ce0c217143bab1dad067232cb +ModelImporter: + serializedVersion: 23 + fileIDToRecycleName: + 100000: //RootNode + 100002: mixamorig:Head + 100004: mixamorig:HeadTop_End + 100006: mixamorig:Hips + 100008: mixamorig:LeftArm + 100010: mixamorig:LeftEye + 100012: mixamorig:LeftFoot + 100014: mixamorig:LeftForeArm + 100016: mixamorig:LeftHand + 100018: mixamorig:LeftLeg + 100020: mixamorig:LeftShoulder + 100022: mixamorig:LeftToe_End + 100024: mixamorig:LeftToeBase + 100026: mixamorig:LeftUpLeg + 100028: mixamorig:Neck + 100030: mixamorig:RightArm + 100032: mixamorig:RightEye + 100034: mixamorig:RightFoot + 100036: mixamorig:RightForeArm + 100038: mixamorig:RightHand + 100040: mixamorig:RightLeg + 100042: mixamorig:RightShoulder + 100044: mixamorig:RightToe_End + 100046: mixamorig:RightToeBase + 100048: mixamorig:RightUpLeg + 100050: mixamorig:Spine + 100052: mixamorig:Spine1 + 100054: mixamorig:Spine2 + 400000: //RootNode + 400002: mixamorig:Head + 400004: mixamorig:HeadTop_End + 400006: mixamorig:Hips + 400008: mixamorig:LeftArm + 400010: mixamorig:LeftEye + 400012: mixamorig:LeftFoot + 400014: mixamorig:LeftForeArm + 400016: mixamorig:LeftHand + 400018: mixamorig:LeftLeg + 400020: mixamorig:LeftShoulder + 400022: mixamorig:LeftToe_End + 400024: mixamorig:LeftToeBase + 400026: mixamorig:LeftUpLeg + 400028: mixamorig:Neck + 400030: mixamorig:RightArm + 400032: mixamorig:RightEye + 400034: mixamorig:RightFoot + 400036: mixamorig:RightForeArm + 400038: mixamorig:RightHand + 400040: mixamorig:RightLeg + 400042: mixamorig:RightShoulder + 400044: mixamorig:RightToe_End + 400046: mixamorig:RightToeBase + 400048: mixamorig:RightUpLeg + 400050: mixamorig:Spine + 400052: mixamorig:Spine1 + 400054: mixamorig:Spine2 + 7400000: standing_idle_unarmed_2 + 9500000: //RootNode + 2186277476908879412: ImportLogs + externalObjects: {} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 0 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: "\nClip 'mixamo.com' has import animation warnings that + might lower retargeting quality:\n\t'mixamorig:Spine2' is inbetween humanoid + transforms and has rotation animation that will be discarded.\n" + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 1 + importConstraints: 0 + animationCompression: 3 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: + - serializedVersion: 16 + name: standing_idle_unarmed_2 + takeName: mixamo.com + firstFrame: 0 + lastFrame: 90 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 1 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: mixamorig:Hips + weight: 1 + - path: mixamorig:Hips/mixamorig:LeftUpLeg + weight: 1 + - path: mixamorig:Hips/mixamorig:LeftUpLeg/mixamorig:LeftLeg + weight: 1 + - path: mixamorig:Hips/mixamorig:LeftUpLeg/mixamorig:LeftLeg/mixamorig:LeftFoot + weight: 1 + - path: mixamorig:Hips/mixamorig:LeftUpLeg/mixamorig:LeftLeg/mixamorig:LeftFoot/mixamorig:LeftToeBase + weight: 1 + - path: mixamorig:Hips/mixamorig:LeftUpLeg/mixamorig:LeftLeg/mixamorig:LeftFoot/mixamorig:LeftToeBase/mixamorig:LeftToe_End + weight: 0 + - path: mixamorig:Hips/mixamorig:RightUpLeg + weight: 1 + - path: mixamorig:Hips/mixamorig:RightUpLeg/mixamorig:RightLeg + weight: 1 + - path: mixamorig:Hips/mixamorig:RightUpLeg/mixamorig:RightLeg/mixamorig:RightFoot + weight: 1 + - path: mixamorig:Hips/mixamorig:RightUpLeg/mixamorig:RightLeg/mixamorig:RightFoot/mixamorig:RightToeBase + weight: 1 + - path: mixamorig:Hips/mixamorig:RightUpLeg/mixamorig:RightLeg/mixamorig:RightFoot/mixamorig:RightToeBase/mixamorig:RightToe_End + weight: 0 + - path: mixamorig:Hips/mixamorig:Spine + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1 + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2 + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:LeftShoulder + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:LeftShoulder/mixamorig:LeftArm + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:LeftShoulder/mixamorig:LeftArm/mixamorig:LeftForeArm + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:LeftShoulder/mixamorig:LeftArm/mixamorig:LeftForeArm/mixamorig:LeftHand + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:Neck + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:Neck/mixamorig:Head + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:Neck/mixamorig:Head/mixamorig:HeadTop_End + weight: 0 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:Neck/mixamorig:Head/mixamorig:LeftEye + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:Neck/mixamorig:Head/mixamorig:RightEye + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:RightShoulder + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:RightShoulder/mixamorig:RightArm + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:RightShoulder/mixamorig:RightArm/mixamorig:RightForeArm + weight: 1 + - path: mixamorig:Hips/mixamorig:Spine/mixamorig:Spine1/mixamorig:Spine2/mixamorig:RightShoulder/mixamorig:RightArm/mixamorig:RightForeArm/mixamorig:RightHand + weight: 1 + maskType: 0 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 0.01 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + importVisibility: 0 + importBlendShapes: 1 + importCameras: 0 + importLights: 0 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 0 + previousCalculatedGlobalScale: 0.01 + hasPreviousCalculatedGlobalScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 4 + normalCalculationMode: 0 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 1 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: + - boneName: mixamorig:Hips + humanName: Hips + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftUpLeg + humanName: LeftUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightUpLeg + humanName: RightUpperLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftLeg + humanName: LeftLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightLeg + humanName: RightLowerLeg + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftFoot + humanName: LeftFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightFoot + humanName: RightFoot + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Spine + humanName: Spine + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Spine1 + humanName: Chest + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Neck + humanName: Neck + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:Head + humanName: Head + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftShoulder + humanName: LeftShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightShoulder + humanName: RightShoulder + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftArm + humanName: LeftUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightArm + humanName: RightUpperArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftForeArm + humanName: LeftLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightForeArm + humanName: RightLowerArm + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftHand + humanName: LeftHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightHand + humanName: RightHand + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftToeBase + humanName: LeftToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightToeBase + humanName: RightToes + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:LeftEye + humanName: LeftEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + - boneName: mixamorig:RightEye + humanName: RightEye + limit: + min: {x: 0, y: 0, z: 0} + max: {x: 0, y: 0, z: 0} + value: {x: 0, y: 0, z: 0} + length: 0 + modified: 0 + skeleton: + - name: lincoln@standing_idle_unarmed_2(Clone) + parentName: + position: {x: 0, y: 0, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Hips + parentName: + position: {x: 0, y: 1.0045359, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftUpLeg + parentName: + position: {x: -0.081593, y: -0.06756, z: 0.0013439999} + rotation: {x: -0.12282104, y: 0.11001766, z: 0.982577, w: 0.08575298} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftLeg + parentName: + position: {x: -0, y: 0.403736, z: 0} + rotation: {x: -0.2131026, y: 0.10082204, z: -0.0020932336, w: 0.97181165} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftFoot + parentName: + position: {x: -0, y: 0.41347998, z: 0} + rotation: {x: 0.5033147, y: -0.050738297, z: 0.07166365, w: 0.85963035} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftToeBase + parentName: + position: {x: -0, y: 0.16364901, z: 0} + rotation: {x: 0.34718862, y: -0.036823444, z: 0.013464459, w: 0.93697536} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftToe_End + parentName: + position: {x: -0, y: 0.099526994, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightUpLeg + parentName: + position: {x: 0.081488, y: -0.068782, z: 0.0012809999} + rotation: {x: 0.03793196, y: 0.038892135, z: 0.9984157, w: 0.014653017} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightLeg + parentName: + position: {x: -0, y: 0.406804, z: 0} + rotation: {x: -0.18197103, y: -0.026885914, z: -0.050989468, w: 0.98161286} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightFoot + parentName: + position: {x: -0, y: 0.40984797, z: 0} + rotation: {x: 0.54187673, y: -0.009782431, z: 0.040255833, w: 0.83943635} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightToeBase + parentName: + position: {x: -0, y: 0.16248399, z: 0} + rotation: {x: 0.34802595, y: 0.037505813, z: -0.013710648, w: 0.936634} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightToe_End + parentName: + position: {x: -0, y: 0.098882996, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Spine + parentName: + position: {x: -0.000020999998, y: 0.098685, z: -0.015292999} + rotation: {x: -0.059465375, y: 0.012873158, z: -0.005675536, w: 0.9981312} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Spine1 + parentName: + position: {x: -0, y: 0.114257, z: 0} + rotation: {x: 0.023790378, y: 0.004482713, z: -0.022753976, w: 0.99944794} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Spine2 + parentName: + position: {x: -0, y: 0.1354, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftShoulder + parentName: + position: {x: -0.059449, y: 0.09176099, z: 0.018397} + rotation: {x: -0.52696013, y: 0.6127967, z: -0.47158787, w: -0.35270113} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftArm + parentName: + position: {x: -0, y: 0.126519, z: 0} + rotation: {x: -0.013084532, y: -0.22238444, z: -0.10089926, w: 0.96963567} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftForeArm + parentName: + position: {x: -0, y: 0.28202498, z: 0} + rotation: {x: -0.014845088, y: -0.020722613, z: -0.0232248, w: 0.99940526} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftHand + parentName: + position: {x: -0, y: 0.268246, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Neck + parentName: + position: {x: -0.000012, y: 0.151501, z: 0.028294} + rotation: {x: 0.0654941, y: 0.0032751537, z: -0.00131082, w: 0.9978467} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:Head + parentName: + position: {x: -0.000064, y: 0.10531999, z: 0.030171} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:HeadTop_End + parentName: + position: {x: 0.000086, y: 0.18782699, z: 0.067962} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:LeftEye + parentName: + position: {x: -0.027834, y: 0.078687, z: 0.084245004} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightEye + parentName: + position: {x: 0.027562, y: 0.078688, z: 0.084245004} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightShoulder + parentName: + position: {x: 0.05945, y: 0.091477, z: 0.018344998} + rotation: {x: 0.53134245, y: 0.60658103, z: -0.47762686, w: 0.3487223} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightArm + parentName: + position: {x: -0, y: 0.126527, z: 0} + rotation: {x: -0.06864686, y: 0.03565173, z: 0.09430651, w: 0.99253356} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightForeArm + parentName: + position: {x: -0, y: 0.28208, z: 0} + rotation: {x: -0.01472196, y: 0.0017422438, z: 0.03062749, w: 0.99942094} + scale: {x: 1, y: 1, z: 1} + - name: mixamorig:RightHand + parentName: + position: {x: -0, y: 0.268204, z: 0} + rotation: {x: 0, y: 0, z: 0, w: 1} + scale: {x: 1, y: 1, z: 1} + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 1 + hasExtraRoot: 0 + skeletonHasParents: 0 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 3 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/white-house-2-1235638.jpg b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/white-house-2-1235638.jpg new file mode 100644 index 0000000..dd406a8 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/white-house-2-1235638.jpg differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/white-house-2-1235638.jpg.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/white-house-2-1235638.jpg.meta new file mode 100644 index 0000000..c0966b8 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Models/white-house-2-1235638.jpg.meta @@ -0,0 +1,114 @@ +fileFormatVersion: 2 +guid: 3fdf250cec4ffe347af2c473f00865ae +timeCreated: 1437411503 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites.meta new file mode 100644 index 0000000..59057b1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 59f0815287063c145844e6d5c2437fa3 +folderAsset: yes +timeCreated: 1459805980 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_down.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_down.png new file mode 100644 index 0000000..1d4167b Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_down.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_down.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_down.png.meta new file mode 100644 index 0000000..ed437b6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_down.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: d4951d81d42618643b8d4be856b51c0b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_forward.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_forward.png new file mode 100644 index 0000000..05587cf Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_forward.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_forward.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_forward.png.meta new file mode 100644 index 0000000..86c2af1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_forward.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 4f1a720a7dfd3424cb396efdb4dd19c2 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_left.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_left.png new file mode 100644 index 0000000..0cf12ed Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_left.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_left.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_left.png.meta new file mode 100644 index 0000000..6ee3fd2 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_left.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: bcf8456845ce209498a3449268c15f19 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_right.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_right.png new file mode 100644 index 0000000..ef92563 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_right.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_right.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_right.png.meta new file mode 100644 index 0000000..714d5cb --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_right.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: d697fe6a053662e42be6934cb3d2f425 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_up.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_up.png new file mode 100644 index 0000000..0693a70 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_up.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_up.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_up.png.meta new file mode 100644 index 0000000..d4836f6 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyeballs_up.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 55e7b84c4f8058947a6500f92bdce804 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_furrowed.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_furrowed.png new file mode 100644 index 0000000..6821cff Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_furrowed.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_furrowed.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_furrowed.png.meta new file mode 100644 index 0000000..267c0a0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_furrowed.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 81de45ba86894e140a3ab593b3b1e76e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_neutral.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_neutral.png new file mode 100644 index 0000000..682c94d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_neutral.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_neutral.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_neutral.png.meta new file mode 100644 index 0000000..4a740d2 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_neutral.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 59a910e1c30b8bc4a9f1c146cb9b2ae4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_raised.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_raised.png new file mode 100644 index 0000000..66b5bfe Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_raised.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_raised.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_raised.png.meta new file mode 100644 index 0000000..d1edb88 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyebrows_raised.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: ce5c7b548b67adb468dd80bcddf9ea01 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_closed.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_closed.png new file mode 100644 index 0000000..ba33421 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_closed.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_closed.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_closed.png.meta new file mode 100644 index 0000000..dee4211 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_closed.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 18ae0103132e26b489e1580a1bfbe38d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_open.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_open.png new file mode 100644 index 0000000..ed90af2 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_open.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_open.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_open.png.meta new file mode 100644 index 0000000..a477a45 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/eyes_open.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 903d3a5489b80b44c912d5d0fbf1af9c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/face_base.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/face_base.png new file mode 100644 index 0000000..8c2c9e0 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/face_base.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/face_base.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/face_base.png.meta new file mode 100644 index 0000000..d09cd72 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/face_base.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: dead7b313dd00b54b858fae9eb785670 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_A.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_A.png new file mode 100644 index 0000000..ea87826 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_A.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_A.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_A.png.meta new file mode 100644 index 0000000..3e3063d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_A.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 2331cef62fd55f84b93ea17bbda44074 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_E.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_E.png new file mode 100644 index 0000000..a2f9586 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_E.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_E.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_E.png.meta new file mode 100644 index 0000000..0274611 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_E.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: a06aed6b2f2cdc34c88a15a6a65b7b7a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_M.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_M.png new file mode 100644 index 0000000..44855bc Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_M.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_M.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_M.png.meta new file mode 100644 index 0000000..512e63d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_M.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: eb85da52c967ec44891514579b8c5634 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_O.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_O.png new file mode 100644 index 0000000..00ef8d8 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_O.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_O.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_O.png.meta new file mode 100644 index 0000000..11f3a8f --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_O.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 31889678bc3adae42a12165a6928af93 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_W.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_W.png new file mode 100644 index 0000000..c99656d Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_W.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_W.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_W.png.meta new file mode 100644 index 0000000..e0e5f93 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_W.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 0add27a6dccbe6147bd96c25751a4cb2 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_rest.png b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_rest.png new file mode 100644 index 0000000..3f83602 Binary files /dev/null and b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_rest.png differ diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_rest.png.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_rest.png.meta new file mode 100644 index 0000000..a02069c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Examples/Sprites/mouth_rest.png.meta @@ -0,0 +1,163 @@ +fileFormatVersion: 2 +guid: 2c7a56b3dc9988544bba367692993603 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets.meta new file mode 100644 index 0000000..7edc523 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1bc8eb84714067f42a04dc970c8ed272 +folderAsset: yes +timeCreated: 1473886439 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets/Preston Blair (English).asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets/Preston Blair (English).asset new file mode 100644 index 0000000..0181d6a --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets/Preston Blair (English).asset @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5e19889bf5d1a7a4e9d54d7b076c7ebd, type: 3} + m_Name: Preston Blair (English) + m_EditorClassIdentifier: + isLegacyFormat: 0 + scriptingName: PrestonBlair + phonemes: + phonemeNames: + - AI + - E + - U + - O + - CDGKNRSThYZ + - FV + - L + - MBP + - WQ + - Rest + phonemeList: + - name: AI + number: 0 + flag: 1 + visuallyImportant: 0 + guideImage: {fileID: 2800000, guid: 3161e702c666a1f4d8cedfae9e7b1a5e, type: 3} + - name: E + number: 1 + flag: 2 + visuallyImportant: 0 + guideImage: {fileID: 2800000, guid: c2b822832e10eca4fa278f1b51daa26e, type: 3} + - name: U + number: 2 + flag: 4 + visuallyImportant: 0 + guideImage: {fileID: 2800000, guid: fa2a440ad71b40b42a982048a56b5a00, type: 3} + - name: O + number: 3 + flag: 8 + visuallyImportant: 0 + guideImage: {fileID: 2800000, guid: d3b724caf22f25548b438a7834b87e91, type: 3} + - name: CDGKNRSThYZ + number: 4 + flag: 16 + visuallyImportant: 0 + guideImage: {fileID: 2800000, guid: 8ba44f1112856a9489917f711cbd1fff, type: 3} + - name: FV + number: 5 + flag: 32 + visuallyImportant: 1 + guideImage: {fileID: 2800000, guid: 525ebc52f22477e4286d8acd16dacb46, type: 3} + - name: L + number: 6 + flag: 64 + visuallyImportant: 0 + guideImage: {fileID: 2800000, guid: 0cabe6e82f6fd7443bc6e668eb1c7ddd, type: 3} + - name: MBP + number: 7 + flag: 128 + visuallyImportant: 1 + guideImage: {fileID: 2800000, guid: fb719555aa26eb14288cae4787f11f28, type: 3} + - name: WQ + number: 8 + flag: 256 + visuallyImportant: 1 + guideImage: {fileID: 2800000, guid: 37ab031cd42ce8848a1cd95ee5ee37a3, type: 3} + - name: Rest + number: 9 + flag: 512 + visuallyImportant: 1 + guideImage: {fileID: 0} + guideImages: + - {fileID: 2800000, guid: 3161e702c666a1f4d8cedfae9e7b1a5e, type: 3} + - {fileID: 2800000, guid: c2b822832e10eca4fa278f1b51daa26e, type: 3} + - {fileID: 2800000, guid: fa2a440ad71b40b42a982048a56b5a00, type: 3} + - {fileID: 2800000, guid: d3b724caf22f25548b438a7834b87e91, type: 3} + - {fileID: 2800000, guid: 8ba44f1112856a9489917f711cbd1fff, type: 3} + - {fileID: 2800000, guid: 525ebc52f22477e4286d8acd16dacb46, type: 3} + - {fileID: 2800000, guid: 0cabe6e82f6fd7443bc6e668eb1c7ddd, type: 3} + - {fileID: 2800000, guid: fb719555aa26eb14288cae4787f11f28, type: 3} + - {fileID: 2800000, guid: 37ab031cd42ce8848a1cd95ee5ee37a3, type: 3} + - {fileID: 0} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets/Preston Blair (English).asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets/Preston Blair (English).asset.meta new file mode 100644 index 0000000..d1f2a87 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Phoneme Sets/Preston Blair (English).asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad5dc77f69c3ee14980347476da8fb6c +timeCreated: 1475529330 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets.meta new file mode 100644 index 0000000..8925204 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 872708a5d1d563f4e8537ed89af917d6 +folderAsset: yes +timeCreated: 1435074671 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse.meta new file mode 100644 index 0000000..75f3049 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8e8726cdd48900a429ca12a21452ece4 +folderAsset: yes +timeCreated: 1453225954 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Exaggerated.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Exaggerated.asset new file mode 100644 index 0000000..cf8fbe3 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Exaggerated.asset @@ -0,0 +1,213 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: db07302a52ae0d84f8f0c1bf5a629241, type: 3} + m_Name: Exaggerated + m_EditorClassIdentifier: + displayPath: Adobe (Mixamo) Fuse/Exaggerated + isRelative: 0 + phonemeShapes: + - phonemeName: AI + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 55.1 + - blendableNumber: 22 + blendableName: Jaw_Down (22) + weight: 54.1 + bones: [] + - phonemeName: E + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 25.3 + - blendableNumber: 41 + blendableName: Smile_Left (41) + weight: 52.4 + - blendableNumber: 42 + blendableName: Smile_Right (42) + weight: 52.4 + - blendableNumber: 45 + blendableName: TongueUp (45) + weight: 2.2 + - blendableNumber: 47 + blendableName: UpperLipOut (47) + weight: 15.7 + bones: [] + - phonemeName: U + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 33.4 + - blendableNumber: 33 + blendableName: MouthNarrow_Left (33) + weight: 52.1 + - blendableNumber: 34 + blendableName: MouthNarrow_Right (34) + weight: 53.2 + - blendableNumber: 29 + blendableName: LowerLipOut (29) + weight: 80.1 + - blendableNumber: 47 + blendableName: UpperLipOut (47) + weight: 90.2 + bones: [] + - phonemeName: O + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 44.7 + - blendableNumber: 33 + blendableName: MouthNarrow_Left (33) + weight: 91.6 + - blendableNumber: 34 + blendableName: MouthNarrow_Right (34) + weight: 92.1 + bones: [] + - phonemeName: CDGKNRSThYZ + phoneme: 0 + blendables: + - blendableNumber: 22 + blendableName: Jaw_Down (22) + weight: 12.7 + bones: [] + - phonemeName: FV + phoneme: 0 + blendables: + - blendableNumber: 22 + blendableName: Jaw_Down (22) + weight: 51.7 + - blendableNumber: 28 + blendableName: LowerLipIn (28) + weight: 100 + - blendableNumber: 16 + blendableName: JawBackward (16) + weight: 48.2 + - blendableNumber: 41 + blendableName: Smile_Left (41) + weight: 35.2 + - blendableNumber: 42 + blendableName: Smile_Right (42) + weight: 36.3 + - blendableNumber: 47 + blendableName: UpperLipOut (47) + weight: 0 + bones: [] + - phonemeName: L + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 53.7 + - blendableNumber: 45 + blendableName: TongueUp (45) + weight: 100 + - blendableNumber: 39 + blendableName: NoseScrunch_Left (39) + weight: 16.1 + bones: [] + - phonemeName: MBP + phoneme: 0 + blendables: + - blendableNumber: 32 + blendableName: MouthDown (32) + weight: 41.2 + - blendableNumber: 28 + blendableName: LowerLipIn (28) + weight: 83.5 + - blendableNumber: 46 + blendableName: UpperLipIn (46) + weight: 83.7 + bones: [] + - phonemeName: WQ + phoneme: 0 + blendables: + - blendableNumber: 33 + blendableName: MouthNarrow_Left (33) + weight: 96.9 + - blendableNumber: 34 + blendableName: MouthNarrow_Right (34) + weight: 96.2 + - blendableNumber: 29 + blendableName: LowerLipOut (29) + weight: 74.7 + bones: [] + - phonemeName: Rest + phoneme: 0 + blendables: [] + bones: [] + emotionShapes: + - emotion: Happy + blendables: + - blendableNumber: 41 + blendableName: Smile_Left (41) + weight: 55.3 + - blendableNumber: 42 + blendableName: Smile_Right (42) + weight: 56.4 + - blendableNumber: 43 + blendableName: Squint_Left (43) + weight: 23.6 + - blendableNumber: 44 + blendableName: Squint_Right (44) + weight: 25.1 + - blendableNumber: 8 + blendableName: BrowsUp_Left (8) + weight: 20.5 + - blendableNumber: 9 + blendableName: BrowsUp_Right (9) + weight: 17.8 + bones: [] + - emotion: Sad + blendables: + - blendableNumber: 32 + blendableName: MouthDown (32) + weight: 18.9 + - blendableNumber: 14 + blendableName: Frown_Left (14) + weight: 43.2 + - blendableNumber: 15 + blendableName: Frown_Right (15) + weight: 47.5 + - blendableNumber: 6 + blendableName: BrowsOuterLower_Left (6) + weight: 57.7 + - blendableNumber: 7 + blendableName: BrowsOuterLower_Right (7) + weight: 60.3 + bones: [] + - emotion: Serious + blendables: + - blendableNumber: 2 + blendableName: BrowsDown_Left (2) + weight: 50.1 + - blendableNumber: 3 + blendableName: BrowsDown_Right (3) + weight: 49.9 + bones: [] + - emotion: Eyebrows Up + blendables: + - blendableNumber: 8 + blendableName: BrowsUp_Left (8) + weight: 27.5 + - blendableNumber: 9 + blendableName: BrowsUp_Right (9) + weight: 28.1 + - blendableNumber: 7 + blendableName: BrowsOuterLower_Right (7) + weight: 21.8 + - blendableNumber: 6 + blendableName: BrowsOuterLower_Left (6) + weight: 22.6 + bones: [] diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Exaggerated.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Exaggerated.asset.meta new file mode 100644 index 0000000..1ad6199 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Exaggerated.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c818a47531bdc104a93e708f197fa9fa +timeCreated: 1489066874 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Standard.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Standard.asset new file mode 100644 index 0000000..084bbc0 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Standard.asset @@ -0,0 +1,210 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: db07302a52ae0d84f8f0c1bf5a629241, type: 3} + m_Name: Standard + m_EditorClassIdentifier: + displayPath: Adobe (Mixamo) Fuse/Standard + isRelative: 0 + phonemeShapes: + - phonemeName: AI + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 42.7 + bones: [] + - phonemeName: E + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 24.4 + - blendableNumber: 41 + blendableName: Smile_Left (41) + weight: 42.9 + - blendableNumber: 42 + blendableName: Smile_Right (42) + weight: 41.1 + - blendableNumber: 45 + blendableName: TongueUp (45) + weight: 2.2 + - blendableNumber: 30 + blendableName: Midmouth_Left (30) + weight: 11.3 + - blendableNumber: 47 + blendableName: UpperLipOut (47) + weight: 20.9 + bones: [] + - phonemeName: U + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 24.8 + - blendableNumber: 33 + blendableName: MouthNarrow_Left (33) + weight: 42.7 + - blendableNumber: 34 + blendableName: MouthNarrow_Right (34) + weight: 43.7 + - blendableNumber: 29 + blendableName: LowerLipOut (29) + weight: 55.7 + - blendableNumber: 47 + blendableName: UpperLipOut (47) + weight: 70.4 + bones: [] + - phonemeName: O + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 61.7 + - blendableNumber: 33 + blendableName: MouthNarrow_Left (33) + weight: 72 + - blendableNumber: 34 + blendableName: MouthNarrow_Right (34) + weight: 72 + bones: [] + - phonemeName: CDGKNRSThYZ + phoneme: 0 + blendables: + - blendableNumber: 22 + blendableName: Jaw_Down (22) + weight: 14.6 + bones: [] + - phonemeName: FV + phoneme: 0 + blendables: + - blendableNumber: 22 + blendableName: Jaw_Down (22) + weight: 0 + - blendableNumber: 28 + blendableName: LowerLipIn (28) + weight: 100 + - blendableNumber: 41 + blendableName: Smile_Left (41) + weight: 22 + - blendableNumber: 42 + blendableName: Smile_Right (42) + weight: 36.9 + - blendableNumber: 47 + blendableName: UpperLipOut (47) + weight: 100 + bones: [] + - phonemeName: L + phoneme: 0 + blendables: + - blendableNumber: 35 + blendableName: MouthOpen (35) + weight: 31.5 + - blendableNumber: 45 + blendableName: TongueUp (45) + weight: 100 + - blendableNumber: 39 + blendableName: NoseScrunch_Left (39) + weight: 16.1 + bones: [] + - phonemeName: MBP + phoneme: 0 + blendables: + - blendableNumber: 32 + blendableName: MouthDown (32) + weight: 12.6 + - blendableNumber: 28 + blendableName: LowerLipIn (28) + weight: 69.4 + - blendableNumber: 46 + blendableName: UpperLipIn (46) + weight: 66.8 + bones: [] + - phonemeName: WQ + phoneme: 0 + blendables: + - blendableNumber: 33 + blendableName: MouthNarrow_Left (33) + weight: 89.6 + - blendableNumber: 34 + blendableName: MouthNarrow_Right (34) + weight: 89.8 + - blendableNumber: 29 + blendableName: LowerLipOut (29) + weight: 28.7 + bones: [] + - phonemeName: Rest + phoneme: 0 + blendables: [] + bones: [] + emotionShapes: + - emotion: Happy + blendables: + - blendableNumber: 41 + blendableName: Smile_Left (41) + weight: 55.3 + - blendableNumber: 42 + blendableName: Smile_Right (42) + weight: 56.4 + - blendableNumber: 43 + blendableName: Squint_Left (43) + weight: 35.2 + - blendableNumber: 44 + blendableName: Squint_Right (44) + weight: 35.2 + - blendableNumber: 8 + blendableName: BrowsUp_Left (8) + weight: 20.5 + - blendableNumber: 9 + blendableName: BrowsUp_Right (9) + weight: 17.8 + bones: [] + - emotion: Sad + blendables: + - blendableNumber: 32 + blendableName: MouthDown (32) + weight: 18.9 + - blendableNumber: 14 + blendableName: Frown_Left (14) + weight: 43.2 + - blendableNumber: 15 + blendableName: Frown_Right (15) + weight: 47.5 + - blendableNumber: 6 + blendableName: BrowsOuterLower_Left (6) + weight: 57.7 + - blendableNumber: 7 + blendableName: BrowsOuterLower_Right (7) + weight: 60.3 + bones: [] + - emotion: Serious + blendables: + - blendableNumber: 2 + blendableName: BrowsDown_Left (2) + weight: 50.1 + - blendableNumber: 3 + blendableName: BrowsDown_Right (3) + weight: 49.9 + bones: [] + - emotion: Eyebrows Up + blendables: + - blendableNumber: 8 + blendableName: BrowsUp_Left (8) + weight: 27.5 + - blendableNumber: 9 + blendableName: BrowsUp_Right (9) + weight: 28.1 + - blendableNumber: 7 + blendableName: BrowsOuterLower_Right (7) + weight: 21.8 + - blendableNumber: 6 + blendableName: BrowsOuterLower_Left (6) + weight: 22.6 + bones: [] diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Standard.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Standard.asset.meta new file mode 100644 index 0000000..aa40c88 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/Adobe (Mixamo) Fuse/Standard.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52e4368a86357b045bfc335aac1089f2 +timeCreated: 1489066804 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/CC3 Standard.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/CC3 Standard.asset new file mode 100644 index 0000000..eec7f10 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/CC3 Standard.asset @@ -0,0 +1,229 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: db07302a52ae0d84f8f0c1bf5a629241, type: 3} + m_Name: CC3 Standard + m_EditorClassIdentifier: + displayPath: CC3/Standard + isRelative: 1 + phonemeShapes: + - phonemeName: AI + phoneme: 0 + blendables: [] + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0.0022567948, y: 0.0019086301, z: 0.0000016197082} + localRotation: {x: 359.99997, y: 0, z: 351.27847} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: E + phoneme: 0 + blendables: + - blendableNumber: 5 + blendableName: Wide (5) + weight: 100 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0, y: 0, z: 0} + localRotation: {x: 0.000030517578, y: 0, z: 354.8768} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: U + phoneme: 0 + blendables: + - blendableNumber: 6 + blendableName: Affricate (6) + weight: 71.6 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0.004437891, y: -0.0002500657, z: 0.000003929388} + localRotation: {x: 0, y: 0, z: 356.77588} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: O + phoneme: 0 + blendables: + - blendableNumber: 3 + blendableName: Tight-O (3) + weight: 100 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0.004229809, y: 0.0016925633, z: 0.000003389221} + localRotation: {x: 0, y: 0, z: 352.78656} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: CDGKNRSThYZ + phoneme: 0 + blendables: + - blendableNumber: 7 + blendableName: Lip_Open (7) + weight: 55.2 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0, y: 0, z: 0} + localRotation: {x: 0, y: 0, z: 0} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: FV + phoneme: 0 + blendables: + - blendableNumber: 2 + blendableName: Dental_Lip (2) + weight: 100 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0, y: 0, z: 0} + localRotation: {x: 0, y: 0, z: 0} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: L + phoneme: 0 + blendables: + - blendableNumber: 69 + blendableName: Tongue_Raise (69) + weight: 100 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0.0006134156, y: -0.0013156701, z: 0.0000007740673} + localRotation: {x: 359.99997, y: 0, z: 357.96725} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: MBP + phoneme: 0 + blendables: + - blendableNumber: 1 + blendableName: Explosive (1) + weight: 100 + - blendableNumber: 40 + blendableName: Mouth_Pucker (40) + weight: 10 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0.000518254, y: 0.0020716153, z: 0.000000062536856} + localRotation: {x: 0, y: 0, z: 0} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: WQ + phoneme: 0 + blendables: + - blendableNumber: 4 + blendableName: Tight (4) + weight: 100 + bones: + - path: CC_Base_FacialBone/CC_Base_Head/CC_Base_NeckTwist02/CC_Base_NeckTwist01/CC_Base_Spine02/CC_Base_Spine01/CC_Base_Waist/CC_Base_Hip/CC_Base_BoneRoot/4k_cc3girl/ + name: CC_Base_JawRoot + localPosition: {x: 0, y: 0, z: 0} + localRotation: {x: 0, y: 0, z: 0} + localScale: {x: 0, y: 0, z: 0} + lockPosition: 0 + lockRotation: 0 + lockScale: 0 + - phonemeName: Rest + phoneme: 0 + blendables: [] + bones: [] + emotionShapes: + - emotion: Happy + blendables: + - blendableNumber: 33 + blendableName: Mouth_Smile (33) + weight: 100 + - blendableNumber: 21 + blendableName: Eye_Squint_L (21) + weight: 60 + - blendableNumber: 22 + blendableName: Eye_Squint_R (22) + weight: 58.1 + - blendableNumber: 34 + blendableName: Mouth_Smile_L (34) + weight: 23.4 + - blendableNumber: 35 + blendableName: Mouth_Smile_R (35) + weight: 18.1 + - blendableNumber: 7 + blendableName: Lip_Open (7) + weight: 100 + bones: [] + - emotion: Serious + blendables: + - blendableNumber: 12 + blendableName: Brow_Drop_L (12) + weight: 100 + - blendableNumber: 13 + blendableName: Brow_Drop_R (13) + weight: 100 + - blendableNumber: 21 + blendableName: Eye_Squint_L (21) + weight: 19.7 + - blendableNumber: 22 + blendableName: Eye_Squint_R (22) + weight: 17 + - blendableNumber: 36 + blendableName: Mouth_Frown (36) + weight: 9.8 + bones: [] + - emotion: Eyebrows Up + blendables: + - blendableNumber: 14 + blendableName: Brow_Raise_L (14) + weight: 100 + - blendableNumber: 15 + blendableName: Brow_Raise_R (15) + weight: 100 + - blendableNumber: 10 + blendableName: Brow_Raise_Outer_L (10) + weight: 13.5 + - blendableNumber: 11 + blendableName: Brow_Raise_Outer_R (11) + weight: 13.5 + - blendableNumber: 19 + blendableName: Eye_Wide_L (19) + weight: 29.5 + - blendableNumber: 20 + blendableName: Eye_Wide_R (20) + weight: 30.3 + bones: [] + - emotion: Sad + blendables: + - blendableNumber: 36 + blendableName: Mouth_Frown (36) + weight: 70.8 + - blendableNumber: 8 + blendableName: Brow_Raise_Inner_L (8) + weight: 47.9 + - blendableNumber: 9 + blendableName: Brow_Raise_Inner_R (9) + weight: 46.9 + bones: [] diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/CC3 Standard.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/CC3 Standard.asset.meta new file mode 100644 index 0000000..af3eec1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/Presets/CC3 Standard.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf03d1331fa15dd44a34e0dcf7f9483b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/ProjectSettings.asset b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/ProjectSettings.asset new file mode 100644 index 0000000..8cc9e9e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/ProjectSettings.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d88ce0f977278ac4590f827247ba60de, type: 3} + m_Name: ProjectSettings + m_EditorClassIdentifier: + emotions: + - Happy + - Serious + - Eyebrows Up + - Sad + emotionColors: + - {r: 1, g: 0.6827586, b: 0, a: 1} + - {r: 0.31764707, g: 0.31764707, b: 0.31764707, a: 1} + - {r: 0.74219066, g: 1, b: 0.39705884, a: 1} + - {r: 0, g: 0.54509807, b: 1, a: 1} + gestures: [] + phonemeSet: {fileID: 11400000, guid: ad5dc77f69c3ee14980347476da8fb6c, type: 2} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/ProjectSettings.asset.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/ProjectSettings.asset.meta new file mode 100644 index 0000000..8a37553 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/LipSync Pro/ProjectSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9b2ff63322d0223438d40d7ed35a642b +timeCreated: 1463414592 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared.meta new file mode 100644 index 0000000..75bb1ff --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0f2bb419668d5a645938e747eaaa1db5 +folderAsset: yes +timeCreated: 1476922539 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor.meta new file mode 100644 index 0000000..29e4dd1 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 952146bf09adbe24a855749aff5ddcfe +folderAsset: yes +timeCreated: 1476922539 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ContinuationManager.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ContinuationManager.cs new file mode 100644 index 0000000..1e9ba89 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ContinuationManager.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; + +namespace RogoDigital { + public static class ContinuationManager { + public class Job { + public Job (Func completed, System.Action continueWith) { + Completed = completed; + ContinueWith = continueWith; + } + + public Func Completed { get; private set; } + public System.Action ContinueWith { get; private set; } + } + + private static readonly List jobs = new List(); + + public static void Add (Func completed, System.Action continueWith) { + if (!jobs.Any()) EditorApplication.update += Update; + Job job = new Job(completed, continueWith); + jobs.Add(job); + } + + private static void Update () { + for (int i = jobs.Count - 1; i >= 0; --i) { + var jobIt = jobs[i]; + if (jobIt.Completed()) { + jobs.RemoveAt(i); + jobIt.ContinueWith(); + } + } + if (!jobs.Any()) EditorApplication.update -= Update; + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ContinuationManager.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ContinuationManager.cs.meta new file mode 100644 index 0000000..0dfee45 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ContinuationManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 477a4c411ca914c418e342f6cdbe4b17 +timeCreated: 1436887986 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalParent.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalParent.cs new file mode 100644 index 0000000..f2ba3dd --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalParent.cs @@ -0,0 +1,35 @@ +using UnityEngine; +using UnityEditor; + +namespace RogoDigital { + public class ModalParent : EditorWindow { + public bool disabled = false; + public ModalWindow currentModal = null; + public Vector2 center { + get { + return new Vector2(position.x + (position.width / 2), position.y + (position.height / 2)); + } + } + + public virtual void OnModalGUI () { + } + + void OnGUI () { + if (Event.current.type == EventType.Repaint) { + EditorGUI.BeginDisabledGroup(currentModal != null || disabled); + if (currentModal != null) { + Event.current = null; + } + } + OnModalGUI(); + if (Event.current.type == EventType.Repaint) EditorGUI.EndDisabledGroup(); + } + + void OnFocus () { + if (currentModal != null) { + EditorApplication.Beep(); + currentModal.Focus(); + } + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalParent.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalParent.cs.meta new file mode 100644 index 0000000..a62b50e --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalParent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 05f3b1868511f504b8989a6310d5e0f5 +timeCreated: 1441934078 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalWindow.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalWindow.cs new file mode 100644 index 0000000..141ee9d --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalWindow.cs @@ -0,0 +1,18 @@ +using UnityEditor; + +namespace RogoDigital { + public class ModalWindow : EditorWindow { + public ModalParent parent; + + public void Show (ModalParent parent) { + this.parent = parent; + parent.currentModal = this; + base.ShowUtility(); + } + + private void OnDestroy () { + parent.currentModal = null; + parent.Focus(); + } + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalWindow.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalWindow.cs.meta new file mode 100644 index 0000000..0201476 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/ModalWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 62caba765b0edaf4cb90e919115327bd +timeCreated: 1441934006 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDEditorShortcut.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDEditorShortcut.cs new file mode 100644 index 0000000..4ac7310 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDEditorShortcut.cs @@ -0,0 +1,80 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace RogoDigital { + public class RDEditorShortcut { + public delegate void RDEditorShortcutActionDelegate (); + + public int action; + public KeyCode key; + public EventModifiers modifiers; + + public static void Serialize (string prefix, RDEditorShortcut[] shortcuts) { + if (shortcuts.Length == 0) { Debug.LogError("Shortcuts list was empty."); return; } + + string info = shortcuts.Length.ToString() + "_"; + for (int a = 0; a < shortcuts.Length; a++) { + info += (int)shortcuts[a].modifiers + "_" + (int)shortcuts[a].key + "_" + shortcuts[a].action + "_"; + } + + EditorPrefs.SetString(prefix + "_KeyboardShortcuts", info); + } + + public static RDEditorShortcut[] Deserialize (string prefix, List actions) { + return Deserialize(prefix, actions, null); + } + + public static RDEditorShortcut[] Deserialize (string prefix, List actions, RDEditorShortcut[] defaults) { + if (!EditorPrefs.HasKey(prefix + "_KeyboardShortcuts")) return defaults; + + string[] info = EditorPrefs.GetString(prefix + "_KeyboardShortcuts").Split('_'); + int count = int.Parse(info[0]); + + if (count < 3) return defaults; + + RDEditorShortcut[] shortcuts = new RDEditorShortcut[count]; + + int infoCount = 1; + for (int a = 0; a < count; a++) { + RDEditorShortcut shortcut = new RDEditorShortcut(); + try { + shortcut.modifiers = (EventModifiers)int.Parse(info[infoCount]); + shortcut.key = (KeyCode)int.Parse(info[infoCount + 1]); + shortcut.action = int.Parse(info[infoCount + 2]); + } catch (System.Exception e) { + Debug.Log(e.Message); + } + + infoCount += 3; + + shortcuts[a] = shortcut; + } + + return shortcuts; + } + + public RDEditorShortcut () { + } + + public RDEditorShortcut (int action, KeyCode key, EventModifiers modifier) { + this.action = action; + this.key = key; + this.modifiers = modifier; + } + + public struct Action { + public string name; + public RDEditorShortcutActionDelegate action; + + public Action (string name, RDEditorShortcutActionDelegate action) { + this.name = name; + this.action = action; + } + + public static implicit operator string (Action action) { + return action.name; + } + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDEditorShortcut.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDEditorShortcut.cs.meta new file mode 100644 index 0000000..8975d2c --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDEditorShortcut.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eed7874a874fa7945a5d1d3a7dfa9c7a +timeCreated: 1467826058 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDExtensionWindow.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDExtensionWindow.cs new file mode 100644 index 0000000..bfdadee --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDExtensionWindow.cs @@ -0,0 +1,838 @@ +using RogoDigital; +using UnityEngine; +using UnityEditor; +using UnityEngine.Networking; + +using System; +using System.IO; +using System.Collections.Generic; +using System.Xml; +using System.Globalization; + +public class RDExtensionWindow : EditorWindow +{ + public bool downloading = false; + public int connectionsInProgress = 0; + public string currentExtension = ""; + + private int sortingMode; + private int sortDirection; + private int currentFilter = -1; + private string currentCategory; + + private string baseAddress = "http://updates.rogodigital.com/AssetStore/extensions/"; + private string listFilename = "list-new.xml"; + + private List headerLinks = new List(); + private List categories = new List(); + + private List itemsAlpha = new List(); + private List itemsCat = new List(); + private List itemsUpdate = new List(); + private List[] lists; + + private bool gotListing = false; + private bool connectionFailed = false; + + private Vector2 headerScroll; + private Vector2 bodyScroll; + +#if UNITY_2018_3_OR_NEWER + private UnityWebRequest downloadConnection; +#else + private WWW downloadConnection; +#endif + + private GUIStyle headerLink; + private GUIStyle headerLinkActive; + + private GUIStyle productTitle; + private GUIStyle productDescription; + + private GUIStyle headerText; + private GUIStyle headerTextActive; + + //Images + Texture2D headerLogo; + Texture2D headerBG; + Texture2D headerButtonActive; + Texture2D defaultIcon; + Texture2D upArrow; + Texture2D downArrow; + + Dictionary productIcons = new Dictionary(); + + void OnEnable () + { + sortingMode = EditorPrefs.GetInt("RogoDigital_ExtensionsSortingMode", 0); + sortDirection = EditorPrefs.GetInt("RogoDigital_ExtensionsSortDirection", 0); + + headerLogo = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/RogoDigital_header_left.png"); + headerBG = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/RogoDigital_header_bg.png"); + headerButtonActive = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/RogoDigital_header_button.png"); + defaultIcon = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/default_icon.png"); + + if (EditorGUIUtility.isProSkin) + { + upArrow = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/Dark/up.png"); + downArrow = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/Dark/down.png"); + } + else + { + upArrow = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/Light/up.png"); + downArrow = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/Light/down.png"); + } + + ConnectToServer(); + } + + void ConnectToServer () + { +#if UNITY_2018_3_OR_NEWER + UnityWebRequest listConnection = UnityWebRequest.Get(baseAddress + listFilename); + listConnection.SendWebRequest(); +#else + WWW listConnection = new WWW(baseAddress + listFilename); +#endif + connectionsInProgress++; + + ContinuationManager.Add(() => listConnection.isDone, () => + { + connectionsInProgress--; + if (connectionsInProgress == 0) + { + RemoveNotification(); + } + + if (string.IsNullOrEmpty(listConnection.error)) + { +#if UNITY_2018_3_OR_NEWER + XmlReader reader = XmlReader.Create(new StringReader(listConnection.downloadHandler.text)); +#else + XmlReader reader = XmlReader.Create(new StringReader(listConnection.text)); +#endif + headerLinks = new List(); + + itemsAlpha = new List(); + itemsCat = new List(); + itemsUpdate = new List(); + NumberStyles style = NumberStyles.Number; + CultureInfo culture = CultureInfo.InvariantCulture; + + try + { + while (reader.Read()) + { + if (reader.Name == "product") + { + if (reader.HasAttributes) + { + string name = reader.GetAttribute("name").Replace(" ", "_"); + headerLinks.Add(name); + + //Get Icon +#if UNITY_2018_3_OR_NEWER + UnityWebRequest iconConnection = UnityWebRequestTexture.GetTexture(baseAddress + "icons/" + name + ".png"); + iconConnection.SendWebRequest(); +#else + WWW iconConnection = new WWW(baseAddress + "icons/" + name + ".png"); +#endif + connectionsInProgress++; + ContinuationManager.Add(() => iconConnection.isDone, () => + { + connectionsInProgress--; + if (connectionsInProgress == 0) + { + RemoveNotification(); + } + + if (string.IsNullOrEmpty(iconConnection.error)) + { +#if UNITY_2018_3_OR_NEWER + Texture2D icon = ((DownloadHandlerTexture)iconConnection.downloadHandler).texture; +#else + Texture2D icon = iconConnection.texture; +#endif + icon.hideFlags = HideFlags.DontSave; + + if (icon != null) + { + productIcons.Add(name, icon); + Repaint(); + } + + } + else + { + Debug.Log("Attempt to download icon reported error: " + iconConnection.error + " at " + iconConnection.url); + } + }); + } + } + else if (reader.Name == "item") + { + if (reader.HasAttributes) + { + //Get Icon +#if UNITY_2018_3_OR_NEWER + UnityWebRequest iconDownload = UnityWebRequestTexture.GetTexture(baseAddress + reader.GetAttribute("icon")); + iconDownload.SendWebRequest(); +#else + WWW iconDownload = new WWW(baseAddress + reader.GetAttribute("icon")); +#endif + connectionsInProgress++; + string itemName = reader.GetAttribute("name"); + string itemCategory = reader.GetAttribute("category"); + string[] itemProducts = reader.GetAttribute("products").Replace(" ", "_").Split(','); + float versionNumber = 0; + float.TryParse(reader.GetAttribute("version"), style, culture, out versionNumber); + DateTime lastUpdated = DateTime.Parse(reader.GetAttribute("lastUpdated"), culture); + float itemMinVersion = 0; + float.TryParse(reader.GetAttribute("minVersion"), style, culture, out itemMinVersion); + string itemURL = reader.GetAttribute("url"); + string itemDescription = reader.GetAttribute("description"); + + + if (!categories.Contains(itemCategory)) + { + categories.Add(itemCategory); + } + + ContinuationManager.Add(() => iconDownload.isDone || iconDownload.error != null, () => + { + connectionsInProgress--; + if (connectionsInProgress == 0) + { + RemoveNotification(); + } + + Texture2D icon = null; + if (string.IsNullOrEmpty(iconDownload.error)) + { +#if UNITY_2018_3_OR_NEWER + icon = ((DownloadHandlerTexture)iconDownload.downloadHandler).texture; +#else + icon = iconDownload.texture; +#endif + icon.hideFlags = HideFlags.DontSave; + } + else + { + Debug.LogWarning("Icon for " + itemName + " failed with error: " + iconDownload.error); + } + + ItemListing item = new ItemListing( + itemName, + itemCategory, + itemProducts, + itemMinVersion, + lastUpdated, + versionNumber, + itemURL, + itemDescription, + icon == null ? defaultIcon : icon + ); + + itemsAlpha.Add(item); + itemsAlpha.Sort(SortItemsAlphaNumeric); + itemsCat.Add(item); + itemsCat.Sort(SortItemsCategory); + itemsUpdate.Add(item); + itemsUpdate.Sort(SortItemsLastUpdated); + Repaint(); + }); + } + } + } + + lists = new List[] { itemsAlpha, itemsCat, itemsUpdate }; + gotListing = true; + + } + catch (Exception exception) + { + Debug.Log("Error loading extension list. Error: " + exception.StackTrace); + connectionFailed = true; + } + } + else + { + Debug.Log("Could not connect to extension server. Error: " + listConnection.error); + connectionFailed = true; + } + + Repaint(); + }); + } + + // Editor GUI + public static void ShowWindowGeneric (object startProduct) + { + ShowWindow((string)startProduct); + } + + [MenuItem("Window/Rogo Digital/Get Extensions", false, 0)] + public static void ShowWindow () + { + ShowWindow(""); + } + + public static void ShowWindow (string startProduct) + { + RDExtensionWindow window; + + window = GetWindow(); + Texture2D icon = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/RogoDigital_Icon.png"); + + window.titleContent = new GUIContent("Extensions", icon); + + ContinuationManager.Add(() => window.gotListing, () => + { + if (window.headerLinks.Contains(startProduct)) + { + window.currentFilter = window.headerLinks.IndexOf(startProduct); + } + }); + } + + public static void RequestInstall (string name) + { + var window = GetWindow(); + Texture2D icon = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/RogoDigital_Icon.png"); + + window.titleContent = new GUIContent("Extensions", icon); + + ContinuationManager.Add(() => window.connectionsInProgress == 0, () => + { + for (int i = 0; i < window.itemsAlpha.Count; i++) + { + if (window.itemsAlpha[i].name == name) + { + window.DownloadItem(window.itemsAlpha[i], true); + + } + } + }); + } + + void OnGUI () + { + //Initialize GUIStyles if needed + if (headerLink == null) + { + headerLink = new GUIStyle(); + headerLink.alignment = TextAnchor.MiddleCenter; + headerLink.fontStyle = FontStyle.Normal; + headerLink.fontSize = 16; + + headerLink.normal.textColor = new Color(0.2f, 0.2f, 0.2f); + headerLink.margin = new RectOffset(5, 5, 25, 25); + headerLink.padding = new RectOffset(0, 0, 6, 12); + + headerLinkActive = new GUIStyle(headerLink); + headerLinkActive.normal.background = headerButtonActive; + headerLinkActive.onNormal.background = headerButtonActive; + headerLinkActive.normal.textColor = Color.white; + } + if (headerText == null) + { + headerText = new GUIStyle((GUIStyle)"ControlLabel"); + headerText.alignment = TextAnchor.MiddleCenter; + headerText.fontStyle = FontStyle.Normal; + headerText.normal.textColor = new Color(0.2f, 0.2f, 0.2f); + headerText.margin = new RectOffset(5, 5, 30, 25); + + headerTextActive = new GUIStyle(headerText); + headerTextActive.normal.textColor = Color.white; + } + if (productTitle == null) + { + productTitle = new GUIStyle(); + productTitle.alignment = TextAnchor.MiddleLeft; + productTitle.fontStyle = FontStyle.Normal; + productTitle.fontSize = 16; + productTitle.margin = new RectOffset(0, 0, 15, 0); + if (EditorGUIUtility.isProSkin) + { + productTitle.normal.textColor = new Color(0.9f, 0.9f, 0.9f); + } + else + { + productTitle.normal.textColor = new Color(0.1f, 0.1f, 0.1f); + } + + productDescription = new GUIStyle(headerText); + productDescription.margin = new RectOffset(0, 0, 5, 0); + productDescription.alignment = TextAnchor.MiddleLeft; + if (EditorGUIUtility.isProSkin) + { + productDescription.normal.textColor = new Color(0.7f, 0.7f, 0.7f); + } + else + { + productDescription.normal.textColor = new Color(0.3f, 0.3f, 0.3f); + } + } + + EditorGUI.BeginDisabledGroup(connectionsInProgress > 0); + + GUILayout.BeginHorizontal(); + GUI.DrawTexture(new Rect(0, 0, this.position.width, headerBG.height), headerBG); + GUILayout.Box(headerLogo, GUIStyle.none); + + if (gotListing) + { + GUILayout.Space(-170); + GUILayout.Box("Products", headerText); + + headerScroll = GUILayout.BeginScrollView(headerScroll, false, false, GUILayout.MaxHeight(headerBG.height + 12)); + GUILayout.Space(0); + int linkCount = 0; + GUILayout.BeginHorizontal(); + foreach (string product in headerLinks) + { + Rect buttonRect = EditorGUILayout.BeginHorizontal(); + if (productIcons.ContainsKey(product)) + { + if (GUILayout.Button(new GUIContent(productIcons[product], product.Replace("_", " ")), (currentFilter == linkCount ? headerLinkActive : headerLink), GUILayout.MaxHeight(75), GUILayout.MaxWidth(70))) + { + if (currentFilter == linkCount) + { + currentFilter = -1; + } + else + { + currentFilter = linkCount; + } + } + } + else + { + if (GUILayout.Button(new GUIContent(product), (currentFilter == linkCount ? headerLinkActive : headerLink), GUILayout.MaxHeight(50))) + { + if (currentFilter == linkCount) + { + currentFilter = -1; + } + else + { + currentFilter = linkCount; + } + } + } + EditorGUILayout.EndHorizontal(); + EditorGUIUtility.AddCursorRect(buttonRect, MouseCursor.Link); + linkCount++; + GUILayout.Space(10); + } + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.EndScrollView(); + } + else + { + GUILayout.FlexibleSpace(); + if (connectionFailed) + { + GUILayout.Box("Connection Failed", headerText); + } + else + { + GUILayout.Box("Connecting...", headerText); + } + GUILayout.Space(30); + } + GUILayout.EndHorizontal(); + GUILayout.Space(-86); + GUILayout.BeginHorizontal(); + GUILayout.Space(220); + GUILayout.Box("Categories", headerText); + GUILayout.Space(30); + foreach (string category in categories) + { + Rect buttonRect = EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button(new GUIContent(category), category != currentCategory ? headerText : headerTextActive)) + { + if (currentCategory == category) + { + currentCategory = null; + } + else + { + currentCategory = category; + } + } + EditorGUILayout.EndHorizontal(); + EditorGUIUtility.AddCursorRect(buttonRect, MouseCursor.Link); + } + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.Space(-12); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(20); + GUILayout.Label("Sort by:"); + int oldSortingMode = sortingMode; + sortingMode = GUILayout.Toolbar(sortingMode, new string[] { "Name", "Category", "Last Updated" }, EditorStyles.miniButton); + if (oldSortingMode != sortingMode) + { + EditorPrefs.SetInt("RogoDigital_ExtensionsSortingMode", sortingMode); + } + GUILayout.Space(5); + if (GUILayout.Button(sortDirection == 0 ? upArrow : downArrow, EditorStyles.miniButton)) + { + sortDirection = 1 - sortDirection; + EditorPrefs.SetInt("RogoDigital_ExtensionsSortDirection", sortDirection); + itemsAlpha.Sort(SortItemsAlphaNumeric); + itemsCat.Sort(SortItemsCategory); + itemsUpdate.Sort(SortItemsLastUpdated); + } + GUILayout.FlexibleSpace(); + GUILayout.Space(20); + EditorGUILayout.EndHorizontal(); + GUILayout.Space(10); + + if (connectionFailed) + { + GUILayout.FlexibleSpace(); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Box("Could not connect to server.", headerText); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Retry")) + { + connectionFailed = false; + ConnectToServer(); + } + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + } + else if (!gotListing) + { + GUILayout.FlexibleSpace(); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Box("Connecting", headerLink); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + } + else + { + EditorGUI.BeginDisabledGroup(downloading); + bodyScroll = GUILayout.BeginScrollView(bodyScroll, false, false); + if (lists != null && itemsAlpha != null && itemsCat != null && itemsUpdate != null) + { + foreach (ItemListing listing in lists[sortingMode]) + { + bool show = false; + + if (currentFilter >= 0) + { + foreach (string product in listing.products) + { + if (headerLinks[currentFilter] == product) + { + show = true; + } + } + } + else + { + show = true; + } + + if (!string.IsNullOrEmpty(currentCategory)) + { + if (listing.category != currentCategory) + { + show = false; + } + } + + if (show) + { + GUILayout.BeginHorizontal(); + GUILayout.Space(20); + GUILayout.Box(listing.icon, GUIStyle.none, GUILayout.Width(90), GUILayout.Height(90)); + + GUILayout.Space(30); + GUILayout.BeginVertical(); + //Hack: Prevents random vertical offset. + GUILayout.Space(0); + GUILayout.Box(new GUIContent(listing.name + " | v" + listing.versionNumber), productTitle, GUILayout.Height(12)); + GUILayout.BeginHorizontal(); + foreach (string product in listing.products) + { + if (productIcons.ContainsKey(product)) + { + GUILayout.Box(new GUIContent(productIcons[product], product.Replace("_", " ")), productTitle, GUILayout.Height(32), GUILayout.Width(38)); + } + } + GUILayout.EndHorizontal(); + GUILayout.Box(listing.description, productDescription); + GUILayout.Box("Version " + listing.versionNumber + ". Updated: " + listing.lastUpdatedString + ". Works with LipSync version " + listing.minVersion.ToString() + " or higher.", productDescription); + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.BeginVertical(); + GUILayout.Space(30); + if (GUILayout.Button("Download", GUILayout.Height(30), GUILayout.MaxWidth(100))) + { + DownloadItem(listing); + } + GUILayout.EndVertical(); + GUILayout.Space(20); + GUILayout.EndHorizontal(); + GUILayout.Space(20); + } + } + } + + GUILayout.Space(40); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Box("More extensions coming soon. To request support for another asset, post in the forum thread, or send us an email.", productTitle); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.Space(10); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Forum Thread")) + { + Application.OpenURL("http://forum.unity3d.com/threads/alpha-lipsync-a-phoneme-based-lipsyncing-system-for-unity.309324/"); + } + if (GUILayout.Button("Email Support")) + { + Application.OpenURL("mailto:contact@rogodigital.com"); + } + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.Space(20); + GUILayout.EndScrollView(); + EditorGUI.EndDisabledGroup(); + EditorGUI.EndDisabledGroup(); + + if (downloading) + { +#if UNITY_2018_3_OR_NEWER + float progress = downloadConnection.downloadProgress; +#else + float progress = downloadConnection.progress; +#endif + EditorGUI.ProgressBar(new Rect(10, position.height - 30, position.width - 110, 20), progress, "Downloading " + currentExtension + " - " + Mathf.Round(progress * 100).ToString() + "%"); + if (GUI.Button(new Rect(position.width - 90, position.height - 30, 80, 20), "Cancel")) + { + downloading = false; + } + } + + if (connectionsInProgress > 0) + { + ShowNotification(new GUIContent("Please Wait - Connecting.")); + } + + } + + } + + private void DownloadItem (ItemListing listing, bool silentInstall = false) + { + downloading = true; +#if UNITY_2018_3_OR_NEWER + downloadConnection = UnityWebRequest.Get(baseAddress + listing.url); + downloadConnection.SendWebRequest(); +#else + downloadConnection = new WWW(baseAddress + listing.url); +#endif + currentExtension = listing.name; + + ContinuationManager.Add(() => downloadConnection.isDone, () => + { + if (downloading) + { + downloading = false; + if (!string.IsNullOrEmpty(downloadConnection.error)) + { + Debug.LogError(downloadConnection.error); + ShowNotification(new GUIContent(currentExtension + " - Download Failed")); + } + else if (downloadConnection.isDone) + { +#if UNITY_2018_3_OR_NEWER + File.WriteAllBytes(Application.dataPath + "/" + currentExtension + ".unitypackage", downloadConnection.downloadHandler.data); +#else + File.WriteAllBytes(Application.dataPath + "/" + currentExtension + ".unitypackage", downloadConnection.bytes); +#endif + if (!silentInstall) + ShowNotification(new GUIContent(currentExtension + " Downloaded")); + AssetDatabase.ImportPackage(Application.dataPath + "/" + currentExtension + ".unitypackage", !silentInstall); + File.Delete(Application.dataPath + "/" + currentExtension + ".unitypackage"); + if (silentInstall) + { + Close(); + } + } + else + { + ShowNotification(new GUIContent(currentExtension + " Download Cancelled")); + } + } + }); + } + + int SortItemsAlphaNumeric (ItemListing a, ItemListing b) + { + if (sortDirection == 0) + { + return AlphaSort(a.name, b.name); + } + else + { + return AlphaSort(b.name, a.name); + } + } + + int SortItemsCategory (ItemListing a, ItemListing b) + { + if (sortDirection == 0) + { + return AlphaSort(a.category, b.category); + } + else + { + return AlphaSort(b.category, a.category); + } + } + + int SortItemsLastUpdated (ItemListing a, ItemListing b) + { + if (sortDirection == 1) + { + return a.lastUpdatedRaw.CompareTo(b.lastUpdatedRaw); + } + else + { + return b.lastUpdatedRaw.CompareTo(a.lastUpdatedRaw); + } + } + + static int AlphaSort (string s1, string s2) + { + int len1 = s1.Length; + int len2 = s2.Length; + int marker1 = 0; + int marker2 = 0; + + // Walk through two the strings with two markers. + while (marker1 < len1 && marker2 < len2) + { + char ch1 = s1[marker1]; + char ch2 = s2[marker2]; + + // Some buffers we can build up characters in for each chunk. + char[] space1 = new char[len1]; + int loc1 = 0; + char[] space2 = new char[len2]; + int loc2 = 0; + + // Walk through all following characters that are digits or + // characters in BOTH strings starting at the appropriate marker. + // Collect char arrays. + do + { + space1[loc1++] = ch1; + marker1++; + + if (marker1 < len1) + { + ch1 = s1[marker1]; + } + else + { + break; + } + } while (char.IsDigit(ch1) == char.IsDigit(space1[0])); + + do + { + space2[loc2++] = ch2; + marker2++; + + if (marker2 < len2) + { + ch2 = s2[marker2]; + } + else + { + break; + } + } while (char.IsDigit(ch2) == char.IsDigit(space2[0])); + + // If we have collected numbers, compare them numerically. + // Otherwise, if we have strings, compare them alphabetically. + string str1 = new string(space1); + string str2 = new string(space2); + + int result; + + if (char.IsDigit(space1[0]) && char.IsDigit(space2[0])) + { + int thisNumericChunk = int.Parse(str1); + int thatNumericChunk = int.Parse(str2); + result = thisNumericChunk.CompareTo(thatNumericChunk); + } + else + { + result = str1.CompareTo(str2); + } + + if (result != 0) + { + return result; + } + } + return len1 - len2; + } + + void Update () + { + if (downloadConnection != null) + { + if (!downloadConnection.isDone) + { + Repaint(); + } + } + } + + public class ItemListing + { + public string name; + public string category; + public string[] products; + public float minVersion; + public DateTime lastUpdatedRaw; + public string lastUpdatedString; + public float versionNumber; + public string url; + public string description; + public Texture2D icon; + + public ItemListing (string name, string category, string[] products, float minVersion, DateTime lastUpdated, float versionNumber, string url, string description, Texture2D icon) + { + this.name = name; + this.category = category; + this.products = products; + this.minVersion = minVersion; + lastUpdatedRaw = lastUpdated; + lastUpdatedString = lastUpdated.ToLongDateString(); + this.versionNumber = versionNumber; + this.url = url; + this.description = description; + this.icon = icon; + } + } +} diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDExtensionWindow.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDExtensionWindow.cs.meta new file mode 100644 index 0000000..baf4f63 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/RDExtensionWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b47420d81f2287140a6db38df932ae5c +timeCreated: 1450568615 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/WizardWindow.cs b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/WizardWindow.cs new file mode 100644 index 0000000..9d95310 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/WizardWindow.cs @@ -0,0 +1,154 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.AnimatedValues; + +namespace RogoDigital +{ + public class WizardWindow : EditorWindow + { + + public int currentStep + { + get + { + return _currentStep; + } + + set + { + _currentStep = value; + progressBar.target = (float)_currentStep / (float)_totalSteps; + } + } + + public int totalSteps + { + get + { + return _totalSteps; + } + set + { + _totalSteps = value; + progressBar.target = (float)_currentStep / (float)_totalSteps; + } + } + + private int _currentStep = 1; + private int _totalSteps = 1; + + public bool canContinue = true; + public string topMessage = ""; + + private AnimFloat progressBar; + private Texture2D white; + + public void OnEnable () + { + progressBar = new AnimFloat(0, Repaint); + progressBar.speed = 2; + white = (Texture2D)EditorGUIUtility.Load("Rogo Digital/Shared/white.png"); + } + + void OnGUI () + { + Rect topbar = EditorGUILayout.BeginHorizontal(); + GUI.Box(topbar, "", EditorStyles.toolbar); + GUILayout.FlexibleSpace(); + GUILayout.Box(topMessage + " Step " + currentStep.ToString() + "/" + totalSteps.ToString(), EditorStyles.label); + GUILayout.FlexibleSpace(); + GUILayout.Box("", EditorStyles.toolbar); + EditorGUILayout.EndHorizontal(); + GUI.color = Color.grey; + GUI.DrawTexture(new Rect(0, topbar.height, topbar.width, 3), white); + GUI.color = new Color(1f, 0.77f, 0f); + GUI.DrawTexture(new Rect(0, topbar.height, progressBar.value * topbar.width, 3), white); + GUI.color = Color.white; + GUILayout.Space(20); + + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(20); + EditorGUILayout.BeginVertical(); + + OnWizardGUI(); + + EditorGUILayout.EndVertical(); + GUILayout.Space(20); + EditorGUILayout.EndHorizontal(); + + GUILayout.FlexibleSpace(); + Rect bottomBar = EditorGUILayout.BeginHorizontal(GUILayout.Height(50)); + EditorGUILayout.BeginVertical(); + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUI.Box(bottomBar, "", EditorStyles.helpBox); + GUILayout.FlexibleSpace(); + GUILayout.Space(20); + if (GUILayout.Button((currentStep == 1) ? "Cancel" : "Back", GUILayout.Height(30), GUILayout.MaxWidth(200))) + { + Back(); + } + GUILayout.Space(10); + GUILayout.FlexibleSpace(); + GUILayout.Space(10); + if (canContinue) + { + if (GUILayout.Button((currentStep == totalSteps) ? "Finish" : "Continue", GUILayout.Height(30), GUILayout.MaxWidth(200))) + { + Continue(); + } + } + else + { + GUI.color = Color.grey; + GUILayout.Box("Continue", (GUIStyle)"button", GUILayout.Height(30), GUILayout.MaxWidth(200)); + GUI.color = Color.white; + } + GUILayout.Space(20); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + } + + protected void Continue () + { + OnContinuePressed(); + GUI.FocusControl(""); + if (currentStep < totalSteps) + { + currentStep++; + } + else + { + Close(); + } + } + + protected void Back () + { + OnBackPressed(); + if (currentStep > 1) + { + currentStep--; + } + else + { + Close(); + } + } + + public virtual void OnContinuePressed () + { + } + + public virtual void OnBackPressed () + { + } + + public virtual void OnWizardGUI () + { + } + } +} \ No newline at end of file diff --git a/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/WizardWindow.cs.meta b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/WizardWindow.cs.meta new file mode 100644 index 0000000..1caa2a4 --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Assets/Rogo Digital/Shared/Editor/WizardWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 85469fd8d836ac64498f3144b306c721 +timeCreated: 1454926939 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LipSync-Pro-main/Project/Packages/manifest.json b/Assets/LipSync-Pro-main/Project/Packages/manifest.json new file mode 100644 index 0000000..f59102b --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Packages/manifest.json @@ -0,0 +1,37 @@ +{ + "dependencies": { + "com.unity.package-manager-ui": "2.0.13", + "com.unity.ugui": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/Assets/LipSync-Pro-main/Project/Packages/packages-lock.json b/Assets/LipSync-Pro-main/Project/Packages/packages-lock.json new file mode 100644 index 0000000..22be0bc --- /dev/null +++ b/Assets/LipSync-Pro-main/Project/Packages/packages-lock.json @@ -0,0 +1,393 @@ +{ + "dependencies": { + "com.unity.2d.sprite": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.2d.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.ads": { + "version": "3.4.9", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.analytics": { + "version": "3.3.5", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.collab-proxy": { + "version": "1.3.9", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ext.nunit": { + "version": "1.0.0", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ide.rider": { + "version": "1.2.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.2", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ide.vscode": { + "version": "1.2.1", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.multiplayer-hlapi": { + "version": "1.0.6", + "depth": 0, + "source": "registry", + "dependencies": { + "nuget.mono-cecil": "0.1.6-preview" + }, + "url": "https://packages.unity.com" + }, + "com.unity.purchasing": { + "version": "2.1.0", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.test-framework": { + "version": "1.1.16", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.textmeshpro": { + "version": "3.0.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.timeline": { + "version": "1.2.6", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.xr.legacyinputhelpers": { + "version": "2.1.4", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "nuget.mono-cecil": { + "version": "0.1.6-preview", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.uielementsnative": "1.0.0" + } + }, + "com.unity.modules.uielementsnative": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/Assets/LipSync-Pro-main/README.md b/Assets/LipSync-Pro-main/README.md new file mode 100644 index 0000000..3dc7c62 --- /dev/null +++ b/Assets/LipSync-Pro-main/README.md @@ -0,0 +1,8 @@ +# LipSync Pro +Official repo for Rogo Digital's LipSync Pro for Unity. + +Provides an editor workflow for authoring lipsync animation files and a runtime system for playing them back. Also included is Eye Controller, for adding blinking and look-at functionality, and several extensions providing additional features and compatibility with 3rd party assets. + +Documentation is available here: https://rogodigital.gitbook.io/lipsync-pro/ + +Unless stated otherwise, all code in this repo is licensed under the Mozilla Public License v2.0. Some 3rd party code is included, with its original license attached. diff --git a/Assets/Photon Unity Networking/Editor/PhotonNetwork/AccountService.cs b/Assets/Photon Unity Networking/Editor/PhotonNetwork/AccountService.cs index eae0366..77c8813 100644 --- a/Assets/Photon Unity Networking/Editor/PhotonNetwork/AccountService.cs +++ b/Assets/Photon Unity Networking/Editor/PhotonNetwork/AccountService.cs @@ -9,7 +9,6 @@ // developer@exitgames.com // ---------------------------------------------------------------------------- -#if UNITY_EDITOR //#define PHOTON_VOICE using System.Net.Security; @@ -231,4 +230,3 @@ public class AccountService } } } -#endif diff --git a/Assets/Photon Unity Networking/Editor/PhotonNetwork/PhotonEditor.cs b/Assets/Photon Unity Networking/Editor/PhotonNetwork/PhotonEditor.cs index cc21fbd..91ecae3 100644 --- a/Assets/Photon Unity Networking/Editor/PhotonNetwork/PhotonEditor.cs +++ b/Assets/Photon Unity Networking/Editor/PhotonNetwork/PhotonEditor.cs @@ -482,7 +482,8 @@ public class PhotonEditor : EditorWindow GUILayout.Space(15); } #if !(UNITY_5_0 || UNITY_5) - else if (!InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.Android) || !InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.iPhone)) + else if (!InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.Android) || + !InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.iOS)) { GUILayout.Label(CurrentLang.MobileExportNoteLabel); GUILayout.Space(15); diff --git a/Assets/Photon Unity Networking/Editor/PhotonNetwork/Views/PhotonAnimatorViewEditor.cs b/Assets/Photon Unity Networking/Editor/PhotonNetwork/Views/PhotonAnimatorViewEditor.cs index 3deca52..6a52648 100644 --- a/Assets/Photon Unity Networking/Editor/PhotonNetwork/Views/PhotonAnimatorViewEditor.cs +++ b/Assets/Photon Unity Networking/Editor/PhotonNetwork/Views/PhotonAnimatorViewEditor.cs @@ -17,6 +17,7 @@ using UnityEditor; using UnityEngine; using System.Collections.Generic; +using UnityEditor.Animations; #if UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 using UnityEditorInternal; @@ -31,9 +32,9 @@ public class PhotonAnimatorViewEditor : Editor private Animator m_Animator; private PhotonAnimatorView m_Target; -#if UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5 || UNITY_5_0 +//#if UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5 || UNITY_5_0 private AnimatorController m_Controller; -#endif +//#endif private const string TRIGGER_HELP_URL = "https://doc.photonengine.com/en/pun/current/reference/animatorviewtriggerhelp"; @@ -50,7 +51,7 @@ public class PhotonAnimatorViewEditor : Editor } DrawWeightInspector(); - + if (GetLayerCount() == 0) { GUILayout.BeginVertical(GUI.skin.box); @@ -73,14 +74,14 @@ public class PhotonAnimatorViewEditor : Editor //GUILayout.Label( "m_SynchronizeParameters " + serializedObject.FindProperty( "m_SynchronizeParameters" ).arraySize ); } - + private int GetLayerCount() { - #if UNITY_5 || UNITY_5_0 + //#if UNITY_5 || UNITY_5_0 return (this.m_Controller == null) ? 0 : this.m_Controller.layers.Length; - #else - return (this.m_Controller == null) ? 0 : this.m_Controller.layerCount; - #endif + //#else + //return (this.m_Controller == null) ? 0 : this.m_Controller.layerCount; + //#endif } @@ -228,7 +229,7 @@ public class PhotonAnimatorViewEditor : Editor #endif } } - + private void DrawParameterInspector() { diff --git a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/LoadbalancingPeer.cs b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/LoadbalancingPeer.cs index 3ad25a7..83a14f4 100644 --- a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/LoadbalancingPeer.cs +++ b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/LoadbalancingPeer.cs @@ -13,6 +13,8 @@ using System; using System.Collections; using System.Collections.Generic; using ExitGames.Client.Photon; +using UnityEngine; +using Hashtable = ExitGames.Client.Photon.Hashtable; #if UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5 || UNITY_5_0 || UNITY_5_1 || UNITY_6 using UnityEngine; diff --git a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonClasses.cs b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonClasses.cs index f20d7d6..8bd3f13 100644 --- a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonClasses.cs +++ b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonClasses.cs @@ -1276,23 +1276,6 @@ namespace UnityEditor.SceneManagement } #endif -namespace UnityEngine.SceneManagement -{ - /// Minimal implementation of the SceneManager for older Unity, up to v5.2. - public class SceneManager - { - public static void LoadScene(string name) - { - Application.LoadLevel(name); - } - - public static void LoadScene(int buildIndex) - { - Application.LoadLevel(buildIndex); - } - } -} - #endif diff --git a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonHandler.cs b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonHandler.cs index 9093edd..af56eb0 100644 --- a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonHandler.cs +++ b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonHandler.cs @@ -13,6 +13,7 @@ using System.Collections; using System.Diagnostics; using ExitGames.Client.Photon; using UnityEngine; +using UnityEngine.Profiling; using Debug = UnityEngine.Debug; using Hashtable = ExitGames.Client.Photon.Hashtable; using SupportClassPun = ExitGames.Client.Photon.SupportClass; diff --git a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs index 3a47de4..dd67976 100644 --- a/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs +++ b/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs @@ -9,7 +9,9 @@ using System.Diagnostics; using UnityEngine; using System; using System.Collections.Generic; +using System.IO; using ExitGames.Client.Photon; +using UnityEditor; using UnityEngine.SceneManagement; using Debug = UnityEngine.Debug; using Hashtable = ExitGames.Client.Photon.Hashtable; @@ -3149,7 +3151,6 @@ public static class PhotonNetwork } -#if UNITY_EDITOR [Conditional("UNITY_EDITOR")] public static void CreateSettings() { @@ -3215,6 +3216,5 @@ public static class PhotonNetwork } } } -#endif } diff --git a/Assets/PostProcessing/Editor Resources.meta b/Assets/PostProcessing/Editor Resources.meta new file mode 100644 index 0000000..7b3c594 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 83715878d3a8db441aa5636641db69a3 +folderAsset: yes +timeCreated: 1476176392 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors.meta b/Assets/PostProcessing/Editor Resources/Monitors.meta new file mode 100644 index 0000000..fcf5702 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e7358848dd8737c459f4636f1c075835 +folderAsset: yes +timeCreated: 1460361782 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors/HistogramCompute.compute b/Assets/PostProcessing/Editor Resources/Monitors/HistogramCompute.compute new file mode 100644 index 0000000..da7507b --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/HistogramCompute.compute @@ -0,0 +1,91 @@ +#include "UnityCG.cginc" + +RWStructuredBuffer _Histogram; +Texture2D _Source; + +CBUFFER_START (Params) + uint _IsLinear; + float4 _Res; + uint4 _Channels; +CBUFFER_END + +groupshared uint4 gs_histogram[256]; + +#define GROUP_SIZE 16 + +#pragma kernel KHistogramGather +[numthreads(GROUP_SIZE, GROUP_SIZE,1)] +void KHistogramGather(uint2 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadId : SV_GroupThreadID) +{ + const uint localThreadId = groupThreadId.y * GROUP_SIZE + groupThreadId.x; + + if (localThreadId < 256) + gs_histogram[localThreadId] = uint4(0, 0, 0, 0); + + GroupMemoryBarrierWithGroupSync(); + + if (dispatchThreadId.x < (uint)_Res.x && dispatchThreadId.y < (uint)_Res.y) + { + // We want a gamma histogram (like Photoshop & all) + float3 color = saturate(_Source[dispatchThreadId].xyz); + if (_IsLinear > 0) + color = LinearToGammaSpace(color); + + // Convert color & luminance to histogram bin + uint3 idx_c = (uint3)(round(color * 255.0)); + uint idx_l = (uint)(round(dot(color.rgb, float3(0.2125, 0.7154, 0.0721)) * 255.0)); + + // Fill the group shared histogram + if (_Channels.x > 0u) InterlockedAdd(gs_histogram[idx_c.x].x, 1); // Red + if (_Channels.y > 0u) InterlockedAdd(gs_histogram[idx_c.y].y, 1); // Green + if (_Channels.z > 0u) InterlockedAdd(gs_histogram[idx_c.z].z, 1); // Blue + if (_Channels.w > 0u) InterlockedAdd(gs_histogram[idx_l].w, 1); // Luminance + } + + GroupMemoryBarrierWithGroupSync(); + + // Merge + if (localThreadId < 256) + { + uint4 h = gs_histogram[localThreadId]; + if (_Channels.x > 0u && h.x > 0) InterlockedAdd(_Histogram[localThreadId].x, h.x); // Red + if (_Channels.y > 0u && h.y > 0) InterlockedAdd(_Histogram[localThreadId].y, h.y); // Green + if (_Channels.z > 0u && h.z > 0) InterlockedAdd(_Histogram[localThreadId].z, h.z); // Blue + if (_Channels.w > 0u && h.w > 0) InterlockedAdd(_Histogram[localThreadId].w, h.w); // Luminance + } +} + +// Scaling pass +groupshared uint4 gs_pyramid[256]; + +#pragma kernel KHistogramScale +[numthreads(16,16,1)] +void KHistogramScale(uint2 groupThreadId : SV_GroupThreadID) +{ + const uint localThreadId = groupThreadId.y * 16 + groupThreadId.x; + gs_pyramid[localThreadId] = _Histogram[localThreadId]; + + GroupMemoryBarrierWithGroupSync(); + + // Parallel reduction to find the max value + UNITY_UNROLL + for(uint i = 256 >> 1; i > 0; i >>= 1) + { + if(localThreadId < i) + gs_pyramid[localThreadId] = max(gs_pyramid[localThreadId], gs_pyramid[localThreadId + i]); + + GroupMemoryBarrierWithGroupSync(); + } + + // Actual scaling + float4 factor = _Res.y / (float4)gs_pyramid[0]; + _Histogram[localThreadId] = (uint4)round(_Histogram[localThreadId] * factor); +} + +#pragma kernel KHistogramClear +[numthreads(GROUP_SIZE, GROUP_SIZE, 1)] +void KHistogramClear(uint2 dispatchThreadId : SV_DispatchThreadID) +{ + if (dispatchThreadId.x < (uint)_Res.x && dispatchThreadId.y < (uint)_Res.y) + _Histogram[dispatchThreadId.y * _Res.x + dispatchThreadId.x] = uint4(0u, 0u, 0u, 0u); +} diff --git a/Assets/PostProcessing/Editor Resources/Monitors/HistogramCompute.compute.meta b/Assets/PostProcessing/Editor Resources/Monitors/HistogramCompute.compute.meta new file mode 100644 index 0000000..7c40539 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/HistogramCompute.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 51b7e4b4448c98f4a849081110fd6212 +timeCreated: 1459956391 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 4 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors/HistogramRender.shader b/Assets/PostProcessing/Editor Resources/Monitors/HistogramRender.shader new file mode 100644 index 0000000..c69cf75 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/HistogramRender.shader @@ -0,0 +1,141 @@ +Shader "Hidden/Post FX/Monitors/Histogram Render" +{ + SubShader + { + ZTest Always Cull Off ZWrite Off + Fog { Mode off } + + CGINCLUDE + + #pragma fragmentoption ARB_precision_hint_fastest + #pragma target 5.0 + #include "UnityCG.cginc" + + StructuredBuffer _Histogram; + float2 _Size; + uint _Channel; + float4 _ColorR; + float4 _ColorG; + float4 _ColorB; + float4 _ColorL; + + float4 FragSingleChannel(v2f_img i) : SV_Target + { + const float4 COLORS[4] = { _ColorR, _ColorG, _ColorB, _ColorL }; + + float remapI = i.uv.x * 255.0; + uint index = floor(remapI); + float delta = frac(remapI); + float v1 = _Histogram[index][_Channel]; + float v2 = _Histogram[min(index + 1, 255)][_Channel]; + float h = v1 * (1.0 - delta) + v2 * delta; + uint y = (uint)round(i.uv.y * _Size.y); + + float4 color = float4(0.1, 0.1, 0.1, 1.0); + float fill = step(y, h); + color = lerp(color, COLORS[_Channel], fill); + return color; + } + + float4 FragRgbMerged(v2f_img i) : SV_Target + { + const float4 COLORS[3] = { _ColorR, _ColorG, _ColorB }; + + float4 targetColor = float4(0.1, 0.1, 0.1, 1.0); + float4 emptyColor = float4(0.0, 0.0, 0.0, 1.0); + + float remapI = i.uv.x * 255.0; + uint index = floor(remapI); + float delta = frac(remapI); + + for (int j = 0; j < 3; j++) + { + float v1 = _Histogram[index][j]; + float v2 = _Histogram[min(index + 1, 255)][j]; + float h = v1 * (1.0 - delta) + v2 * delta; + uint y = (uint)round(i.uv.y * _Size.y); + float fill = step(y, h); + float4 color = lerp(emptyColor, COLORS[j], fill); + targetColor += color; + } + + return saturate(targetColor); + } + + float4 FragRgbSplitted(v2f_img i) : SV_Target + { + const float4 COLORS[3] = {_ColorR, _ColorG, _ColorB}; + + const float limitB = round(_Size.y / 3.0); + const float limitG = limitB * 2; + + float4 color = float4(0.1, 0.1, 0.1, 1.0); + uint channel; + float offset; + + if (i.pos.y < limitB) + { + channel = 2; + offset = 0.0; + } + else if (i.pos.y < limitG) + { + channel = 1; + offset = limitB; + } + else + { + channel = 0; + offset = limitG; + } + + float remapI = i.uv.x * 255.0; + uint index = floor(remapI); + float delta = frac(remapI); + float v1 = offset + _Histogram[index][channel] / 3.0; + float v2 = offset + _Histogram[min(index + 1, 255)][channel] / 3.0; + float h = v1 * (1.0 - delta) + v2 * delta; + uint y = (uint)round(i.uv.y * _Size.y); + + float fill = step(y, h); + color = lerp(color, COLORS[channel], fill); + return color; + } + + ENDCG + + // (0) Channel + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragSingleChannel + + ENDCG + } + + // (1) RGB merged + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragRgbMerged + + ENDCG + } + + // (2) RGB splitted + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragRgbSplitted + + ENDCG + } + } + FallBack off +} diff --git a/Assets/PostProcessing/Editor Resources/Monitors/HistogramRender.shader.meta b/Assets/PostProcessing/Editor Resources/Monitors/HistogramRender.shader.meta new file mode 100644 index 0000000..93b35f3 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/HistogramRender.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 965efa32cf2345647a1c987546e08f86 +timeCreated: 1459956391 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors/ParadeRender.shader b/Assets/PostProcessing/Editor Resources/Monitors/ParadeRender.shader new file mode 100644 index 0000000..3ff1ca6 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/ParadeRender.shader @@ -0,0 +1,76 @@ +Shader "Hidden/Post FX/Monitors/Parade Render" +{ + SubShader + { + ZTest Always Cull Off ZWrite Off + Fog { Mode off } + + CGINCLUDE + + #pragma fragmentoption ARB_precision_hint_fastest + #pragma target 5.0 + #include "UnityCG.cginc" + + StructuredBuffer _Waveform; + float4 _Size; + float _Exposure; + + float3 Tonemap(float3 x, float exposure) + { + const float a = 6.2; + const float b = 0.5; + const float c = 1.7; + const float d = 0.06; + x *= exposure; + x = max((0.0).xxx, x - (0.004).xxx); + x = (x * (a * x + b)) / (x * (a * x + c) + d); + return x * x; + } + + float4 FragParade(v2f_img i) : SV_Target + { + const float3 red = float3(1.8, 0.03, 0.02); + const float3 green = float3(0.02, 1.3, 0.05); + const float3 blue = float3(0.0, 0.45, 1.75); + float3 color = float3(0.0, 0.0, 0.0); + + const uint limitR = _Size.x / 3; + const uint limitG = limitR * 2; + + if (i.pos.x < (float)limitR) + { + uint2 uvI = i.pos.xy; + color = _Waveform[uvI.y + uvI.x * _Size.y].r * red; + } + else if (i.pos.x < (float)limitG) + { + uint2 uvI = uint2(i.pos.x - limitR, i.pos.y); + color = _Waveform[uvI.y + uvI.x * _Size.y].g * green; + } + else + { + uint2 uvI = uint2(i.pos.x - limitG, i.pos.y); + color = _Waveform[uvI.y + uvI.x * _Size.y].b * blue; + } + + color = Tonemap(color, _Exposure); + color += (0.1).xxx; + + return float4(saturate(color), 1.0); + } + + ENDCG + + // (0) + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragParade + + ENDCG + } + } + FallBack off +} diff --git a/Assets/PostProcessing/Editor Resources/Monitors/ParadeRender.shader.meta b/Assets/PostProcessing/Editor Resources/Monitors/ParadeRender.shader.meta new file mode 100644 index 0000000..a9e8fea --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/ParadeRender.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5ae1bfc1dd20ac04e8b74aa0f2f12eea +timeCreated: 1459956391 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeCompute.compute b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeCompute.compute new file mode 100644 index 0000000..c5c61d0 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeCompute.compute @@ -0,0 +1,49 @@ +#include "UnityCG.cginc" + +RWStructuredBuffer _Vectorscope; +Texture2D _Source; + +CBUFFER_START (Params) + uint _IsLinear; + float4 _Res; +CBUFFER_END + +#define GROUP_SIZE 32 + +float3 RgbToYUV(float3 c) +{ + float Y = 0.299 * c.r + 0.587 * c.g + 0.114 * c.b; + float U = -0.169 * c.r - 0.331 * c.g + 0.500 * c.b; + float V = 0.500 * c.r - 0.419 * c.g - 0.081 * c.b; + return float3(Y, U, V); +} + +#pragma kernel KVectorscope +[numthreads(GROUP_SIZE,GROUP_SIZE,1)] +void KVectorscope(uint2 dispatchThreadId : SV_DispatchThreadID) +{ + if (dispatchThreadId.x < (uint)_Res.x && dispatchThreadId.y < (uint)_Res.y) + { + float3 color = saturate(_Source[dispatchThreadId].xyz); + if (_IsLinear > 0) + color = LinearToGammaSpace(color); + + float3 yuv = RgbToYUV(color); + + if (length(yuv.yz) > 0.49) + yuv.yz = normalize(yuv.yz) * 0.49; + + yuv.yz += (0.5).xx; + uint u = (uint)floor(yuv.y * _Res.x); + uint v = (uint)floor(yuv.z * _Res.y); + InterlockedAdd(_Vectorscope[v * _Res.x + u], 1); + } +} + +#pragma kernel KVectorscopeClear +[numthreads(GROUP_SIZE,GROUP_SIZE,1)] +void KVectorscopeClear(uint2 dispatchThreadId : SV_DispatchThreadID) +{ + if (dispatchThreadId.x < (uint)_Res.x && dispatchThreadId.y < (uint)_Res.y) + _Vectorscope[dispatchThreadId.y * _Res.x + dispatchThreadId.x] = 0u; +} diff --git a/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeCompute.compute.meta b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeCompute.compute.meta new file mode 100644 index 0000000..47187a4 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeCompute.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 45de9ff58691e934c9810dc23de2ba50 +timeCreated: 1459956391 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 4 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeRender.shader b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeRender.shader new file mode 100644 index 0000000..62a7a03 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeRender.shader @@ -0,0 +1,101 @@ +Shader "Hidden/Post FX/Monitors/Vectorscope Render" +{ + SubShader + { + ZTest Always Cull Off ZWrite Off + Fog { Mode off } + + CGINCLUDE + + #pragma fragmentoption ARB_precision_hint_fastest + #pragma target 5.0 + #include "UnityCG.cginc" + + StructuredBuffer _Vectorscope; + float2 _Size; + float _Exposure; + + float Tonemap(float x, float exposure) + { + const float a = 6.2; + const float b = 0.5; + const float c = 1.7; + const float d = 0.06; + x *= exposure; + x = max(0.0, x - 0.004); + x = (x * (a * x + b)) / (x * (a * x + c) + d); + return x * x; + } + + float3 YuvToRgb(float3 c) + { + float R = c.x + 0.000 * c.y + 1.403 * c.z; + float G = c.x - 0.344 * c.y - 0.714 * c.z; + float B = c.x - 1.773 * c.y + 0.000 * c.z; + return float3(R, G, B); + } + + float4 FragBackground(v2f_img i) : SV_Target + { + i.uv.x = 1.0 - i.uv.x; + float2 uv = i.uv - (0.5).xx; + float3 c = YuvToRgb(float3(0.5, uv.x, uv.y)); + + float dist = sqrt(dot(uv, uv)); + float delta = fwidth(dist); + float alphaOut = 1.0 - smoothstep(0.5 - delta, 0.5 + delta, dist); + float alphaIn = smoothstep(0.495 - delta, 0.495 + delta, dist); + + uint2 uvI = i.pos.xy; + uint v = _Vectorscope[uvI.x + uvI.y * _Size.x]; + float vt = saturate(Tonemap(v, _Exposure)); + + float4 color = float4(lerp(c, (0.0).xxx, vt), alphaOut); + color.rgb += alphaIn; + return color; + } + + float4 FragNoBackground(v2f_img i) : SV_Target + { + i.uv.x = 1.0 - i.uv.x; + float2 uv = i.uv - (0.5).xx; + + float dist = sqrt(dot(uv, uv)); + float delta = fwidth(dist); + float alphaOut = 1.0 - smoothstep(0.5 - delta, 0.5 + delta, dist); + float alphaIn = smoothstep(0.495 - delta, 0.495 + delta, dist); + + uint2 uvI = i.pos.xy; + uint v = _Vectorscope[uvI.x + uvI.y * _Size.x]; + float vt = saturate(Tonemap(v, _Exposure)); + + float4 color = float4((1.0).xxx, vt + alphaIn * alphaOut); + return color; + } + + ENDCG + + // (0) + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragBackground + + ENDCG + } + + // (1) + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragNoBackground + + ENDCG + } + } + FallBack off +} diff --git a/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeRender.shader.meta b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeRender.shader.meta new file mode 100644 index 0000000..7402232 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/VectorscopeRender.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1c4298cd35ef7834e892898e49d61ecd +timeCreated: 1461756159 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors/WaveformCompute.compute b/Assets/PostProcessing/Editor Resources/Monitors/WaveformCompute.compute new file mode 100644 index 0000000..cc79b15 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/WaveformCompute.compute @@ -0,0 +1,42 @@ +#include "UnityCG.cginc" + +RWStructuredBuffer _Waveform; +Texture2D _Source; + +CBUFFER_START (Params) + uint _IsLinear; + uint4 _Channels; +CBUFFER_END + +#define COLUMNS 384 + +#pragma kernel KWaveform +[numthreads(1,COLUMNS,1)] +void KWaveform(uint2 dispatchThreadId : SV_DispatchThreadID) +{ + // We want a gamma corrected colors + float3 color = _Source[dispatchThreadId].rgb; + if (_IsLinear > 0u) + color = LinearToGammaSpace(color); + + color = saturate(color); + + // Convert color & luminance to histogram bins + const float kColumnsMinusOne = COLUMNS - 1.0; + uint3 idx_c = (uint3)(round(color * kColumnsMinusOne)); + uint idx_l = (uint)(round(dot(color.rgb, float3(0.2126, 0.7152, 0.0722)) * kColumnsMinusOne)); + + // A lot of atomic operations will be skipped so there's no need to over-think this one. + uint j = dispatchThreadId.x * COLUMNS; + if (_Channels.x > 0u && idx_c.x > 0u) InterlockedAdd(_Waveform[j + idx_c.x].x, 1u); // Red + if (_Channels.y > 0u && idx_c.y > 0u) InterlockedAdd(_Waveform[j + idx_c.y].y, 1u); // Green + if (_Channels.z > 0u && idx_c.z > 0u) InterlockedAdd(_Waveform[j + idx_c.z].z, 1u); // Blue + if (_Channels.w > 0u) InterlockedAdd(_Waveform[j + idx_l].w, 1u); // Luminance +} + +#pragma kernel KWaveformClear +[numthreads(1, COLUMNS, 1)] +void KWaveformClear(uint2 dispatchThreadId : SV_DispatchThreadID) +{ + _Waveform[dispatchThreadId.x * COLUMNS + dispatchThreadId.y] = uint4(0u, 0u, 0u, 0u); +} diff --git a/Assets/PostProcessing/Editor Resources/Monitors/WaveformCompute.compute.meta b/Assets/PostProcessing/Editor Resources/Monitors/WaveformCompute.compute.meta new file mode 100644 index 0000000..ec5a6ff --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/WaveformCompute.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9d9b886f7a8fe7b4baf56624c42e3420 +timeCreated: 1459956392 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 4 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/Monitors/WaveformRender.shader b/Assets/PostProcessing/Editor Resources/Monitors/WaveformRender.shader new file mode 100644 index 0000000..39cffd7 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/WaveformRender.shader @@ -0,0 +1,65 @@ +Shader "Hidden/Post FX/Monitors/Waveform Render" +{ + SubShader + { + ZTest Always Cull Off ZWrite Off + Fog { Mode off } + + CGINCLUDE + + #pragma fragmentoption ARB_precision_hint_fastest + #pragma target 5.0 + #include "UnityCG.cginc" + + StructuredBuffer _Waveform; + float2 _Size; + float4 _Channels; + float _Exposure; + + float3 Tonemap(float3 x, float exposure) + { + const float a = 6.2; + const float b = 0.5; + const float c = 1.7; + const float d = 0.06; + x *= exposure; + x = max((0.0).xxx, x - (0.004).xxx); + x = (x * (a * x + b)) / (x * (a * x + c) + d); + return x * x; + } + + float4 FragWaveform(v2f_img i) : SV_Target + { + const float3 red = float3(1.4, 0.03, 0.02); + const float3 green = float3(0.02, 1.1, 0.05); + const float3 blue = float3(0.0, 0.25, 1.5); + float3 color = float3(0.0, 0.0, 0.0); + + uint2 uvI = i.pos.xy; + float4 w = _Waveform[uvI.y + uvI.x * _Size.y]; // Waveform data is stored in columns instead of rows + + color += red * w.r * _Channels.r; + color += green * w.g * _Channels.g; + color += blue * w.b * _Channels.b; + color += w.aaa * _Channels.a * 1.5; + color = Tonemap(color, _Exposure); + color += (0.1).xxx; + + return float4(saturate(color), 1.0); + } + + ENDCG + + // (0) + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragWaveform + + ENDCG + } + } + FallBack off +} diff --git a/Assets/PostProcessing/Editor Resources/Monitors/WaveformRender.shader.meta b/Assets/PostProcessing/Editor Resources/Monitors/WaveformRender.shader.meta new file mode 100644 index 0000000..ec1bf1b --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/Monitors/WaveformRender.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8b3e43c50424ab2428a9c172843bc66d +timeCreated: 1459956391 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/UI.meta b/Assets/PostProcessing/Editor Resources/UI.meta new file mode 100644 index 0000000..bf78c40 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: df37d60cc69b7b04d9705a74938179e7 +folderAsset: yes +timeCreated: 1460627771 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/UI/CurveBackground.shader b/Assets/PostProcessing/Editor Resources/UI/CurveBackground.shader new file mode 100644 index 0000000..b4f20b2 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/UI/CurveBackground.shader @@ -0,0 +1,63 @@ +Shader "Hidden/Post FX/UI/Curve Background" +{ + CGINCLUDE + + #pragma target 3.0 + #include "UnityCG.cginc" + + float _DisabledState; + + float3 HsvToRgb(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y); + } + + float4 FragHue(v2f_img i) : SV_Target + { + float3 hsv = HsvToRgb(float3(i.uv.x, 1.0, 0.2)); + float4 color = float4((0.0).xxx, 1.0); + color.rgb = lerp(color.rgb, hsv, smoothstep(0.5, 1.1, 1.0 - i.uv.y)) + lerp(color.rgb, hsv, smoothstep(0.5, 1.1, i.uv.y)); + color.rgb += (0.15).xxx; + return float4(color.rgb, color.a * _DisabledState); + } + + float4 FragSat(v2f_img i) : SV_Target + { + float4 color = float4((0.0).xxx, 1.0); + float sat = i.uv.x / 2; + color.rgb += lerp(color.rgb, (sat).xxx, smoothstep(0.5, 1.2, 1.0 - i.uv.y)) + lerp(color.rgb, (sat).xxx, smoothstep(0.5, 1.2, i.uv.y)); + color.rgb += (0.15).xxx; + return float4(color.rgb, color.a * _DisabledState); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // (0) Hue + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragHue + + ENDCG + } + + // (1) Sat/lum + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragSat + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Editor Resources/UI/CurveBackground.shader.meta b/Assets/PostProcessing/Editor Resources/UI/CurveBackground.shader.meta new file mode 100644 index 0000000..20025ab --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/UI/CurveBackground.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b1b2bfb2897659e45983f0c3e7dda2c8 +timeCreated: 1460970196 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/UI/MotionBlendingIcon.png b/Assets/PostProcessing/Editor Resources/UI/MotionBlendingIcon.png new file mode 100644 index 0000000..91de8db Binary files /dev/null and b/Assets/PostProcessing/Editor Resources/UI/MotionBlendingIcon.png differ diff --git a/Assets/PostProcessing/Editor Resources/UI/MotionBlendingIcon.png.meta b/Assets/PostProcessing/Editor Resources/UI/MotionBlendingIcon.png.meta new file mode 100644 index 0000000..6c5c9e9 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/UI/MotionBlendingIcon.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: c0fa58091049bd24394fa15b0b6d4c5a +timeCreated: 1468326774 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor Resources/UI/Trackball.shader b/Assets/PostProcessing/Editor Resources/UI/Trackball.shader new file mode 100644 index 0000000..264c6a1 --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/UI/Trackball.shader @@ -0,0 +1,118 @@ +Shader "Hidden/Post FX/UI/Trackball" +{ + CGINCLUDE + + #include "UnityCG.cginc" + + #define PI 3.14159265359 + #define PI2 6.28318530718 + + float _Offset; + float _DisabledState; + float2 _Resolution; // x: size, y: size / 2 + + float3 HsvToRgb(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y); + } + + float4 CreateWheel(v2f_img i, float crossColor, float offsetColor) + { + const float kHueOuterRadius = 0.45; + const float kHueInnerRadius = 0.38; + const float kLumOuterRadius = 0.495; + const float kLumInnerRadius = 0.48; + + float4 color = (0.0).xxxx; + float2 uvc = i.uv - (0.5).xx; + float dist = sqrt(dot(uvc, uvc)); + float delta = fwidth(dist); + float angle = atan2(uvc.x, uvc.y); + + // Cross + { + float radius = (0.5 - kHueInnerRadius) * _Resolution.x + 1.0; + float2 pixel = (_Resolution.xx - 1.0) * i.uv + 1.0; + + float vline = step(floor(fmod(pixel.x, _Resolution.y)), 0.0); + vline *= step(radius, pixel.y) * step(pixel.y, _Resolution.x - radius); + + float hline = step(floor(fmod(pixel.y, _Resolution.y)), 0.0); + hline *= step(radius, pixel.x) * step(pixel.x, _Resolution.x - radius); + + color += hline.xxxx * (1.0).xxxx; + color += vline.xxxx * (1.0).xxxx; + color = saturate(color); + color *= half4((crossColor).xxx, 0.05); + } + + // Hue + { + float alphaOut = smoothstep(kHueOuterRadius - delta, kHueOuterRadius + delta, dist); + float alphaIn = smoothstep(kHueInnerRadius - delta, kHueInnerRadius + delta, dist); + + float hue = angle; + hue = 1.0 - ((hue > 0.0) ? hue : PI2 + hue) / PI2; + float4 c = float4(HsvToRgb(float3(hue, 1.0, 1.0)), 1.0); + color += lerp((0.0).xxxx, c, alphaIn - alphaOut); + } + + // Offset + { + float alphaOut = smoothstep(kLumOuterRadius - delta, kLumOuterRadius + delta, dist); + float alphaIn = smoothstep(kLumInnerRadius - delta, kLumInnerRadius + delta / 2, dist); + float4 c = float4((offsetColor).xxx, 1.0); + + float a = PI * _Offset; + if (_Offset >= 0 && angle < a && angle > 0.0) + c = float4((1.0).xxx, 0.5); + else if (angle > a && angle < 0.0) + c = float4((1.0).xxx, 0.5); + + color += lerp((0.0).xxxx, c, alphaIn - alphaOut); + } + + return color * _DisabledState; + } + + float4 FragTrackballDark(v2f_img i) : SV_Target + { + return CreateWheel(i, 1.0, 0.15); + } + + float4 FragTrackballLight(v2f_img i) : SV_Target + { + return CreateWheel(i, 0.0, 0.3); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // (0) Dark skin + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragTrackballDark + + ENDCG + } + + // (1) Light skin + Pass + { + CGPROGRAM + + #pragma vertex vert_img + #pragma fragment FragTrackballLight + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Editor Resources/UI/Trackball.shader.meta b/Assets/PostProcessing/Editor Resources/UI/Trackball.shader.meta new file mode 100644 index 0000000..d46548a --- /dev/null +++ b/Assets/PostProcessing/Editor Resources/UI/Trackball.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4bf49309c7ab9eb42a86774d2c09b4fa +timeCreated: 1460627788 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Editor.meta b/Assets/PostProcessing/Editor.meta new file mode 100644 index 0000000..92addf9 --- /dev/null +++ b/Assets/PostProcessing/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e0e418747b892364db5c5f4451e67ede +folderAsset: yes +timeCreated: 1466586258 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources.meta b/Assets/PostProcessing/Resources.meta new file mode 100644 index 0000000..11f5ae4 --- /dev/null +++ b/Assets/PostProcessing/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 52380717b4884c04ebc31c46dda84909 +folderAsset: yes +timeCreated: 1466585230 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64.meta b/Assets/PostProcessing/Resources/Bluenoise64.meta new file mode 100644 index 0000000..f1b81d2 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2be7cf05ee8fb17438022d4869299900 +folderAsset: yes +timeCreated: 1485107615 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/COPYING.txt b/Assets/PostProcessing/Resources/Bluenoise64/COPYING.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/COPYING.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/Assets/PostProcessing/Resources/Bluenoise64/COPYING.txt.meta b/Assets/PostProcessing/Resources/Bluenoise64/COPYING.txt.meta new file mode 100644 index 0000000..ca8495f --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/COPYING.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa3fc398fe396744c9299e70b63bfdd7 +timeCreated: 1485181015 +licenseType: Pro +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_0.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_0.png new file mode 100644 index 0000000..d1920c6 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_0.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_0.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_0.png.meta new file mode 100644 index 0000000..a81381f --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_0.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 50b54341495978843a6f85583ed4417d +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_1.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_1.png new file mode 100644 index 0000000..9d525e5 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_1.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_1.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_1.png.meta new file mode 100644 index 0000000..cfa52cd --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_1.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3c2f1fb7e4b66e74191b7c328ada52d9 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_10.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_10.png new file mode 100644 index 0000000..ecadafb Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_10.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_10.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_10.png.meta new file mode 100644 index 0000000..b23f52c --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_10.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: afe1e502240079342a0a980484b6da8b +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_11.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_11.png new file mode 100644 index 0000000..923292a Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_11.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_11.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_11.png.meta new file mode 100644 index 0000000..5430c15 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_11.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 771903fe7b4674445829e52e91cff019 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_12.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_12.png new file mode 100644 index 0000000..2077a1a Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_12.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_12.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_12.png.meta new file mode 100644 index 0000000..6affbc5 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_12.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 980acadb960f8424c94307ec0e585b4e +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_13.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_13.png new file mode 100644 index 0000000..491f4c0 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_13.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_13.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_13.png.meta new file mode 100644 index 0000000..a60c748 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_13.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 68613e6a221be1a4b9f31d7fa1c2d1bf +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_14.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_14.png new file mode 100644 index 0000000..3093572 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_14.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_14.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_14.png.meta new file mode 100644 index 0000000..47e3419 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_14.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f6439b54b28f3884eb67579dec0b6f21 +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_15.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_15.png new file mode 100644 index 0000000..ece485d Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_15.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_15.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_15.png.meta new file mode 100644 index 0000000..952023f --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_15.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2ee161d8945169243b5698fec114e1b7 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_16.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_16.png new file mode 100644 index 0000000..8750ad6 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_16.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_16.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_16.png.meta new file mode 100644 index 0000000..a9d7eb7 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_16.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 153f7d6dfbe713d4884df0f1e243ba92 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_17.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_17.png new file mode 100644 index 0000000..bdee0f8 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_17.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_17.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_17.png.meta new file mode 100644 index 0000000..f8ad95f --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_17.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bf95b6fdc179b0e4f890c841406193fc +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_18.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_18.png new file mode 100644 index 0000000..30c49f3 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_18.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_18.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_18.png.meta new file mode 100644 index 0000000..c032f92 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_18.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 74aca53eb7273624baffc2bf5e5cc173 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_19.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_19.png new file mode 100644 index 0000000..5180f1a Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_19.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_19.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_19.png.meta new file mode 100644 index 0000000..287174f --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_19.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 729a3ae164bcb3b4380459386adcf331 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_2.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_2.png new file mode 100644 index 0000000..f5912ee Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_2.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_2.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_2.png.meta new file mode 100644 index 0000000..cb29983 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_2.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a469f920b21fc7c4fb5b950917ce2fb2 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_20.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_20.png new file mode 100644 index 0000000..1424899 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_20.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_20.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_20.png.meta new file mode 100644 index 0000000..5e7ca30 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_20.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6dda07f1420a968449cf4c6620c44d9f +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_21.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_21.png new file mode 100644 index 0000000..d634013 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_21.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_21.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_21.png.meta new file mode 100644 index 0000000..51de948 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_21.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b7f000750830ddb4bbc80065b9314ce9 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_22.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_22.png new file mode 100644 index 0000000..cb0a0ae Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_22.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_22.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_22.png.meta new file mode 100644 index 0000000..22ea61a --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_22.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: df01d03f056c6f445b4b8a0ae054207c +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_23.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_23.png new file mode 100644 index 0000000..b063795 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_23.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_23.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_23.png.meta new file mode 100644 index 0000000..d89cc9e --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_23.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bfe953600e8fb1849a804ee08ace7b4c +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_24.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_24.png new file mode 100644 index 0000000..f4debb8 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_24.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_24.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_24.png.meta new file mode 100644 index 0000000..3f569d7 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_24.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 32c6a5f7143b86c44bd5cdee2ff3f8ad +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_25.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_25.png new file mode 100644 index 0000000..c20d7b2 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_25.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_25.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_25.png.meta new file mode 100644 index 0000000..8045a5e --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_25.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f4b8ab78b57749d4e96d36f6d8a395d0 +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_26.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_26.png new file mode 100644 index 0000000..930ec4e Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_26.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_26.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_26.png.meta new file mode 100644 index 0000000..331064b --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_26.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 09f6c01f98a3ded4daf1afc52a3c260f +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_27.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_27.png new file mode 100644 index 0000000..06949cf Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_27.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_27.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_27.png.meta new file mode 100644 index 0000000..5665344 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_27.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bdd06fb88ef36ed4a85dd506352c2d80 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_28.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_28.png new file mode 100644 index 0000000..9807e41 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_28.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_28.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_28.png.meta new file mode 100644 index 0000000..3bbb00d --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_28.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 02c0a84bd64c6f044954d8bde9b46ec8 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_29.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_29.png new file mode 100644 index 0000000..413a86e Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_29.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_29.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_29.png.meta new file mode 100644 index 0000000..527881a --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_29.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: aa80dc44aa4fe4c43bb9d51d90cf2958 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_3.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_3.png new file mode 100644 index 0000000..767fc58 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_3.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_3.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_3.png.meta new file mode 100644 index 0000000..fbe528f --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_3.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 373f9bf6b0841af4ebf26d25e4a3f4e2 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_30.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_30.png new file mode 100644 index 0000000..a1da55b Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_30.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_30.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_30.png.meta new file mode 100644 index 0000000..dd61326 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_30.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 0fa10b21877c61b4db40ba5708815f81 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_31.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_31.png new file mode 100644 index 0000000..e2961b5 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_31.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_31.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_31.png.meta new file mode 100644 index 0000000..8ed0950 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_31.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6b0a189df0bd4d5448eaefb4e673ace8 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_32.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_32.png new file mode 100644 index 0000000..24d31e9 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_32.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_32.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_32.png.meta new file mode 100644 index 0000000..c9e6833 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_32.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 87a5e40cc271ea648b583616f6ebe7fe +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_33.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_33.png new file mode 100644 index 0000000..3403d4d Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_33.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_33.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_33.png.meta new file mode 100644 index 0000000..7500baf --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_33.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b71bb466b71fd13449dd736f63caeb67 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_34.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_34.png new file mode 100644 index 0000000..2022cd9 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_34.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_34.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_34.png.meta new file mode 100644 index 0000000..8a40dce --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_34.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 319b8e66db3faa4438cf6982e9c89b2f +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_35.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_35.png new file mode 100644 index 0000000..bd9359c Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_35.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_35.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_35.png.meta new file mode 100644 index 0000000..24a716d --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_35.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 0a79c155edf9b2d429d4736abee5acdb +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_36.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_36.png new file mode 100644 index 0000000..22ed73a Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_36.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_36.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_36.png.meta new file mode 100644 index 0000000..e35210c --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_36.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 351e95d0e20a54849bd4ce5f9b498934 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_37.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_37.png new file mode 100644 index 0000000..6f84bb7 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_37.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_37.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_37.png.meta new file mode 100644 index 0000000..af4db5a --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_37.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1d6958e30e40a254dbe5a54c573eeb3c +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_38.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_38.png new file mode 100644 index 0000000..d9c27fb Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_38.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_38.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_38.png.meta new file mode 100644 index 0000000..78b4dc4 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_38.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9660a4ca1ca8425408ac25c641932977 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_39.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_39.png new file mode 100644 index 0000000..2610149 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_39.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_39.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_39.png.meta new file mode 100644 index 0000000..5f204ce --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_39.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 547dbd5f858c74047ba3f213e4408307 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_4.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_4.png new file mode 100644 index 0000000..81cdc3d Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_4.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_4.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_4.png.meta new file mode 100644 index 0000000..fe3a392 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_4.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6fa5cf178eaaa5f42b820f636bb6e0bd +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_40.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_40.png new file mode 100644 index 0000000..8d95446 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_40.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_40.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_40.png.meta new file mode 100644 index 0000000..3a71a40 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_40.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1a9ce5640cde5934aae0022f020464a6 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_41.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_41.png new file mode 100644 index 0000000..f6c01a6 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_41.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_41.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_41.png.meta new file mode 100644 index 0000000..b7295d1 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_41.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: cd9006dc442cc244e89b3f492384d46a +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_42.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_42.png new file mode 100644 index 0000000..1d42c2f Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_42.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_42.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_42.png.meta new file mode 100644 index 0000000..33ea83b --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_42.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b266511438fae724f9d3ce6bd26583e8 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_43.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_43.png new file mode 100644 index 0000000..2f5c591 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_43.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_43.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_43.png.meta new file mode 100644 index 0000000..9526e70 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_43.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 71bc1b6b66e8b784b972199b7e90204e +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_44.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_44.png new file mode 100644 index 0000000..765c014 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_44.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_44.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_44.png.meta new file mode 100644 index 0000000..0b37eff --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_44.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 15e54aa23a938444389469d53765d741 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_45.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_45.png new file mode 100644 index 0000000..f335132 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_45.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_45.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_45.png.meta new file mode 100644 index 0000000..529ede3 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_45.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b9960364038cbfa4aa49d7b2032d3110 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_46.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_46.png new file mode 100644 index 0000000..5118df3 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_46.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_46.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_46.png.meta new file mode 100644 index 0000000..06704ef --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_46.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8ecbbcae4cc747a4abbc4adce795d25e +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_47.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_47.png new file mode 100644 index 0000000..c22a632 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_47.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_47.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_47.png.meta new file mode 100644 index 0000000..c1220ea --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_47.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1378a33cdd085d64c9da863d2484ff21 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_48.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_48.png new file mode 100644 index 0000000..782c380 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_48.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_48.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_48.png.meta new file mode 100644 index 0000000..f8a6e3b --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_48.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: aff59c63d25d43f4c938f248837c30fb +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_49.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_49.png new file mode 100644 index 0000000..34d36e6 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_49.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_49.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_49.png.meta new file mode 100644 index 0000000..96d9886 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_49.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3f7c3687170b90e4a8d2ee6b142670f4 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_5.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_5.png new file mode 100644 index 0000000..90a715a Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_5.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_5.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_5.png.meta new file mode 100644 index 0000000..adac8ba --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_5.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a1ae041906217ae44a774d4ca139af50 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_50.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_50.png new file mode 100644 index 0000000..df80595 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_50.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_50.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_50.png.meta new file mode 100644 index 0000000..80df0a1 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_50.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d8c290e38ff0425409d0ae6a98c95e41 +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_51.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_51.png new file mode 100644 index 0000000..ed9f2d3 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_51.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_51.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_51.png.meta new file mode 100644 index 0000000..ff82bfd --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_51.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d5a51525b27e3ee4aadbeb39cbcf0750 +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_52.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_52.png new file mode 100644 index 0000000..be2c6fe Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_52.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_52.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_52.png.meta new file mode 100644 index 0000000..dc39ab1 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_52.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d2e8e90fac2e6a341a38e1c3963c218d +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_53.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_53.png new file mode 100644 index 0000000..c226491 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_53.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_53.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_53.png.meta new file mode 100644 index 0000000..202abf5 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_53.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c94b57b5a32a22d43ade66e09f6a4bd2 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_54.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_54.png new file mode 100644 index 0000000..3b6bbb8 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_54.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_54.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_54.png.meta new file mode 100644 index 0000000..0a0a81a --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_54.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 936dea238abb0864ab3985a995e16a29 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_55.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_55.png new file mode 100644 index 0000000..261291a Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_55.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_55.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_55.png.meta new file mode 100644 index 0000000..35ba219 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_55.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 5e542d0126a2c7848b66bffc428905fd +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_56.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_56.png new file mode 100644 index 0000000..7d8b298 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_56.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_56.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_56.png.meta new file mode 100644 index 0000000..d9c49cb --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_56.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 70f23eaf7d8ae9147aa542d20e93733b +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_57.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_57.png new file mode 100644 index 0000000..97fe687 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_57.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_57.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_57.png.meta new file mode 100644 index 0000000..aa03290 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_57.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e138166e7a7c70f49943be7edda35d35 +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_58.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_58.png new file mode 100644 index 0000000..9c01659 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_58.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_58.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_58.png.meta new file mode 100644 index 0000000..3ac47bc --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_58.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 85a45a6d8b2ffb84987d2b028ecfb220 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_59.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_59.png new file mode 100644 index 0000000..805a44e Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_59.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_59.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_59.png.meta new file mode 100644 index 0000000..be2d613 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_59.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d96974690c77f50489eb60ec84bd8dac +timeCreated: 1485107929 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_6.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_6.png new file mode 100644 index 0000000..326b1d3 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_6.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_6.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_6.png.meta new file mode 100644 index 0000000..82ca960 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_6.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 79b86f3419b87f3429164a956da8cfab +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_60.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_60.png new file mode 100644 index 0000000..5307242 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_60.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_60.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_60.png.meta new file mode 100644 index 0000000..9add371 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_60.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 404fa8def46b1c447817e1ebdaa7144e +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_61.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_61.png new file mode 100644 index 0000000..623794c Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_61.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_61.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_61.png.meta new file mode 100644 index 0000000..8d50446 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_61.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 119591e0bb084e848835d237546b3882 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_62.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_62.png new file mode 100644 index 0000000..d4b4f70 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_62.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_62.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_62.png.meta new file mode 100644 index 0000000..6c4ec71 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_62.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a03c400b0e3959f428ee99dfc6cfc263 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_63.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_63.png new file mode 100644 index 0000000..1746cc1 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_63.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_63.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_63.png.meta new file mode 100644 index 0000000..b23dbd0 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_63.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4a11d65ce13d5f542a0ff136cc2f3fba +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_7.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_7.png new file mode 100644 index 0000000..0a396d3 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_7.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_7.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_7.png.meta new file mode 100644 index 0000000..eb464ac --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_7.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3ac02e7e783571c468f9c086d2384ba7 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_8.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_8.png new file mode 100644 index 0000000..0b5d32e Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_8.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_8.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_8.png.meta new file mode 100644 index 0000000..242fe69 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_8.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c55042318a938344ab23cd7f09dd0076 +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_9.png b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_9.png new file mode 100644 index 0000000..2beb747 Binary files /dev/null and b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_9.png differ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_9.png.meta b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_9.png.meta new file mode 100644 index 0000000..5f8db7a --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LDR_LLL1_9.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 71583cfd8899717428d5b1a95fa39cda +timeCreated: 1485107928 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LICENSE.txt b/Assets/PostProcessing/Resources/Bluenoise64/LICENSE.txt new file mode 100644 index 0000000..661457b --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LICENSE.txt @@ -0,0 +1,9 @@ +To the extent possible under law, Christoph Peters has waived all copyright and +related or neighboring rights to the files in this directory and its +subdirectories. This work is published from: Germany. + +The work is made available under the terms of the Creative Commons CC0 Public +Domain Dedication. + +For more information please visit: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/Assets/PostProcessing/Resources/Bluenoise64/LICENSE.txt.meta b/Assets/PostProcessing/Resources/Bluenoise64/LICENSE.txt.meta new file mode 100644 index 0000000..661ee27 --- /dev/null +++ b/Assets/PostProcessing/Resources/Bluenoise64/LICENSE.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 48ffda675aa0afa4f9eec3a5d5487aeb +timeCreated: 1485181015 +licenseType: Pro +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders.meta b/Assets/PostProcessing/Resources/Shaders.meta new file mode 100644 index 0000000..fd3777f --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e039bcc30d13c9341aa224f4e89f21b3 +folderAsset: yes +timeCreated: 1462199729 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/ACES.cginc b/Assets/PostProcessing/Resources/Shaders/ACES.cginc new file mode 100644 index 0000000..fa996b9 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ACES.cginc @@ -0,0 +1,1333 @@ +#ifndef __ACES__ +#define __ACES__ + +/** + * https://github.com/ampas/aces-dev + * + * Academy Color Encoding System (ACES) software and tools are provided by the + * Academy under the following terms and conditions: A worldwide, royalty-free, + * non-exclusive right to copy, modify, create derivatives, and use, in source and + * binary forms, is hereby granted, subject to acceptance of this license. + * + * Copyright 2015 Academy of Motion Picture Arts and Sciences (A.M.P.A.S.). + * Portions contributed by others as indicated. All rights reserved. + * + * Performance of any of the aforementioned acts indicates acceptance to be bound + * by the following terms and conditions: + * + * * Copies of source code, in whole or in part, must retain the above copyright + * notice, this list of conditions and the Disclaimer of Warranty. + * + * * Use in binary form must retain the above copyright notice, this list of + * conditions and the Disclaimer of Warranty in the documentation and/or other + * materials provided with the distribution. + * + * * Nothing in this license shall be deemed to grant any rights to trademarks, + * copyrights, patents, trade secrets or any other intellectual property of + * A.M.P.A.S. or any contributors, except as expressly stated herein. + * + * * Neither the name "A.M.P.A.S." nor the name of any other contributors to this + * software may be used to endorse or promote products derivative of or based on + * this software without express prior written permission of A.M.P.A.S. or the + * contributors, as appropriate. + * + * This license shall be construed pursuant to the laws of the State of + * California, and any disputes related thereto shall be subject to the + * jurisdiction of the courts therein. + * + * Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL A.M.P.A.S., OR ANY + * CONTRIBUTORS OR DISTRIBUTORS, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, RESITUTIONARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, THE ACADEMY SPECIFICALLY + * DISCLAIMS ANY REPRESENTATIONS OR WARRANTIES WHATSOEVER RELATED TO PATENT OR + * OTHER INTELLECTUAL PROPERTY RIGHTS IN THE ACADEMY COLOR ENCODING SYSTEM, OR + * APPLICATIONS THEREOF, HELD BY PARTIES OTHER THAN A.M.P.A.S.,WHETHER DISCLOSED OR + * UNDISCLOSED. + */ + +//#define CUSTOM_WHITE_POINT + +/* + Basic usage : + + half4 color = tex2D(_MainTex, i.uv); + half3 aces = unity_to_ACES(color.rgb); + half3 oces = RRT(aces); + half3 odt = ODT_RGBmonitor_100nits_dim(oces); + return half4(odt, color.a); + + If you want to customize the white point, uncomment the previous define and set uniforms accordingly: + + float whitePoint = 48f; // Default ACES value + material.SetFloat("CINEMA_WHITE", whitePoint); + material.SetFloat("CINEMA_DARK", whitePoint / 2400f); + */ + +#include "Common.cginc" + +#define ACEScc_MAX 1.4679964 +#define ACEScc_MIDGRAY 0.4135884 + +// +// Precomputed matrices (pre-transposed) +// See https://github.com/ampas/aces-dev/blob/master/transforms/ctl/README-MATRIX.md +// +static const half3x3 sRGB_2_AP0 = { + 0.4397010, 0.3829780, 0.1773350, + 0.0897923, 0.8134230, 0.0967616, + 0.0175440, 0.1115440, 0.8707040 +}; + +static const half3x3 sRGB_2_AP1 = { + 0.61319, 0.33951, 0.04737, + 0.07021, 0.91634, 0.01345, + 0.02062, 0.10957, 0.86961 +}; + +static const half3x3 AP0_2_sRGB = { + 2.52169, -1.13413, -0.38756, + -0.27648, 1.37272, -0.09624, + -0.01538, -0.15298, 1.16835, +}; + +static const half3x3 AP1_2_sRGB = { + 1.70505, -0.62179, -0.08326, + -0.13026, 1.14080, -0.01055, + -0.02400, -0.12897, 1.15297, +}; + +static const half3x3 AP0_2_AP1_MAT = { + 1.4514393161, -0.2365107469, -0.2149285693, + -0.0765537734, 1.1762296998, -0.0996759264, + 0.0083161484, -0.0060324498, 0.9977163014 +}; + +static const half3x3 AP1_2_AP0_MAT = { + 0.6954522414, 0.1406786965, 0.1638690622, + 0.0447945634, 0.8596711185, 0.0955343182, + -0.0055258826, 0.0040252103, 1.0015006723 +}; + +static const half3x3 AP1_2_XYZ_MAT = { + 0.6624541811, 0.1340042065, 0.1561876870, + 0.2722287168, 0.6740817658, 0.0536895174, + -0.0055746495, 0.0040607335, 1.0103391003 +}; + +static const half3x3 XYZ_2_AP1_MAT = { + 1.6410233797, -0.3248032942, -0.2364246952, + -0.6636628587, 1.6153315917, 0.0167563477, + 0.0117218943, -0.0082844420, 0.9883948585 +}; + +static const half3x3 XYZ_2_REC709_MAT = { + 3.2409699419, -1.5373831776, -0.4986107603, + -0.9692436363, 1.8759675015, 0.0415550574, + 0.0556300797, -0.2039769589, 1.0569715142 +}; + +static const half3x3 XYZ_2_REC2020_MAT = { + 1.7166511880, -0.3556707838, -0.2533662814, + -0.6666843518, 1.6164812366, 0.0157685458, + 0.0176398574, -0.0427706133, 0.9421031212 +}; + +static const half3x3 XYZ_2_DCIP3_MAT = { + 2.7253940305, -1.0180030062, -0.4401631952, + -0.7951680258, 1.6897320548, 0.0226471906, + 0.0412418914, -0.0876390192, 1.1009293786 +}; + +static const half3 AP1_RGB2Y = half3(0.272229, 0.674082, 0.0536895); + +static const half3x3 RRT_SAT_MAT = { + 0.9708890, 0.0269633, 0.00214758, + 0.0108892, 0.9869630, 0.00214758, + 0.0108892, 0.0269633, 0.96214800 +}; + +static const half3x3 ODT_SAT_MAT = { + 0.949056, 0.0471857, 0.00375827, + 0.019056, 0.9771860, 0.00375827, + 0.019056, 0.0471857, 0.93375800 +}; + +static const half3x3 D60_2_D65_CAT = { + 0.98722400, -0.00611327, 0.0159533, + -0.00759836, 1.00186000, 0.0053302, + 0.00307257, -0.00509595, 1.0816800 +}; + +// +// Unity to ACES +// +// converts Unity raw (sRGB primaries) to +// ACES2065-1 (AP0 w/ linear encoding) +// +half3 unity_to_ACES(half3 x) +{ + x = mul(sRGB_2_AP0, x); + return x; +} + +// +// ACES to Unity +// +// converts ACES2065-1 (AP0 w/ linear encoding) +// Unity raw (sRGB primaries) to +// +half3 ACES_to_unity(half3 x) +{ + x = mul(AP0_2_sRGB, x); + return x; +} + +// +// Unity to ACEScg +// +// converts Unity raw (sRGB primaries) to +// ACEScg (AP1 w/ linear encoding) +// +half3 unity_to_ACEScg(half3 x) +{ + x = mul(sRGB_2_AP1, x); + return x; +} + +// +// ACEScg to Unity +// +// converts ACEScg (AP1 w/ linear encoding) to +// Unity raw (sRGB primaries) +// +half3 ACEScg_to_unity(half3 x) +{ + x = mul(AP1_2_sRGB, x); + return x; +} + +// +// ACES Color Space Conversion - ACES to ACEScc +// +// converts ACES2065-1 (AP0 w/ linear encoding) to +// ACEScc (AP1 w/ logarithmic encoding) +// +// This transform follows the formulas from section 4.4 in S-2014-003 +// +half ACES_to_ACEScc(half x) +{ + if (x <= 0.0) + return -0.35828683; // = (log2(pow(2.0, -15.0) * 0.5) + 9.72) / 17.52 + else if (x < pow(2.0, -15.0)) + return (log2(pow(2.0, -16.0) + x * 0.5) + 9.72) / 17.52; + else // (x >= pow(2.0, -15.0)) + return (log2(x) + 9.72) / 17.52; +} + +half3 ACES_to_ACEScc(half3 x) +{ + x = clamp(x, 0.0, HALF_MAX); + + // x is clamped to [0, HALF_MAX], skip the <= 0 check + return (x < 0.00003051757) ? (log2(0.00001525878 + x * 0.5) + 9.72) / 17.52 : (log2(x) + 9.72) / 17.52; + + /* + return half3( + ACES_to_ACEScc(x.r), + ACES_to_ACEScc(x.g), + ACES_to_ACEScc(x.b) + ); + */ +} + +// +// ACES Color Space Conversion - ACEScc to ACES +// +// converts ACEScc (AP1 w/ ACESlog encoding) to +// ACES2065-1 (AP0 w/ linear encoding) +// +// This transform follows the formulas from section 4.4 in S-2014-003 +// +half ACEScc_to_ACES(half x) +{ + // TODO: Optimize me + if (x < -0.3013698630) // (9.72 - 15) / 17.52 + return (pow(2.0, x * 17.52 - 9.72) - pow(2.0, -16.0)) * 2.0; + else if (x < (log2(HALF_MAX) + 9.72) / 17.52) + return pow(2.0, x * 17.52 - 9.72); + else // (x >= (log2(HALF_MAX) + 9.72) / 17.52) + return HALF_MAX; +} + +half3 ACEScc_to_ACES(half3 x) +{ + return half3( + ACEScc_to_ACES(x.r), + ACEScc_to_ACES(x.g), + ACEScc_to_ACES(x.b) + ); +} + +// +// ACES Color Space Conversion - ACES to ACEScg +// +// converts ACES2065-1 (AP0 w/ linear encoding) to +// ACEScg (AP1 w/ linear encoding) +// +half3 ACES_to_ACEScg(half3 x) +{ + return mul(AP0_2_AP1_MAT, x); +} + +// +// ACES Color Space Conversion - ACEScg to ACES +// +// converts ACEScg (AP1 w/ linear encoding) to +// ACES2065-1 (AP0 w/ linear encoding) +// +half3 ACEScg_to_ACES(half3 x) +{ + return mul(AP1_2_AP0_MAT, x); +} + +// +// Reference Rendering Transform (RRT) +// +// Input is ACES +// Output is OCES +// +half rgb_2_saturation(half3 rgb) +{ + const half TINY = 1e-10; + half mi = Min3(rgb); + half ma = Max3(rgb); + return (max(ma, TINY) - max(mi, TINY)) / max(ma, 1e-2); +} + +half rgb_2_yc(half3 rgb) +{ + const half ycRadiusWeight = 1.75; + + // Converts RGB to a luminance proxy, here called YC + // YC is ~ Y + K * Chroma + // Constant YC is a cone-shaped surface in RGB space, with the tip on the + // neutral axis, towards white. + // YC is normalized: RGB 1 1 1 maps to YC = 1 + // + // ycRadiusWeight defaults to 1.75, although can be overridden in function + // call to rgb_2_yc + // ycRadiusWeight = 1 -> YC for pure cyan, magenta, yellow == YC for neutral + // of same value + // ycRadiusWeight = 2 -> YC for pure red, green, blue == YC for neutral of + // same value. + + half r = rgb.x; + half g = rgb.y; + half b = rgb.z; + half chroma = sqrt(b * (b - g) + g * (g - r) + r * (r - b)); + return (b + g + r + ycRadiusWeight * chroma) / 3.0; +} + +half rgb_2_hue(half3 rgb) +{ + // Returns a geometric hue angle in degrees (0-360) based on RGB values. + // For neutral colors, hue is undefined and the function will return a quiet NaN value. + half hue; + if (rgb.x == rgb.y && rgb.y == rgb.z) + hue = 0.0; // RGB triplets where RGB are equal have an undefined hue + else + hue = (180.0 / UNITY_PI) * atan2(sqrt(3.0) * (rgb.y - rgb.z), 2.0 * rgb.x - rgb.y - rgb.z); + + if (hue < 0.0) hue = hue + 360.0; + + return hue; +} + +half center_hue(half hue, half centerH) +{ + half hueCentered = hue - centerH; + if (hueCentered < -180.0) hueCentered = hueCentered + 360.0; + else if (hueCentered > 180.0) hueCentered = hueCentered - 360.0; + return hueCentered; +} + +half sigmoid_shaper(half x) +{ + // Sigmoid function in the range 0 to 1 spanning -2 to +2. + + half t = max(1.0 - abs(x / 2.0), 0.0); + half y = 1.0 + sign(x) * (1.0 - t * t); + + return y / 2.0; +} + +half glow_fwd(half ycIn, half glowGainIn, half glowMid) +{ + half glowGainOut; + + if (ycIn <= 2.0 / 3.0 * glowMid) + glowGainOut = glowGainIn; + else if (ycIn >= 2.0 * glowMid) + glowGainOut = 0.0; + else + glowGainOut = glowGainIn * (glowMid / ycIn - 1.0 / 2.0); + + return glowGainOut; +} + +/* +half cubic_basis_shaper +( + half x, + half w // full base width of the shaper function (in degrees) +) +{ + half M[4][4] = { + { -1.0 / 6, 3.0 / 6, -3.0 / 6, 1.0 / 6 }, + { 3.0 / 6, -6.0 / 6, 3.0 / 6, 0.0 / 6 }, + { -3.0 / 6, 0.0 / 6, 3.0 / 6, 0.0 / 6 }, + { 1.0 / 6, 4.0 / 6, 1.0 / 6, 0.0 / 6 } + }; + + half knots[5] = { + -w / 2.0, + -w / 4.0, + 0.0, + w / 4.0, + w / 2.0 + }; + + half y = 0.0; + if ((x > knots[0]) && (x < knots[4])) + { + half knot_coord = (x - knots[0]) * 4.0 / w; + int j = knot_coord; + half t = knot_coord - j; + + half monomials[4] = { t*t*t, t*t, t, 1.0 }; + + // (if/else structure required for compatibility with CTL < v1.5.) + if (j == 3) + { + y = monomials[0] * M[0][0] + monomials[1] * M[1][0] + + monomials[2] * M[2][0] + monomials[3] * M[3][0]; + } + else if (j == 2) + { + y = monomials[0] * M[0][1] + monomials[1] * M[1][1] + + monomials[2] * M[2][1] + monomials[3] * M[3][1]; + } + else if (j == 1) + { + y = monomials[0] * M[0][2] + monomials[1] * M[1][2] + + monomials[2] * M[2][2] + monomials[3] * M[3][2]; + } + else if (j == 0) + { + y = monomials[0] * M[0][3] + monomials[1] * M[1][3] + + monomials[2] * M[2][3] + monomials[3] * M[3][3]; + } + else + { + y = 0.0; + } + } + + return y * 3.0 / 2.0; +} +*/ + +static const half3x3 M = { + 0.5, -1.0, 0.5, + -1.0, 1.0, 0.0, + 0.5, 0.5, 0.0 +}; + +half segmented_spline_c5_fwd(half x) +{ + const half coefsLow[6] = { -4.0000000000, -4.0000000000, -3.1573765773, -0.4852499958, 1.8477324706, 1.8477324706 }; // coefs for B-spline between minPoint and midPoint (units of log luminance) + const half coefsHigh[6] = { -0.7185482425, 2.0810307172, 3.6681241237, 4.0000000000, 4.0000000000, 4.0000000000 }; // coefs for B-spline between midPoint and maxPoint (units of log luminance) + const half2 minPoint = half2(0.18 * exp2(-15.0), 0.0001); // {luminance, luminance} linear extension below this + const half2 midPoint = half2(0.18, 0.48); // {luminance, luminance} + const half2 maxPoint = half2(0.18 * exp2(18.0), 10000.0); // {luminance, luminance} linear extension above this + const half slopeLow = 0.0; // log-log slope of low linear extension + const half slopeHigh = 0.0; // log-log slope of high linear extension + + const int N_KNOTS_LOW = 4; + const int N_KNOTS_HIGH = 4; + + // Check for negatives or zero before taking the log. If negative or zero, + // set to ACESMIN.1 + float xCheck = x; + if (xCheck <= 0.0) xCheck = 0.00006103515; // = pow(2.0, -14.0); + + half logx = log10(xCheck); + half logy; + + if (logx <= log10(minPoint.x)) + { + logy = logx * slopeLow + (log10(minPoint.y) - slopeLow * log10(minPoint.x)); + } + else if ((logx > log10(minPoint.x)) && (logx < log10(midPoint.x))) + { + half knot_coord = (N_KNOTS_LOW - 1) * (logx - log10(minPoint.x)) / (log10(midPoint.x) - log10(minPoint.x)); + int j = knot_coord; + half t = knot_coord - j; + + half3 cf = half3(coefsLow[j], coefsLow[j + 1], coefsLow[j + 2]); + half3 monomials = half3(t * t, t, 1.0); + logy = dot(monomials, mul(M, cf)); + } + else if ((logx >= log10(midPoint.x)) && (logx < log10(maxPoint.x))) + { + half knot_coord = (N_KNOTS_HIGH - 1) * (logx - log10(midPoint.x)) / (log10(maxPoint.x) - log10(midPoint.x)); + int j = knot_coord; + half t = knot_coord - j; + + half3 cf = half3(coefsHigh[j], coefsHigh[j + 1], coefsHigh[j + 2]); + half3 monomials = half3(t * t, t, 1.0); + logy = dot(monomials, mul(M, cf)); + } + else + { //if (logIn >= log10(maxPoint.x)) { + logy = logx * slopeHigh + (log10(maxPoint.y) - slopeHigh * log10(maxPoint.x)); + } + + return pow(10.0, logy); +} + +half segmented_spline_c9_fwd(half x) +{ + const half coefsLow[10] = { -1.6989700043, -1.6989700043, -1.4779000000, -1.2291000000, -0.8648000000, -0.4480000000, 0.0051800000, 0.4511080334, 0.9113744414, 0.9113744414 }; // coefs for B-spline between minPoint and midPoint (units of log luminance) + const half coefsHigh[10] = { 0.5154386965, 0.8470437783, 1.1358000000, 1.3802000000, 1.5197000000, 1.5985000000, 1.6467000000, 1.6746091357, 1.6878733390, 1.6878733390 }; // coefs for B-spline between midPoint and maxPoint (units of log luminance) + const half2 minPoint = half2(segmented_spline_c5_fwd(0.18 * exp2(-6.5)), 0.02); // {luminance, luminance} linear extension below this + const half2 midPoint = half2(segmented_spline_c5_fwd(0.18), 4.8); // {luminance, luminance} + const half2 maxPoint = half2(segmented_spline_c5_fwd(0.18 * exp2(6.5)), 48.0); // {luminance, luminance} linear extension above this + const half slopeLow = 0.0; // log-log slope of low linear extension + const half slopeHigh = 0.04; // log-log slope of high linear extension + + const int N_KNOTS_LOW = 8; + const int N_KNOTS_HIGH = 8; + + // Check for negatives or zero before taking the log. If negative or zero, + // set to OCESMIN. + half xCheck = x; + if (xCheck <= 0.0) xCheck = 1e-4; + + half logx = log10(xCheck); + half logy; + + if (logx <= log10(minPoint.x)) + { + logy = logx * slopeLow + (log10(minPoint.y) - slopeLow * log10(minPoint.x)); + } + else if ((logx > log10(minPoint.x)) && (logx < log10(midPoint.x))) + { + half knot_coord = (N_KNOTS_LOW - 1) * (logx - log10(minPoint.x)) / (log10(midPoint.x) - log10(minPoint.x)); + int j = knot_coord; + half t = knot_coord - j; + + half3 cf = half3(coefsLow[j], coefsLow[j + 1], coefsLow[j + 2]); + half3 monomials = half3(t * t, t, 1.0); + logy = dot(monomials, mul(M, cf)); + } + else if ((logx >= log10(midPoint.x)) && (logx < log10(maxPoint.x))) + { + half knot_coord = (N_KNOTS_HIGH - 1) * (logx - log10(midPoint.x)) / (log10(maxPoint.x) - log10(midPoint.x)); + int j = knot_coord; + half t = knot_coord - j; + + half3 cf = half3(coefsHigh[j], coefsHigh[j + 1], coefsHigh[j + 2]); + half3 monomials = half3(t * t, t, 1.0); + logy = dot(monomials, mul(M, cf)); + } + else + { //if (logIn >= log10(maxPoint.x)) { + logy = logx * slopeHigh + (log10(maxPoint.y) - slopeHigh * log10(maxPoint.x)); + } + + return pow(10.0, logy); +} + +static const half RRT_GLOW_GAIN = 0.05; +static const half RRT_GLOW_MID = 0.08; + +static const half RRT_RED_SCALE = 0.82; +static const half RRT_RED_PIVOT = 0.03; +static const half RRT_RED_HUE = 0.0; +static const half RRT_RED_WIDTH = 135.0; + +static const half RRT_SAT_FACTOR = 0.96; + +half3 RRT(half3 aces) +{ + // --- Glow module --- // + half saturation = rgb_2_saturation(aces); + half ycIn = rgb_2_yc(aces); + half s = sigmoid_shaper((saturation - 0.4) / 0.2); + half addedGlow = 1.0 + glow_fwd(ycIn, RRT_GLOW_GAIN * s, RRT_GLOW_MID); + aces *= addedGlow; + + // --- Red modifier --- // + half hue = rgb_2_hue(aces); + half centeredHue = center_hue(hue, RRT_RED_HUE); + half hueWeight; + { + //hueWeight = cubic_basis_shaper(centeredHue, RRT_RED_WIDTH); + hueWeight = smoothstep(0.0, 1.0, 1.0 - abs(2.0 * centeredHue / RRT_RED_WIDTH)); + hueWeight *= hueWeight; + } + + aces.r += hueWeight * saturation * (RRT_RED_PIVOT - aces.r) * (1.0 - RRT_RED_SCALE); + + // --- ACES to RGB rendering space --- // + aces = clamp(aces, 0.0, HALF_MAX); // avoids saturated negative colors from becoming positive in the matrix + half3 rgbPre = mul(AP0_2_AP1_MAT, aces); + rgbPre = clamp(rgbPre, 0, HALF_MAX); + + // --- Global desaturation --- // + //rgbPre = mul(RRT_SAT_MAT, rgbPre); + rgbPre = lerp(dot(rgbPre, AP1_RGB2Y).xxx, rgbPre, RRT_SAT_FACTOR.xxx); + + // --- Apply the tonescale independently in rendering-space RGB --- // + half3 rgbPost; + rgbPost.x = segmented_spline_c5_fwd(rgbPre.x); + rgbPost.y = segmented_spline_c5_fwd(rgbPre.y); + rgbPost.z = segmented_spline_c5_fwd(rgbPre.z); + + // --- RGB rendering space to OCES --- // + half3 rgbOces = mul(AP1_2_AP0_MAT, rgbPost); + + return rgbOces; +} + +// +// Output Device Transform +// +half3 Y_2_linCV(half3 Y, half Ymax, half Ymin) +{ + return (Y - Ymin) / (Ymax - Ymin); +} + +half3 XYZ_2_xyY(half3 XYZ) +{ + half divisor = max(dot(XYZ, (1.0).xxx), 1e-4); + return half3(XYZ.xy / divisor, XYZ.y); +} + +half3 xyY_2_XYZ(half3 xyY) +{ + half m = xyY.z / max(xyY.y, 1e-4); + half3 XYZ = half3(xyY.xz, (1.0 - xyY.x - xyY.y)); + XYZ.xz *= m; + return XYZ; +} + +static const half DIM_SURROUND_GAMMA = 0.9811; + +half3 darkSurround_to_dimSurround(half3 linearCV) +{ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + half3 xyY = XYZ_2_xyY(XYZ); + xyY.z = clamp(xyY.z, 0.0, HALF_MAX); + xyY.z = pow(xyY.z, DIM_SURROUND_GAMMA); + XYZ = xyY_2_XYZ(xyY); + + return mul(XYZ_2_AP1_MAT, XYZ); +} + +half moncurve_r(half y, half gamma, half offs) +{ + // Reverse monitor curve + half x; + const half yb = pow(offs * gamma / ((gamma - 1.0) * (1.0 + offs)), gamma); + const half rs = pow((gamma - 1.0) / offs, gamma - 1.0) * pow((1.0 + offs) / gamma, gamma); + if (y >= yb) + x = (1.0 + offs) * pow(y, 1.0 / gamma) - offs; + else + x = y * rs; + return x; +} + +half bt1886_r(half L, half gamma, half Lw, half Lb) +{ + // The reference EOTF specified in Rec. ITU-R BT.1886 + // L = a(max[(V+b),0])^g + half a = pow(pow(Lw, 1.0 / gamma) - pow(Lb, 1.0 / gamma), gamma); + half b = pow(Lb, 1.0 / gamma) / (pow(Lw, 1.0 / gamma) - pow(Lb, 1.0 / gamma)); + half V = pow(max(L / a, 0.0), 1.0 / gamma) - b; + return V; +} + +half roll_white_fwd( + half x, // color value to adjust (white scaled to around 1.0) + half new_wht, // white adjustment (e.g. 0.9 for 10% darkening) + half width // adjusted width (e.g. 0.25 for top quarter of the tone scale) + ) +{ + const half x0 = -1.0; + const half x1 = x0 + width; + const half y0 = -new_wht; + const half y1 = x1; + const half m1 = (x1 - x0); + const half a = y0 - y1 + m1; + const half b = 2.0 * (y1 - y0) - m1; + const half c = y0; + const half t = (-x - x0) / (x1 - x0); + half o = 0.0; + if (t < 0.0) + o = -(t * b + c); + else if (t > 1.0) + o = x; + else + o = -((t * a + b) * t + c); + return o; +} + +half3 linear_to_sRGB(half3 x) +{ + return (x <= 0.0031308 ? (x * 12.9232102) : 1.055 * pow(x, 1.0 / 2.4) - 0.055); +} + +half3 linear_to_bt1886(half3 x, half gamma, half Lw, half Lb) +{ + // Good enough approximation for now, may consider using the exact formula instead + // TODO: Experiment + return pow(max(x, 0.0), 1.0 / 2.4); + + // Correct implementation (Reference EOTF specified in Rec. ITU-R BT.1886) : + // L = a(max[(V+b),0])^g + half invgamma = 1.0 / gamma; + half p_Lw = pow(Lw, invgamma); + half p_Lb = pow(Lb, invgamma); + half3 a = pow(p_Lw - p_Lb, gamma).xxx; + half3 b = (p_Lb / p_Lw - p_Lb).xxx; + half3 V = pow(max(x / a, 0.0), invgamma.xxx) - b; + return V; +} + +#if defined(CUSTOM_WHITE_POINT) +half CINEMA_WHITE; +half CINEMA_BLACK; +#else +static const half CINEMA_WHITE = 48.0; +static const half CINEMA_BLACK = CINEMA_WHITE / 2400.0; +#endif + +static const half ODT_SAT_FACTOR = 0.93; + +// ODT.Academy.RGBmonitor_100nits_dim.a1.0.3 +// ACES 1.0 Output - sRGB + +// +// Output Device Transform - RGB computer monitor +// + +// +// Summary : +// This transform is intended for mapping OCES onto a desktop computer monitor +// typical of those used in motion picture visual effects production. These +// monitors may occasionally be referred to as "sRGB" displays, however, the +// monitor for which this transform is designed does not exactly match the +// specifications in IEC 61966-2-1:1999. +// +// The assumed observer adapted white is D65, and the viewing environment is +// that of a dim surround. +// +// The monitor specified is intended to be more typical of those found in +// visual effects production. +// +// Device Primaries : +// Primaries are those specified in Rec. ITU-R BT.709 +// CIE 1931 chromaticities: x y Y +// Red: 0.64 0.33 +// Green: 0.3 0.6 +// Blue: 0.15 0.06 +// White: 0.3127 0.329 100 cd/m^2 +// +// Display EOTF : +// The reference electro-optical transfer function specified in +// IEC 61966-2-1:1999. +// +// Signal Range: +// This transform outputs full range code values. +// +// Assumed observer adapted white point: +// CIE 1931 chromaticities: x y +// 0.3127 0.329 +// +// Viewing Environment: +// This ODT has a compensation for viewing environment variables more typical +// of those associated with video mastering. +// +half3 ODT_RGBmonitor_100nits_dim(half3 oces) +{ + // OCES to RGB rendering space + half3 rgbPre = mul(AP0_2_AP1_MAT, oces); + + // Apply the tonescale independently in rendering-space RGB + half3 rgbPost; + rgbPost.x = segmented_spline_c9_fwd(rgbPre.x); + rgbPost.y = segmented_spline_c9_fwd(rgbPre.y); + rgbPost.z = segmented_spline_c9_fwd(rgbPre.z); + + // Scale luminance to linear code value + half3 linearCV = Y_2_linCV(rgbPost, CINEMA_WHITE, CINEMA_BLACK); + + // Apply gamma adjustment to compensate for dim surround + linearCV = darkSurround_to_dimSurround(linearCV); + + // Apply desaturation to compensate for luminance difference + //linearCV = mul(ODT_SAT_MAT, linearCV); + linearCV = lerp(dot(linearCV, AP1_RGB2Y).xxx, linearCV, ODT_SAT_FACTOR.xxx); + + // Convert to display primary encoding + // Rendering space RGB to XYZ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + // Apply CAT from ACES white point to assumed observer adapted white point + XYZ = mul(D60_2_D65_CAT, XYZ); + + // CIE XYZ to display primaries + linearCV = mul(XYZ_2_REC709_MAT, XYZ); + + // Handle out-of-gamut values + // Clip values < 0 or > 1 (i.e. projecting outside the display primaries) + linearCV = saturate(linearCV); + + // TODO: Revisit when it is possible to deactivate Unity default framebuffer encoding + // with sRGB opto-electrical transfer function (OETF). + /* + // Encode linear code values with transfer function + half3 outputCV; + // moncurve_r with gamma of 2.4 and offset of 0.055 matches the EOTF found in IEC 61966-2-1:1999 (sRGB) + const half DISPGAMMA = 2.4; + const half OFFSET = 0.055; + outputCV.x = moncurve_r(linearCV.x, DISPGAMMA, OFFSET); + outputCV.y = moncurve_r(linearCV.y, DISPGAMMA, OFFSET); + outputCV.z = moncurve_r(linearCV.z, DISPGAMMA, OFFSET); + + outputCV = linear_to_sRGB(linearCV); + */ + + // Unity already draws to a sRGB target + return linearCV; +} + +// ODT.Academy.RGBmonitor_D60sim_100nits_dim.a1.0.3 +// ACES 1.0 Output - sRGB (D60 sim.) + +// +// Output Device Transform - RGB computer monitor (D60 simulation) +// + +// +// Summary : +// This transform is intended for mapping OCES onto a desktop computer monitor +// typical of those used in motion picture visual effects production. These +// monitors may occasionally be referred to as "sRGB" displays, however, the +// monitor for which this transform is designed does not exactly match the +// specifications in IEC 61966-2-1:1999. +// +// The assumed observer adapted white is D60, and the viewing environment is +// that of a dim surround. +// +// The monitor specified is intended to be more typical of those found in +// visual effects production. +// +// Device Primaries : +// Primaries are those specified in Rec. ITU-R BT.709 +// CIE 1931 chromaticities: x y Y +// Red: 0.64 0.33 +// Green: 0.3 0.6 +// Blue: 0.15 0.06 +// White: 0.3127 0.329 100 cd/m^2 +// +// Display EOTF : +// The reference electro-optical transfer function specified in +// IEC 61966-2-1:1999. +// +// Signal Range: +// This transform outputs full range code values. +// +// Assumed observer adapted white point: +// CIE 1931 chromaticities: x y +// 0.32168 0.33767 +// +// Viewing Environment: +// This ODT has a compensation for viewing environment variables more typical +// of those associated with video mastering. +// +half3 ODT_RGBmonitor_D60sim_100nits_dim(half3 oces) +{ + // OCES to RGB rendering space + half3 rgbPre = mul(AP0_2_AP1_MAT, oces); + + // Apply the tonescale independently in rendering-space RGB + half3 rgbPost; + rgbPost.x = segmented_spline_c9_fwd(rgbPre.x); + rgbPost.y = segmented_spline_c9_fwd(rgbPre.y); + rgbPost.z = segmented_spline_c9_fwd(rgbPre.z); + + // Scale luminance to linear code value + half3 linearCV = Y_2_linCV(rgbPost, CINEMA_WHITE, CINEMA_BLACK); + + // --- Compensate for different white point being darker --- // + // This adjustment is to correct an issue that exists in ODTs where the device + // is calibrated to a white chromaticity other than D60. In order to simulate + // D60 on such devices, unequal code values are sent to the display to achieve + // neutrals at D60. In order to produce D60 on a device calibrated to the DCI + // white point (i.e. equal code values yield CIE x,y chromaticities of 0.314, + // 0.351) the red channel is higher than green and blue to compensate for the + // "greenish" DCI white. This is the correct behavior but it means that as + // highlight increase, the red channel will hit the device maximum first and + // clip, resulting in a chromaticity shift as the green and blue channels + // continue to increase. + // To avoid this clipping error, a slight scale factor is applied to allow the + // ODTs to simulate D60 within the D65 calibration white point. + + // Scale and clamp white to avoid casted highlights due to D60 simulation + const half SCALE = 0.955; + linearCV = min(linearCV, 1.0) * SCALE; + + // Apply gamma adjustment to compensate for dim surround + linearCV = darkSurround_to_dimSurround(linearCV); + + // Apply desaturation to compensate for luminance difference + //linearCV = mul(ODT_SAT_MAT, linearCV); + linearCV = lerp(dot(linearCV, AP1_RGB2Y).xxx, linearCV, ODT_SAT_FACTOR.xxx); + + // Convert to display primary encoding + // Rendering space RGB to XYZ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + // CIE XYZ to display primaries + linearCV = mul(XYZ_2_REC709_MAT, XYZ); + + // Handle out-of-gamut values + // Clip values < 0 or > 1 (i.e. projecting outside the display primaries) + linearCV = saturate(linearCV); + + // TODO: Revisit when it is possible to deactivate Unity default framebuffer encoding + // with sRGB opto-electrical transfer function (OETF). + /* + // Encode linear code values with transfer function + half3 outputCV; + // moncurve_r with gamma of 2.4 and offset of 0.055 matches the EOTF found in IEC 61966-2-1:1999 (sRGB) + const half DISPGAMMA = 2.4; + const half OFFSET = 0.055; + outputCV.x = moncurve_r(linearCV.x, DISPGAMMA, OFFSET); + outputCV.y = moncurve_r(linearCV.y, DISPGAMMA, OFFSET); + outputCV.z = moncurve_r(linearCV.z, DISPGAMMA, OFFSET); + + outputCV = linear_to_sRGB(linearCV); + */ + + // Unity already draws to a sRGB target + return linearCV; +} + +// ODT.Academy.Rec709_100nits_dim.a1.0.3 +// ACES 1.0 Output - Rec.709 + +// +// Output Device Transform - Rec709 +// + +// +// Summary : +// This transform is intended for mapping OCES onto a Rec.709 broadcast monitor +// that is calibrated to a D65 white point at 100 cd/m^2. The assumed observer +// adapted white is D65, and the viewing environment is a dim surround. +// +// A possible use case for this transform would be HDTV/video mastering. +// +// Device Primaries : +// Primaries are those specified in Rec. ITU-R BT.709 +// CIE 1931 chromaticities: x y Y +// Red: 0.64 0.33 +// Green: 0.3 0.6 +// Blue: 0.15 0.06 +// White: 0.3127 0.329 100 cd/m^2 +// +// Display EOTF : +// The reference electro-optical transfer function specified in +// Rec. ITU-R BT.1886. +// +// Signal Range: +// By default, this transform outputs full range code values. If instead a +// SMPTE "legal" signal is desired, there is a runtime flag to output +// SMPTE legal signal. In ctlrender, this can be achieved by appending +// '-param1 legalRange 1' after the '-ctl odt.ctl' string. +// +// Assumed observer adapted white point: +// CIE 1931 chromaticities: x y +// 0.3127 0.329 +// +// Viewing Environment: +// This ODT has a compensation for viewing environment variables more typical +// of those associated with video mastering. +// +half3 ODT_Rec709_100nits_dim(half3 oces) +{ + // OCES to RGB rendering space + half3 rgbPre = mul(AP0_2_AP1_MAT, oces); + + // Apply the tonescale independently in rendering-space RGB + half3 rgbPost; + rgbPost.x = segmented_spline_c9_fwd(rgbPre.x); + rgbPost.y = segmented_spline_c9_fwd(rgbPre.y); + rgbPost.z = segmented_spline_c9_fwd(rgbPre.z); + + // Scale luminance to linear code value + half3 linearCV = Y_2_linCV(rgbPost, CINEMA_WHITE, CINEMA_BLACK); + + // Apply gamma adjustment to compensate for dim surround + linearCV = darkSurround_to_dimSurround(linearCV); + + // Apply desaturation to compensate for luminance difference + //linearCV = mul(ODT_SAT_MAT, linearCV); + linearCV = lerp(dot(linearCV, AP1_RGB2Y).xxx, linearCV, ODT_SAT_FACTOR.xxx); + + // Convert to display primary encoding + // Rendering space RGB to XYZ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + // Apply CAT from ACES white point to assumed observer adapted white point + XYZ = mul(D60_2_D65_CAT, XYZ); + + // CIE XYZ to display primaries + linearCV = mul(XYZ_2_REC709_MAT, XYZ); + + // Handle out-of-gamut values + // Clip values < 0 or > 1 (i.e. projecting outside the display primaries) + linearCV = saturate(linearCV); + + // Encode linear code values with transfer function + const half DISPGAMMA = 2.4; + const half L_W = 1.0; + const half L_B = 0.0; + half3 outputCV = linear_to_bt1886(linearCV, DISPGAMMA, L_W, L_B); + + // TODO: Implement support for legal range. + + // NOTE: Unity framebuffer encoding is encoded with sRGB opto-electrical transfer function (OETF) + // by default which will result in double perceptual encoding, thus for now if one want to use + // this ODT, he needs to decode its output with sRGB electro-optical transfer function (EOTF) to + // compensate for Unity default behaviour. + + return outputCV; +} + +// ODT.Academy.Rec709_D60sim_100nits_dim.a1.0.3 +// ACES 1.0 Output - Rec.709 (D60 sim.) + +// +// Output Device Transform - Rec709 (D60 simulation) +// + +// +// Summary : +// This transform is intended for mapping OCES onto a Rec.709 broadcast monitor +// that is calibrated to a D65 white point at 100 cd/m^2. The assumed observer +// adapted white is D60, and the viewing environment is a dim surround. +// +// A possible use case for this transform would be cinema "soft-proofing". +// +// Device Primaries : +// Primaries are those specified in Rec. ITU-R BT.709 +// CIE 1931 chromaticities: x y Y +// Red: 0.64 0.33 +// Green: 0.3 0.6 +// Blue: 0.15 0.06 +// White: 0.3127 0.329 100 cd/m^2 +// +// Display EOTF : +// The reference electro-optical transfer function specified in +// Rec. ITU-R BT.1886. +// +// Signal Range: +// By default, this transform outputs full range code values. If instead a +// SMPTE "legal" signal is desired, there is a runtime flag to output +// SMPTE legal signal. In ctlrender, this can be achieved by appending +// '-param1 legalRange 1' after the '-ctl odt.ctl' string. +// +// Assumed observer adapted white point: +// CIE 1931 chromaticities: x y +// 0.32168 0.33767 +// +// Viewing Environment: +// This ODT has a compensation for viewing environment variables more typical +// of those associated with video mastering. +// +half3 ODT_Rec709_D60sim_100nits_dim(half3 oces) +{ + // OCES to RGB rendering space + half3 rgbPre = mul(AP0_2_AP1_MAT, oces); + + // Apply the tonescale independently in rendering-space RGB + half3 rgbPost; + rgbPost.x = segmented_spline_c9_fwd(rgbPre.x); + rgbPost.y = segmented_spline_c9_fwd(rgbPre.y); + rgbPost.z = segmented_spline_c9_fwd(rgbPre.z); + + // Scale luminance to linear code value + half3 linearCV = Y_2_linCV(rgbPost, CINEMA_WHITE, CINEMA_BLACK); + + // --- Compensate for different white point being darker --- // + // This adjustment is to correct an issue that exists in ODTs where the device + // is calibrated to a white chromaticity other than D60. In order to simulate + // D60 on such devices, unequal code values must be sent to the display to achieve + // the chromaticities of D60. More specifically, in order to produce D60 on a device + // calibrated to a D65 white point (i.e. equal code values yield CIE x,y + // chromaticities of 0.3127, 0.329) the red channel must be slightly higher than + // that of green and blue in order to compensate for the relatively more "blue-ish" + // D65 white. This unequalness of color channels is the correct behavior but it + // means that as neutral highlights increase, the red channel will hit the + // device maximum first and clip, resulting in a small chromaticity shift as the + // green and blue channels continue to increase to their maximums. + // To avoid this clipping error, a slight scale factor is applied to allow the + // ODTs to simulate D60 within the D65 calibration white point. + + // Scale and clamp white to avoid casted highlights due to D60 simulation + const half SCALE = 0.955; + linearCV = min(linearCV, 1.0) * SCALE; + + // Apply gamma adjustment to compensate for dim surround + linearCV = darkSurround_to_dimSurround(linearCV); + + // Apply desaturation to compensate for luminance difference + //linearCV = mul(ODT_SAT_MAT, linearCV); + linearCV = lerp(dot(linearCV, AP1_RGB2Y).xxx, linearCV, ODT_SAT_FACTOR.xxx); + + // Convert to display primary encoding + // Rendering space RGB to XYZ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + // CIE XYZ to display primaries + linearCV = mul(XYZ_2_REC709_MAT, XYZ); + + // Handle out-of-gamut values + // Clip values < 0 or > 1 (i.e. projecting outside the display primaries) + linearCV = saturate(linearCV); + + // Encode linear code values with transfer function + const half DISPGAMMA = 2.4; + const half L_W = 1.0; + const half L_B = 0.0; + half3 outputCV = linear_to_bt1886(linearCV, DISPGAMMA, L_W, L_B); + + // TODO: Implement support for legal range. + + // NOTE: Unity framebuffer encoding is encoded with sRGB opto-electrical transfer function (OETF) + // by default which will result in double perceptual encoding, thus for now if one want to use + // this ODT, he needs to decode its output with sRGB electro-optical transfer function (EOTF) to + // compensate for Unity default behaviour. + + return outputCV; +} + +// ODT.Academy.Rec2020_100nits_dim.a1.0.3 +// ACES 1.0 Output - Rec.2020 + +// +// Output Device Transform - Rec2020 +// + +// +// Summary : +// This transform is intended for mapping OCES onto a Rec.2020 broadcast +// monitor that is calibrated to a D65 white point at 100 cd/m^2. The assumed +// observer adapted white is D65, and the viewing environment is that of a dim +// surround. +// +// A possible use case for this transform would be UHDTV/video mastering. +// +// Device Primaries : +// Primaries are those specified in Rec. ITU-R BT.2020 +// CIE 1931 chromaticities: x y Y +// Red: 0.708 0.292 +// Green: 0.17 0.797 +// Blue: 0.131 0.046 +// White: 0.3127 0.329 100 cd/m^2 +// +// Display EOTF : +// The reference electro-optical transfer function specified in +// Rec. ITU-R BT.1886. +// +// Signal Range: +// By default, this transform outputs full range code values. If instead a +// SMPTE "legal" signal is desired, there is a runtime flag to output +// SMPTE legal signal. In ctlrender, this can be achieved by appending +// '-param1 legalRange 1' after the '-ctl odt.ctl' string. +// +// Assumed observer adapted white point: +// CIE 1931 chromaticities: x y +// 0.3127 0.329 +// +// Viewing Environment: +// This ODT has a compensation for viewing environment variables more typical +// of those associated with video mastering. +// + +half3 ODT_Rec2020_100nits_dim(half3 oces) +{ + // OCES to RGB rendering space + half3 rgbPre = mul(AP0_2_AP1_MAT, oces); + + // Apply the tonescale independently in rendering-space RGB + half3 rgbPost; + rgbPost.x = segmented_spline_c9_fwd(rgbPre.x); + rgbPost.y = segmented_spline_c9_fwd(rgbPre.y); + rgbPost.z = segmented_spline_c9_fwd(rgbPre.z); + + // Scale luminance to linear code value + half3 linearCV = Y_2_linCV(rgbPost, CINEMA_WHITE, CINEMA_BLACK); + + // Apply gamma adjustment to compensate for dim surround + linearCV = darkSurround_to_dimSurround(linearCV); + + // Apply desaturation to compensate for luminance difference + //linearCV = mul(ODT_SAT_MAT, linearCV); + linearCV = lerp(dot(linearCV, AP1_RGB2Y).xxx, linearCV, ODT_SAT_FACTOR.xxx); + + // Convert to display primary encoding + // Rendering space RGB to XYZ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + // Apply CAT from ACES white point to assumed observer adapted white point + XYZ = mul(D60_2_D65_CAT, XYZ); + + // CIE XYZ to display primaries + linearCV = mul(XYZ_2_REC2020_MAT, XYZ); + + // Handle out-of-gamut values + // Clip values < 0 or > 1 (i.e. projecting outside the display primaries) + linearCV = saturate(linearCV); + + // Encode linear code values with transfer function + const half DISPGAMMA = 2.4; + const half L_W = 1.0; + const half L_B = 0.0; + half3 outputCV = linear_to_bt1886(linearCV, DISPGAMMA, L_W, L_B); + + // TODO: Implement support for legal range. + + // NOTE: Unity framebuffer encoding is encoded with sRGB opto-electrical transfer function (OETF) + // by default which will result in double perceptual encoding, thus for now if one want to use + // this ODT, he needs to decode its output with sRGB electro-optical transfer function (EOTF) to + // compensate for Unity default behaviour. + + return outputCV; +} + +// ODT.Academy.P3DCI_48nits.a1.0.3 +// ACES 1.0 Output - P3-DCI + +// +// Output Device Transform - P3DCI (D60 Simulation) +// + +// +// Summary : +// This transform is intended for mapping OCES onto a P3 digital cinema +// projector that is calibrated to a DCI white point at 48 cd/m^2. The assumed +// observer adapted white is D60, and the viewing environment is that of a dark +// theater. +// +// Device Primaries : +// CIE 1931 chromaticities: x y Y +// Red: 0.68 0.32 +// Green: 0.265 0.69 +// Blue: 0.15 0.06 +// White: 0.314 0.351 48 cd/m^2 +// +// Display EOTF : +// Gamma: 2.6 +// +// Assumed observer adapted white point: +// CIE 1931 chromaticities: x y +// 0.32168 0.33767 +// +// Viewing Environment: +// Environment specified in SMPTE RP 431-2-2007 +// +half3 ODT_P3DCI_48nits(half3 oces) +{ + // OCES to RGB rendering space + half3 rgbPre = mul(AP0_2_AP1_MAT, oces); + + // Apply the tonescale independently in rendering-space RGB + half3 rgbPost; + rgbPost.x = segmented_spline_c9_fwd(rgbPre.x); + rgbPost.y = segmented_spline_c9_fwd(rgbPre.y); + rgbPost.z = segmented_spline_c9_fwd(rgbPre.z); + + // Scale luminance to linear code value + half3 linearCV = Y_2_linCV(rgbPost, CINEMA_WHITE, CINEMA_BLACK); + + // --- Compensate for different white point being darker --- // + // This adjustment is to correct an issue that exists in ODTs where the device + // is calibrated to a white chromaticity other than D60. In order to simulate + // D60 on such devices, unequal code values are sent to the display to achieve + // neutrals at D60. In order to produce D60 on a device calibrated to the DCI + // white point (i.e. equal code values yield CIE x,y chromaticities of 0.314, + // 0.351) the red channel is higher than green and blue to compensate for the + // "greenish" DCI white. This is the correct behavior but it means that as + // highlight increase, the red channel will hit the device maximum first and + // clip, resulting in a chromaticity shift as the green and blue channels + // continue to increase. + // To avoid this clipping error, a slight scale factor is applied to allow the + // ODTs to simulate D60 within the D65 calibration white point. However, the + // magnitude of the scale factor required for the P3DCI ODT was considered too + // large. Therefore, the scale factor was reduced and the additional required + // compression was achieved via a reshaping of the highlight rolloff in + // conjunction with the scale. The shape of this rolloff was determined + // throught subjective experiments and deemed to best reproduce the + // "character" of the highlights in the P3D60 ODT. + + // Roll off highlights to avoid need for as much scaling + const half NEW_WHT = 0.918; + const half ROLL_WIDTH = 0.5; + linearCV.x = roll_white_fwd(linearCV.x, NEW_WHT, ROLL_WIDTH); + linearCV.y = roll_white_fwd(linearCV.y, NEW_WHT, ROLL_WIDTH); + linearCV.z = roll_white_fwd(linearCV.z, NEW_WHT, ROLL_WIDTH); + + // Scale and clamp white to avoid casted highlights due to D60 simulation + const half SCALE = 0.96; + linearCV = min(linearCV, NEW_WHT) * SCALE; + + // Convert to display primary encoding + // Rendering space RGB to XYZ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + // CIE XYZ to display primaries + linearCV = mul(XYZ_2_DCIP3_MAT, XYZ); + + // Handle out-of-gamut values + // Clip values < 0 or > 1 (i.e. projecting outside the display primaries) + linearCV = saturate(linearCV); + + // Encode linear code values with transfer function + const half DISPGAMMA = 2.6; + half3 outputCV = pow(linearCV, 1.0 / DISPGAMMA); + + // NOTE: Unity framebuffer encoding is encoded with sRGB opto-electrical transfer function (OETF) + // by default which will result in double perceptual encoding, thus for now if one want to use + // this ODT, he needs to decode its output with sRGB electro-optical transfer function (EOTF) to + // compensate for Unity default behaviour. + + return outputCV; +} + +#endif // __ACES__ diff --git a/Assets/PostProcessing/Resources/Shaders/ACES.cginc.meta b/Assets/PostProcessing/Resources/Shaders/ACES.cginc.meta new file mode 100644 index 0000000..6abc9b0 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ACES.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b8d56fc3449f426408c23c723b58d7b5 +timeCreated: 1460363486 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.cginc b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.cginc new file mode 100644 index 0000000..42f4bcf --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.cginc @@ -0,0 +1,500 @@ +// Upgrade NOTE: commented out 'float4x4 _WorldToCamera', a built-in variable +// Upgrade NOTE: replaced '_WorldToCamera' with 'unity_WorldToCamera' + +#ifndef __AMBIENT_OCCLUSION__ +#define __AMBIENT_OCCLUSION__ + +#include "UnityCG.cginc" +#include "Common.cginc" + +// -------- +// Options for further customization +// -------- + +// By default, a 5-tap Gaussian with the linear sampling technique is used +// in the bilateral noise filter. It can be replaced with a 7-tap Gaussian +// with adaptive sampling by enabling the macro below. Although the +// differences are not noticeable in most cases, it may provide preferable +// results with some special usage (e.g. NPR without textureing). +// #define BLUR_HIGH_QUALITY + +// By default, a fixed sampling pattern is used in the AO estimator. Although +// this gives preferable results in most cases, a completely random sampling +// pattern could give aesthetically better results. Disable the macro below +// to use such a random pattern instead of the fixed one. +#define FIX_SAMPLING_PATTERN + +// The SampleNormal function normalizes samples from G-buffer because +// they're possibly unnormalized. We can eliminate this if it can be said +// that there is no wrong shader that outputs unnormalized normals. +// #define VALIDATE_NORMALS + +// The constant below determines the contrast of occlusion. This allows +// users to control over/under occlusion. At the moment, this is not exposed +// to the editor because it�s rarely useful. +static const float kContrast = 0.6; + +// The constant below controls the geometry-awareness of the bilateral +// filter. The higher value, the more sensitive it is. +static const float kGeometryCoeff = 0.8; + +// The constants below are used in the AO estimator. Beta is mainly used +// for suppressing self-shadowing noise, and Epsilon is used to prevent +// calculation underflow. See the paper (Morgan 2011 http://goo.gl/2iz3P) +// for further details of these constants. +static const float kBeta = 0.002; + +// -------- + +// System built-in variables +sampler2D _CameraGBufferTexture2; +sampler2D_float _CameraDepthTexture; +sampler2D _CameraDepthNormalsTexture; + +float4 _CameraDepthTexture_ST; + +// Sample count +#if !defined(SHADER_API_GLES) +int _SampleCount; +#else +// GLES2: In many cases, dynamic looping is not supported. +static const int _SampleCount = 3; +#endif + +// Source texture properties +sampler2D _OcclusionTexture; +float4 _OcclusionTexture_TexelSize; + +// Other parameters +half _Intensity; +float _Radius; +float _Downsample; +float3 _FogParams; // x: density, y: start, z: end + +// Accessors for packed AO/normal buffer +fixed4 PackAONormal(fixed ao, fixed3 n) +{ + return fixed4(ao, n * 0.5 + 0.5); +} + +fixed GetPackedAO(fixed4 p) +{ + return p.r; +} + +fixed3 GetPackedNormal(fixed4 p) +{ + return p.gba * 2.0 - 1.0; +} + +// Boundary check for depth sampler +// (returns a very large value if it lies out of bounds) +float CheckBounds(float2 uv, float d) +{ + float ob = any(uv < 0) + any(uv > 1); +#if defined(UNITY_REVERSED_Z) + ob += (d <= 0.00001); +#else + ob += (d >= 0.99999); +#endif + return ob * 1e8; +} + +// Depth/normal sampling functions +float SampleDepth(float2 uv) +{ +#if defined(SOURCE_GBUFFER) || defined(SOURCE_DEPTH) + float d = LinearizeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv)); +#else + float4 cdn = tex2D(_CameraDepthNormalsTexture, uv); + float d = DecodeFloatRG(cdn.zw); +#endif + return d * _ProjectionParams.z + CheckBounds(uv, d); +} + +float3 SampleNormal(float2 uv) +{ +#if defined(SOURCE_GBUFFER) + float3 norm = tex2D(_CameraGBufferTexture2, uv).xyz; + norm = norm * 2 - any(norm); // gets (0,0,0) when norm == 0 + norm = mul((float3x3)unity_WorldToCamera, norm); +#if defined(VALIDATE_NORMALS) + norm = normalize(norm); +#endif + return norm; +#else + float4 cdn = tex2D(_CameraDepthNormalsTexture, uv); + return DecodeViewNormalStereo(cdn) * float3(1.0, 1.0, -1.0); +#endif +} + +float SampleDepthNormal(float2 uv, out float3 normal) +{ +#if defined(SOURCE_GBUFFER) || defined(SOURCE_DEPTH) + normal = SampleNormal(uv); + return SampleDepth(uv); +#else + float4 cdn = tex2D(_CameraDepthNormalsTexture, uv); + normal = DecodeViewNormalStereo(cdn) * float3(1.0, 1.0, -1.0); + float d = DecodeFloatRG(cdn.zw); + return d * _ProjectionParams.z + CheckBounds(uv, d); +#endif +} + +// Normal vector comparer (for geometry-aware weighting) +half CompareNormal(half3 d1, half3 d2) +{ + return smoothstep(kGeometryCoeff, 1.0, dot(d1, d2)); +} + +// Common vertex shader +struct VaryingsMultitex +{ + float4 pos : SV_POSITION; + half2 uv : TEXCOORD0; // Original UV + half2 uv01 : TEXCOORD1; // Alternative UV (supports v-flip case) + half2 uvSPR : TEXCOORD2; // Single pass stereo rendering UV +}; + +VaryingsMultitex VertMultitex(AttributesDefault v) +{ + half2 uvAlt = v.texcoord.xy; + +#if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0.0) uvAlt.y = 1.0 - uvAlt.y; +#endif + + VaryingsMultitex o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.uv01 = uvAlt; + o.uvSPR = UnityStereoTransformScreenSpaceTex(uvAlt); + + return o; +} + +// Trigonometric function utility +float2 CosSin(float theta) +{ + float sn, cs; + sincos(theta, sn, cs); + return float2(cs, sn); +} + +// Pseudo random number generator with 2D coordinates +float UVRandom(float u, float v) +{ + float f = dot(float2(12.9898, 78.233), float2(u, v)); + return frac(43758.5453 * sin(f)); +} + +// Check if the camera is perspective. +// (returns 1.0 when orthographic) +float CheckPerspective(float x) +{ + return lerp(x, 1.0, unity_OrthoParams.w); +} + +// Reconstruct view-space position from UV and depth. +// p11_22 = (unity_CameraProjection._11, unity_CameraProjection._22) +// p13_31 = (unity_CameraProjection._13, unity_CameraProjection._23) +float3 ReconstructViewPos(float2 uv, float depth, float2 p11_22, float2 p13_31) +{ + return float3((uv * 2.0 - 1.0 - p13_31) / p11_22 * CheckPerspective(depth), depth); +} + +// Sample point picker +float3 PickSamplePoint(float2 uv, float index) +{ + // Uniformaly distributed points on a unit sphere http://goo.gl/X2F1Ho +#if defined(FIX_SAMPLING_PATTERN) + float gn = GradientNoise(uv * _Downsample); + // FIXME: This was added to avoid a NVIDIA driver issue. + // vvvvvvvvvvvv + float u = frac(UVRandom(0.0, index + uv.x * 1e-10) + gn) * 2.0 - 1.0; + float theta = (UVRandom(1.0, index + uv.x * 1e-10) + gn) * UNITY_PI_2; +#else + float u = UVRandom(uv.x + _Time.x, uv.y + index) * 2.0 - 1.0; + float theta = UVRandom(-uv.x - _Time.x, uv.y + index) * UNITY_PI_2; +#endif + float3 v = float3(CosSin(theta) * sqrt(1.0 - u * u), u); + // Make them distributed between [0, _Radius] + float l = sqrt((index + 1.0) / _SampleCount) * _Radius; + return v * l; +} + +// Fog handling in forward +half ComputeFog(float z) +{ + half fog = 0.0; +#if FOG_LINEAR + fog = (_FogParams.z - z) / (_FogParams.z - _FogParams.y); +#elif FOG_EXP + fog = exp2(-_FogParams.x * z); +#else // FOG_EXP2 + fog = _FogParams.x * z; + fog = exp2(-fog * fog); +#endif + return saturate(fog); +} + +float ComputeDistance(float depth) +{ + float dist = depth * _ProjectionParams.z; + dist -= _ProjectionParams.y; + return dist; +} + +// +// Distance-based AO estimator based on Morgan 2011 http://goo.gl/2iz3P +// +half4 FragAO(VaryingsMultitex i) : SV_Target +{ + float2 uv = i.uv; + + // Parameters used in coordinate conversion + float3x3 proj = (float3x3)unity_CameraProjection; + float2 p11_22 = float2(unity_CameraProjection._11, unity_CameraProjection._22); + float2 p13_31 = float2(unity_CameraProjection._13, unity_CameraProjection._23); + + // View space normal and depth + float3 norm_o; + float depth_o = SampleDepthNormal(UnityStereoScreenSpaceUVAdjust(uv, _CameraDepthTexture_ST), norm_o); + +#if defined(SOURCE_DEPTHNORMALS) + // Offset the depth value to avoid precision error. + // (depth in the DepthNormals mode has only 16-bit precision) + depth_o -= _ProjectionParams.z / 65536; +#endif + + // Reconstruct the view-space position. + float3 vpos_o = ReconstructViewPos(i.uv01, depth_o, p11_22, p13_31); + + float ao = 0.0; + + for (int s = 0; s < _SampleCount; s++) + { + // Sample point +#if defined(SHADER_API_D3D11) + // This 'floor(1.0001 * s)' operation is needed to avoid a NVidia + // shader issue. This issue is only observed on DX11. + float3 v_s1 = PickSamplePoint(uv, floor(1.0001 * s)); +#else + float3 v_s1 = PickSamplePoint(uv, s); +#endif + v_s1 = faceforward(v_s1, -norm_o, v_s1); + float3 vpos_s1 = vpos_o + v_s1; + + // Reproject the sample point + float3 spos_s1 = mul(proj, vpos_s1); + float2 uv_s1_01 = (spos_s1.xy / CheckPerspective(vpos_s1.z) + 1.0) * 0.5; + + // Depth at the sample point + float depth_s1 = SampleDepth(UnityStereoScreenSpaceUVAdjust(uv_s1_01, _CameraDepthTexture_ST)); + + // Relative position of the sample point + float3 vpos_s2 = ReconstructViewPos(uv_s1_01, depth_s1, p11_22, p13_31); + float3 v_s2 = vpos_s2 - vpos_o; + + // Estimate the obscurance value + float a1 = max(dot(v_s2, norm_o) - kBeta * depth_o, 0.0); + float a2 = dot(v_s2, v_s2) + EPSILON; + ao += a1 / a2; + } + + ao *= _Radius; // intensity normalization + + // Apply other parameters. + ao = pow(ao * _Intensity / _SampleCount, kContrast); + + // Apply fog when enabled (forward-only) +#if !FOG_OFF + float d = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv)); + d = ComputeDistance(d); + ao *= ComputeFog(d); +#endif + + return PackAONormal(ao, norm_o); +} + +// Geometry-aware separable bilateral filter +half4 FragBlur(VaryingsMultitex i) : SV_Target +{ +#if defined(BLUR_HORIZONTAL) + // Horizontal pass: Always use 2 texels interval to match to + // the dither pattern. + float2 delta = float2(_MainTex_TexelSize.x * 2.0, 0.0); +#else + // Vertical pass: Apply _Downsample to match to the dither + // pattern in the original occlusion buffer. + float2 delta = float2(0.0, _MainTex_TexelSize.y / _Downsample * 2.0); +#endif + +#if defined(BLUR_HIGH_QUALITY) + + // High quality 7-tap Gaussian with adaptive sampling + + fixed4 p0 = tex2D(_MainTex, i.uvSPR); + fixed4 p1a = tex2D(_MainTex, i.uvSPR - delta); + fixed4 p1b = tex2D(_MainTex, i.uvSPR + delta); + fixed4 p2a = tex2D(_MainTex, i.uvSPR - delta * 2.0); + fixed4 p2b = tex2D(_MainTex, i.uvSPR + delta * 2.0); + fixed4 p3a = tex2D(_MainTex, i.uvSPR - delta * 3.2307692308); + fixed4 p3b = tex2D(_MainTex, i.uvSPR + delta * 3.2307692308); + +#if defined(BLUR_SAMPLE_CENTER_NORMAL) + fixed3 n0 = SampleNormal(i.uvSPR); +#else + fixed3 n0 = GetPackedNormal(p0); +#endif + + half w0 = 0.37004405286; + half w1a = CompareNormal(n0, GetPackedNormal(p1a)) * 0.31718061674; + half w1b = CompareNormal(n0, GetPackedNormal(p1b)) * 0.31718061674; + half w2a = CompareNormal(n0, GetPackedNormal(p2a)) * 0.19823788546; + half w2b = CompareNormal(n0, GetPackedNormal(p2b)) * 0.19823788546; + half w3a = CompareNormal(n0, GetPackedNormal(p3a)) * 0.11453744493; + half w3b = CompareNormal(n0, GetPackedNormal(p3b)) * 0.11453744493; + + half s; + s = GetPackedAO(p0) * w0; + s += GetPackedAO(p1a) * w1a; + s += GetPackedAO(p1b) * w1b; + s += GetPackedAO(p2a) * w2a; + s += GetPackedAO(p2b) * w2b; + s += GetPackedAO(p3a) * w3a; + s += GetPackedAO(p3b) * w3b; + + s /= w0 + w1a + w1b + w2a + w2b + w3a + w3b; + +#else + + // Fater 5-tap Gaussian with linear sampling + fixed4 p0 = tex2D(_MainTex, i.uvSPR); + fixed4 p1a = tex2D(_MainTex, i.uvSPR - delta * 1.3846153846); + fixed4 p1b = tex2D(_MainTex, i.uvSPR + delta * 1.3846153846); + fixed4 p2a = tex2D(_MainTex, i.uvSPR - delta * 3.2307692308); + fixed4 p2b = tex2D(_MainTex, i.uvSPR + delta * 3.2307692308); + +#if defined(BLUR_SAMPLE_CENTER_NORMAL) + fixed3 n0 = SampleNormal(i.uvSPR); +#else + fixed3 n0 = GetPackedNormal(p0); +#endif + + half w0 = 0.2270270270; + half w1a = CompareNormal(n0, GetPackedNormal(p1a)) * 0.3162162162; + half w1b = CompareNormal(n0, GetPackedNormal(p1b)) * 0.3162162162; + half w2a = CompareNormal(n0, GetPackedNormal(p2a)) * 0.0702702703; + half w2b = CompareNormal(n0, GetPackedNormal(p2b)) * 0.0702702703; + + half s; + s = GetPackedAO(p0) * w0; + s += GetPackedAO(p1a) * w1a; + s += GetPackedAO(p1b) * w1b; + s += GetPackedAO(p2a) * w2a; + s += GetPackedAO(p2b) * w2b; + + s /= w0 + w1a + w1b + w2a + w2b; + +#endif + + return PackAONormal(s, n0); +} + +// Gamma encoding (only needed in gamma lighting mode) +half EncodeAO(half x) +{ + half x_g = 1.0 - max(1.055 * pow(1.0 - saturate(x), 0.416666667) - 0.055, 0.0); + // ColorSpaceLuminance.w == 0 (gamma) or 1 (linear) + return lerp(x_g, x, unity_ColorSpaceLuminance.w); +} + +// Geometry-aware bilateral filter (single pass/small kernel) +half BlurSmall(sampler2D tex, float2 uv, float2 delta) +{ + fixed4 p0 = tex2D(tex, uv); + fixed4 p1 = tex2D(tex, uv + float2(-delta.x, -delta.y)); + fixed4 p2 = tex2D(tex, uv + float2(+delta.x, -delta.y)); + fixed4 p3 = tex2D(tex, uv + float2(-delta.x, +delta.y)); + fixed4 p4 = tex2D(tex, uv + float2(+delta.x, +delta.y)); + + fixed3 n0 = GetPackedNormal(p0); + + half w0 = 1.0; + half w1 = CompareNormal(n0, GetPackedNormal(p1)); + half w2 = CompareNormal(n0, GetPackedNormal(p2)); + half w3 = CompareNormal(n0, GetPackedNormal(p3)); + half w4 = CompareNormal(n0, GetPackedNormal(p4)); + + half s; + s = GetPackedAO(p0) * w0; + s += GetPackedAO(p1) * w1; + s += GetPackedAO(p2) * w2; + s += GetPackedAO(p3) * w3; + s += GetPackedAO(p4) * w4; + + return s / (w0 + w1 + w2 + w3 + w4); +} + +// Final composition shader +half4 FragComposition(VaryingsMultitex i) : SV_Target +{ + float2 delta = _MainTex_TexelSize.xy / _Downsample; + half ao = BlurSmall(_OcclusionTexture, i.uvSPR, delta); + half4 color = tex2D(_MainTex, i.uvSPR); + +#if !defined(DEBUG_COMPOSITION) + color.rgb *= 1.0 - EncodeAO(ao); +#else + color.rgb = 1.0 - EncodeAO(ao); +#endif + + return color; +} + +// Final composition shader (ambient-only mode) +VaryingsDefault VertCompositionGBuffer(AttributesDefault v) +{ + VaryingsDefault o; + o.pos = v.vertex; +#if UNITY_UV_STARTS_AT_TOP + o.uv = v.texcoord.xy * float2(1.0, -1.0) + float2(0.0, 1.0); +#else + o.uv = v.texcoord.xy; +#endif + o.uvSPR = UnityStereoTransformScreenSpaceTex(o.uv); + return o; +} + +#if !SHADER_API_GLES // excluding the MRT pass under GLES2 + +struct CompositionOutput +{ + half4 gbuffer0 : SV_Target0; + half4 gbuffer3 : SV_Target1; +}; + +CompositionOutput FragCompositionGBuffer(VaryingsDefault i) +{ + // Workaround: _OcclusionTexture_Texelsize hasn't been set properly + // for some reasons. Use _ScreenParams instead. + float2 delta = (_ScreenParams.zw - 1.0) / _Downsample; + half ao = BlurSmall(_OcclusionTexture, i.uvSPR, delta); + + CompositionOutput o; + o.gbuffer0 = half4(0.0, 0.0, 0.0, ao); + o.gbuffer3 = half4((half3)EncodeAO(ao), 0.0); + return o; +} + +#else + +fixed4 FragCompositionGBuffer(VaryingsDefault i) : SV_Target0 +{ + return 0.0; +} + +#endif + +#endif // __AMBIENT_OCCLUSION__ diff --git a/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.cginc.meta b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.cginc.meta new file mode 100644 index 0000000..3574f9c --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 447591ee3d9d4204899be5fe25968ea0 +timeCreated: 1473323470 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.shader b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.shader new file mode 100644 index 0000000..40bdf7b --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.shader @@ -0,0 +1,119 @@ +Shader "Hidden/Post FX/Ambient Occlusion" +{ + CGINCLUDE + + #pragma target 3.0 + + ENDCG + + SubShader + { + ZTest Always Cull Off ZWrite Off + + // 0: Occlusion estimation with CameraDepthTexture + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragAO + #pragma multi_compile FOG_OFF FOG_LINEAR FOG_EXP FOG_EXP2 + #define SOURCE_DEPTH + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 1: Occlusion estimation with CameraDepthNormalsTexture + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragAO + #pragma multi_compile FOG_OFF FOG_LINEAR FOG_EXP FOG_EXP2 + #define SOURCE_DEPTHNORMALS + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 2: Occlusion estimation with G-Buffer + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragAO + #pragma multi_compile FOG_OFF FOG_LINEAR FOG_EXP FOG_EXP2 + #define SOURCE_GBUFFER + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 3: Separable blur (horizontal pass) with CameraDepthNormalsTexture + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragBlur + #define SOURCE_DEPTHNORMALS + #define BLUR_HORIZONTAL + #define BLUR_SAMPLE_CENTER_NORMAL + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 4: Separable blur (horizontal pass) with G-Buffer + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragBlur + #define SOURCE_GBUFFER + #define BLUR_HORIZONTAL + #define BLUR_SAMPLE_CENTER_NORMAL + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 5: Separable blur (vertical pass) + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragBlur + #define BLUR_VERTICAL + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 6: Final composition + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragComposition + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 7: Final composition (ambient only mode) + Pass + { + Blend Zero OneMinusSrcColor, Zero OneMinusSrcAlpha + + CGPROGRAM + #pragma vertex VertCompositionGBuffer + #pragma fragment FragCompositionGBuffer + #include "AmbientOcclusion.cginc" + ENDCG + } + + // 8: Debug visualization + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragComposition + #define DEBUG_COMPOSITION + #include "AmbientOcclusion.cginc" + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.shader.meta b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.shader.meta new file mode 100644 index 0000000..abbbc87 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/AmbientOcclusion.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e881ae5627d1cc84395303acfbca6fb2 +timeCreated: 1462280790 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/Blit.shader b/Assets/PostProcessing/Resources/Shaders/Blit.shader new file mode 100644 index 0000000..3a6c07f --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Blit.shader @@ -0,0 +1,49 @@ +Shader "Hidden/Post FX/Blit" +{ + Properties + { + _MainTex("Main Texture", 2D) = "white" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + #include "Common.cginc" + + struct Varyings + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + Varyings VertBlit(AttributesDefault v) + { + Varyings o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST); + return o; + } + + half4 FragBlit(Varyings i) : SV_Target + { + half4 col = tex2D(_MainTex, i.uv); + return col; + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + Pass + { + CGPROGRAM + + #pragma vertex VertBlit + #pragma fragment FragBlit + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/Blit.shader.meta b/Assets/PostProcessing/Resources/Shaders/Blit.shader.meta new file mode 100644 index 0000000..99f9415 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Blit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7d89469544dfa214eabdbf37fca76f40 +timeCreated: 1474297975 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/Bloom.cginc b/Assets/PostProcessing/Resources/Shaders/Bloom.cginc new file mode 100644 index 0000000..6e1086a --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Bloom.cginc @@ -0,0 +1,86 @@ +#ifndef __BLOOM__ +#define __BLOOM__ + +#include "Common.cginc" + +// Brightness function +half Brightness(half3 c) +{ + return Max3(c); +} + +// 3-tap median filter +half3 Median(half3 a, half3 b, half3 c) +{ + return a + b + c - min(min(a, b), c) - max(max(a, b), c); +} + +// Downsample with a 4x4 box filter +half3 DownsampleFilter(sampler2D tex, float2 uv, float2 texelSize) +{ + float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0); + + half3 s; + s = DecodeHDR(tex2D(tex, uv + d.xy)); + s += DecodeHDR(tex2D(tex, uv + d.zy)); + s += DecodeHDR(tex2D(tex, uv + d.xw)); + s += DecodeHDR(tex2D(tex, uv + d.zw)); + + return s * (1.0 / 4.0); +} + +// Downsample with a 4x4 box filter + anti-flicker filter +half3 DownsampleAntiFlickerFilter(sampler2D tex, float2 uv, float2 texelSize) +{ + float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0); + + half3 s1 = DecodeHDR(tex2D(tex, uv + d.xy)); + half3 s2 = DecodeHDR(tex2D(tex, uv + d.zy)); + half3 s3 = DecodeHDR(tex2D(tex, uv + d.xw)); + half3 s4 = DecodeHDR(tex2D(tex, uv + d.zw)); + + // Karis's luma weighted average (using brightness instead of luma) + half s1w = 1.0 / (Brightness(s1) + 1.0); + half s2w = 1.0 / (Brightness(s2) + 1.0); + half s3w = 1.0 / (Brightness(s3) + 1.0); + half s4w = 1.0 / (Brightness(s4) + 1.0); + half one_div_wsum = 1.0 / (s1w + s2w + s3w + s4w); + + return (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * one_div_wsum; +} + +half3 UpsampleFilter(sampler2D tex, float2 uv, float2 texelSize, float sampleScale) +{ +#if MOBILE_OR_CONSOLE + // 4-tap bilinear upsampler + float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0) * (sampleScale * 0.5); + + half3 s; + s = DecodeHDR(tex2D(tex, uv + d.xy)); + s += DecodeHDR(tex2D(tex, uv + d.zy)); + s += DecodeHDR(tex2D(tex, uv + d.xw)); + s += DecodeHDR(tex2D(tex, uv + d.zw)); + + return s * (1.0 / 4.0); +#else + // 9-tap bilinear upsampler (tent filter) + float4 d = texelSize.xyxy * float4(1.0, 1.0, -1.0, 0.0) * sampleScale; + + half3 s; + s = DecodeHDR(tex2D(tex, uv - d.xy)); + s += DecodeHDR(tex2D(tex, uv - d.wy)) * 2.0; + s += DecodeHDR(tex2D(tex, uv - d.zy)); + + s += DecodeHDR(tex2D(tex, uv + d.zw)) * 2.0; + s += DecodeHDR(tex2D(tex, uv)) * 4.0; + s += DecodeHDR(tex2D(tex, uv + d.xw)) * 2.0; + + s += DecodeHDR(tex2D(tex, uv + d.zy)); + s += DecodeHDR(tex2D(tex, uv + d.wy)) * 2.0; + s += DecodeHDR(tex2D(tex, uv + d.xy)); + + return s * (1.0 / 16.0); +#endif +} + +#endif // __BLOOM__ diff --git a/Assets/PostProcessing/Resources/Shaders/Bloom.cginc.meta b/Assets/PostProcessing/Resources/Shaders/Bloom.cginc.meta new file mode 100644 index 0000000..59a5a6d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Bloom.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7d1f4dd94c8e6e940b0730076ea7d6d9 +timeCreated: 1462980395 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/Bloom.shader b/Assets/PostProcessing/Resources/Shaders/Bloom.shader new file mode 100644 index 0000000..d3004bb --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Bloom.shader @@ -0,0 +1,182 @@ +// +// Kino/Bloom v2 - Bloom filter for Unity +// +// Copyright (C) 2015, 2016 Keijiro Takahashi +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +Shader "Hidden/Post FX/Bloom" +{ + Properties + { + _MainTex ("", 2D) = "" {} + _BaseTex ("", 2D) = "" {} + _AutoExposure ("", 2D) = "" {} + } + + CGINCLUDE + + #pragma target 3.0 + #include "UnityCG.cginc" + #include "Bloom.cginc" + #include "Common.cginc" + + sampler2D _BaseTex; + float2 _BaseTex_TexelSize; + + sampler2D _AutoExposure; + + float _PrefilterOffs; + float _Threshold; + float3 _Curve; + float _SampleScale; + + // ----------------------------------------------------------------------------- + // Vertex shaders + + struct VaryingsMultitex + { + float4 pos : SV_POSITION; + float2 uvMain : TEXCOORD0; + float2 uvBase : TEXCOORD1; + }; + + VaryingsMultitex VertMultitex(AttributesDefault v) + { + VaryingsMultitex o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uvMain = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uvBase = o.uvMain; + + #if UNITY_UV_STARTS_AT_TOP + if (_BaseTex_TexelSize.y < 0.0) + o.uvBase.y = 1.0 - o.uvBase.y; + #endif + + return o; + } + + // ----------------------------------------------------------------------------- + // Fragment shaders + + half4 FetchAutoExposed(sampler2D tex, float2 uv) + { + float autoExposure = 1.0; + uv = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); + autoExposure = tex2D(_AutoExposure, uv).r; + return tex2D(tex, uv) * autoExposure; + } + + half4 FragPrefilter(VaryingsDefault i) : SV_Target + { + float2 uv = i.uv + _MainTex_TexelSize.xy * _PrefilterOffs; + + #if ANTI_FLICKER + float3 d = _MainTex_TexelSize.xyx * float3(1.0, 1.0, 0.0); + half4 s0 = SafeHDR(FetchAutoExposed(_MainTex, uv)); + half3 s1 = SafeHDR(FetchAutoExposed(_MainTex, uv - d.xz).rgb); + half3 s2 = SafeHDR(FetchAutoExposed(_MainTex, uv + d.xz).rgb); + half3 s3 = SafeHDR(FetchAutoExposed(_MainTex, uv - d.zy).rgb); + half3 s4 = SafeHDR(FetchAutoExposed(_MainTex, uv + d.zy).rgb); + half3 m = Median(Median(s0.rgb, s1, s2), s3, s4); + #else + half4 s0 = SafeHDR(FetchAutoExposed(_MainTex, uv)); + half3 m = s0.rgb; + #endif + + #if UNITY_COLORSPACE_GAMMA + m = GammaToLinearSpace(m); + #endif + + // Pixel brightness + half br = Brightness(m); + + // Under-threshold part: quadratic curve + half rq = clamp(br - _Curve.x, 0.0, _Curve.y); + rq = _Curve.z * rq * rq; + + // Combine and apply the brightness response curve. + m *= max(rq, br - _Threshold) / max(br, 1e-5); + + return EncodeHDR(m); + } + + half4 FragDownsample1(VaryingsDefault i) : SV_Target + { + #if ANTI_FLICKER + return EncodeHDR(DownsampleAntiFlickerFilter(_MainTex, i.uvSPR, _MainTex_TexelSize.xy)); + #else + return EncodeHDR(DownsampleFilter(_MainTex, i.uvSPR, _MainTex_TexelSize.xy)); + #endif + } + + half4 FragDownsample2(VaryingsDefault i) : SV_Target + { + return EncodeHDR(DownsampleFilter(_MainTex, i.uvSPR, _MainTex_TexelSize.xy)); + } + + half4 FragUpsample(VaryingsMultitex i) : SV_Target + { + half3 base = DecodeHDR(tex2D(_BaseTex, i.uvBase)); + half3 blur = UpsampleFilter(_MainTex, i.uvMain, _MainTex_TexelSize.xy, _SampleScale); + return EncodeHDR(base + blur); + } + + ENDCG + + SubShader + { + ZTest Always Cull Off ZWrite Off + + Pass + { + CGPROGRAM + #pragma multi_compile __ ANTI_FLICKER + #pragma multi_compile __ UNITY_COLORSPACE_GAMMA + #pragma vertex VertDefault + #pragma fragment FragPrefilter + ENDCG + } + + Pass + { + CGPROGRAM + #pragma multi_compile __ ANTI_FLICKER + #pragma vertex VertDefault + #pragma fragment FragDownsample1 + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex VertDefault + #pragma fragment FragDownsample2 + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex VertMultitex + #pragma fragment FragUpsample + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/Bloom.shader.meta b/Assets/PostProcessing/Resources/Shaders/Bloom.shader.meta new file mode 100644 index 0000000..9d75f9b --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Bloom.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4ceb73bc148699b469361531d6062548 +timeCreated: 1462953634 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/BuiltinDebugViews.shader b/Assets/PostProcessing/Resources/Shaders/BuiltinDebugViews.shader new file mode 100644 index 0000000..337128e --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/BuiltinDebugViews.shader @@ -0,0 +1,257 @@ +Shader "Hidden/Post FX/Builtin Debug Views" +{ + CGINCLUDE + + #include "UnityCG.cginc" + #include "Common.cginc" + + #pragma exclude_renderers d3d11_9x + + sampler2D_float _CameraDepthTexture; + sampler2D_float _CameraDepthNormalsTexture; + sampler2D_float _CameraMotionVectorsTexture; + + float4 _CameraDepthTexture_ST; + float4 _CameraDepthNormalsTexture_ST; + float4 _CameraMotionVectorsTexture_ST; + + #if SOURCE_GBUFFER + sampler2D _CameraGBufferTexture2; + float4 _CameraGBufferTexture2_ST; + #endif + + // ----------------------------------------------------------------------------- + // Depth + + float _DepthScale; + + float4 FragDepth(VaryingsDefault i) : SV_Target + { + float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv, _CameraDepthTexture_ST)); + depth = Linear01Depth(depth) * _DepthScale; + float3 d = depth.xxx; + + #if !UNITY_COLORSPACE_GAMMA + d = GammaToLinearSpace(d); + #endif + + return float4(d, 1.0); + } + + // ----------------------------------------------------------------------------- + // Normals + + float3 SampleNormal(float2 uv) + { + #if SOURCE_GBUFFER + float3 norm = tex2D(_CameraGBufferTexture2, uv).xyz * 2.0 - 1.0; + return mul((float3x3)unity_WorldToCamera, norm); + #else + float4 cdn = tex2D(_CameraDepthNormalsTexture, uv); + return DecodeViewNormalStereo(cdn) * float3(1.0, 1.0, -1.0); + #endif + } + + float4 FragNormals(VaryingsDefault i) : SV_Target + { + float3 n = SampleNormal(UnityStereoScreenSpaceUVAdjust(i.uv, _CameraDepthNormalsTexture_ST)); + + #if UNITY_COLORSPACE_GAMMA + n = LinearToGammaSpace(n); + #endif + + return float4(n, 1.0); + } + + // ----------------------------------------------------------------------------- + // Motion vectors + + float _Opacity; + float _Amplitude; + float4 _Scale; + + float4 FragMovecsOpacity(VaryingsDefault i) : SV_Target + { + float4 src = tex2D(_MainTex, i.uv); + return float4(src.rgb * _Opacity, src.a); + } + + // Convert a motion vector into RGBA color. + float4 VectorToColor(float2 mv) + { + float phi = atan2(mv.x, mv.y); + float hue = (phi / UNITY_PI + 1.0) * 0.5; + + float r = abs(hue * 6.0 - 3.0) - 1.0; + float g = 2.0 - abs(hue * 6.0 - 2.0); + float b = 2.0 - abs(hue * 6.0 - 4.0); + float a = length(mv); + + return saturate(float4(r, g, b, a)); + } + + float4 FragMovecsImaging(VaryingsDefault i) : SV_Target + { + float4 src = tex2D(_MainTex, i.uv); + + float2 mv = tex2D(_CameraMotionVectorsTexture, i.uv).rg * _Amplitude; + + #if UNITY_UV_STARTS_AT_TOP + mv.y *= -1.0; + #endif + + float4 mc = VectorToColor(mv); + + float3 rgb = src.rgb; + + #if !UNITY_COLORSPACE_GAMMA + rgb = LinearToGammaSpace(rgb); + #endif + + rgb = lerp(rgb, mc.rgb, mc.a * _Opacity); + + #if !UNITY_COLORSPACE_GAMMA + rgb = GammaToLinearSpace(rgb); + #endif + + return float4(rgb, src.a); + } + + struct VaryingsArrows + { + float4 vertex : SV_POSITION; + float2 scoord : TEXCOORD; + float4 color : COLOR; + }; + + VaryingsArrows VertArrows(AttributesDefault v) + { + // Retrieve the motion vector. + float4 uv = float4(v.texcoord.xy, 0.0, 0.0); + + #if UNITY_UV_STARTS_AT_TOP + uv.y = 1.0 - uv.y; + #endif + + float2 mv = tex2Dlod(_CameraMotionVectorsTexture, uv).rg * _Amplitude; + + #if UNITY_UV_STARTS_AT_TOP + mv.y *= -1.0; + #endif + + // Arrow color + float4 color = VectorToColor(mv); + + // Make a rotation matrix based on the motion vector. + float2x2 rot = float2x2(mv.y, mv.x, -mv.x, mv.y); + + // Rotate and scale the body of the arrow. + float2 pos = mul(rot, v.vertex.zy) * _Scale.xy; + + // Normalized variant of the motion vector and the rotation matrix. + float2 mv_n = normalize(mv); + float2x2 rot_n = float2x2(mv_n.y, mv_n.x, -mv_n.x, mv_n.y); + + // Rotate and scale the head of the arrow. + float2 head = float2(v.vertex.x, -abs(v.vertex.x)) * 0.3; + head *= saturate(color.a); + pos += mul(rot_n, head) * _Scale.xy; + + // Offset the arrow position. + pos += v.texcoord.xy * 2.0 - 1.0; + + // Convert to the screen coordinates. + float2 scoord = (pos + 1.0) * 0.5 * _ScreenParams.xy; + + // Snap to a pixel-perfect position. + scoord = round(scoord); + + // Bring back to the normalized screen space. + pos = (scoord + 0.5) * (_ScreenParams.zw - 1.0) * 2.0 - 1.0; + + // Color tweaks + color.rgb = GammaToLinearSpace(lerp(color.rgb, 1.0, 0.5)); + color.a *= _Opacity; + + // Output + VaryingsArrows o; + o.vertex = float4(pos, 0.0, 1.0); + o.scoord = scoord; + o.color = saturate(color); + return o; + } + + float4 FragMovecsArrows(VaryingsArrows i) : SV_Target + { + // Pseudo anti-aliasing. + float aa = length(frac(i.scoord) - 0.5) / 0.707; + aa *= (aa * (aa * 0.305306011 + 0.682171111) + 0.012522878); // gamma + return float4(i.color.rgb, i.color.a * aa); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // (0) - Depth + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragDepth + + ENDCG + } + + // (1) - Normals + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragNormals + #pragma multi_compile __ SOURCE_GBUFFER + + ENDCG + } + + // (2) - Motion vectors - Opacity + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragMovecsOpacity + + ENDCG + } + + // (3) - Motion vectors - Imaging + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragMovecsImaging + #pragma multi_compile __ UNITY_COLORSPACE_GAMMA + + ENDCG + } + + // (4) - Motion vectors - Arrows + Pass + { + Blend SrcAlpha OneMinusSrcAlpha + + CGPROGRAM + + #pragma vertex VertArrows + #pragma fragment FragMovecsArrows + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/BuiltinDebugViews.shader.meta b/Assets/PostProcessing/Resources/Shaders/BuiltinDebugViews.shader.meta new file mode 100644 index 0000000..a5c6ee8 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/BuiltinDebugViews.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 72127ba7dd8c6b04bb3f29c7ee669813 +timeCreated: 1468224802 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/ColorGrading.cginc b/Assets/PostProcessing/Resources/Shaders/ColorGrading.cginc new file mode 100644 index 0000000..42796fe --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ColorGrading.cginc @@ -0,0 +1,290 @@ +#ifndef __COLOR_GRADING__ +#define __COLOR_GRADING__ + +#include "ACES.cginc" +#include "Common.cginc" + +// Set to 1 to use more precise but more expensive log/linear conversions. I haven't found a proper +// use case for the high precision version yet so I'm leaving this to 0. +#define COLOR_GRADING_PRECISE_LOG 0 + +// +// Alexa LogC converters (El 1000) +// See http://www.vocas.nl/webfm_send/964 +// It's a good fit to store HDR values in log as the range is pretty wide (1 maps to ~58.85666) and +// is quick enough to compute. +// +struct ParamsLogC +{ + half cut; + half a, b, c, d, e, f; +}; + +static const ParamsLogC LogC = +{ + 0.011361, // cut + 5.555556, // a + 0.047996, // b + 0.244161, // c + 0.386036, // d + 5.301883, // e + 0.092819 // f +}; + +half LinearToLogC_Precise(half x) +{ + half o; + if (x > LogC.cut) + o = LogC.c * log10(LogC.a * x + LogC.b) + LogC.d; + else + o = LogC.e * x + LogC.f; + return o; +} + +half3 LinearToLogC(half3 x) +{ +#if COLOR_GRADING_PRECISE_LOG + return half3( + LinearToLogC_Precise(x.x), + LinearToLogC_Precise(x.y), + LinearToLogC_Precise(x.z) + ); +#else + return LogC.c * log10(LogC.a * x + LogC.b) + LogC.d; +#endif +} + +half LogCToLinear_Precise(half x) +{ + half o; + if (x > LogC.e * LogC.cut + LogC.f) + o = (pow(10.0, (x - LogC.d) / LogC.c) - LogC.b) / LogC.a; + else + o = (x - LogC.f) / LogC.e; + return o; +} + +half3 LogCToLinear(half3 x) +{ +#if COLOR_GRADING_PRECISE_LOG + return half3( + LogCToLinear_Precise(x.x), + LogCToLinear_Precise(x.y), + LogCToLinear_Precise(x.z) + ); +#else + return (pow(10.0, (x - LogC.d) / LogC.c) - LogC.b) / LogC.a; +#endif +} + +// +// White balance +// Recommended workspace: ACEScg (linear) +// +static const half3x3 LIN_2_LMS_MAT = { + 3.90405e-1, 5.49941e-1, 8.92632e-3, + 7.08416e-2, 9.63172e-1, 1.35775e-3, + 2.31082e-2, 1.28021e-1, 9.36245e-1 +}; + +static const half3x3 LMS_2_LIN_MAT = { + 2.85847e+0, -1.62879e+0, -2.48910e-2, + -2.10182e-1, 1.15820e+0, 3.24281e-4, + -4.18120e-2, -1.18169e-1, 1.06867e+0 +}; + +half3 WhiteBalance(half3 c, half3 balance) +{ + half3 lms = mul(LIN_2_LMS_MAT, c); + lms *= balance; + return mul(LMS_2_LIN_MAT, lms); +} + +// +// Luminance (Rec.709 primaries according to ACES specs) +// +half AcesLuminance(half3 c) +{ + return dot(c, half3(0.2126, 0.7152, 0.0722)); +} + +// +// Offset, Power, Slope (ASC-CDL) +// Works in Log & Linear. Results will be different but still correct. +// +half3 OffsetPowerSlope(half3 c, half3 offset, half3 power, half3 slope) +{ + half3 so = c * slope + offset; + so = so > (0.0).xxx ? pow(so, power) : so; + return so; +} + +// +// Lift, Gamma (pre-inverted), Gain +// Recommended workspace: ACEScg (linear) +// +half3 LiftGammaGain(half3 c, half3 lift, half3 invgamma, half3 gain) +{ + //return gain * (lift * (1.0 - c) + pow(max(c, kEpsilon), invgamma)); + //return pow(gain * (c + lift * (1.0 - c)), invgamma); + + half3 power = invgamma; + half3 offset = lift * gain; + half3 slope = ((1.0).xxx - lift) * gain; + return OffsetPowerSlope(c, offset, power, slope); +} + +// +// Saturation (should be used after offset/power/slope) +// Recommended workspace: ACEScc (log) +// Optimal range: [0.0, 2.0] +// +half3 Saturation(half3 c, half sat) +{ + half luma = AcesLuminance(c); + return luma.xxx + sat * (c - luma.xxx); +} + +// +// Basic contrast curve +// Recommended workspace: ACEScc (log) +// Optimal range: [0.0, 2.0] +// +half3 ContrastLog(half3 c, half con) +{ + return (c - ACEScc_MIDGRAY) * con + ACEScc_MIDGRAY; +} + +// +// Hue, Saturation, Value +// Ranges: +// Hue [0.0, 1.0] +// Sat [0.0, 1.0] +// Lum [0.0, HALF_MAX] +// +half3 RgbToHsv(half3 c) +{ + half4 K = half4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + half4 p = lerp(half4(c.bg, K.wz), half4(c.gb, K.xy), step(c.b, c.g)); + half4 q = lerp(half4(p.xyw, c.r), half4(c.r, p.yzx), step(p.x, c.r)); + half d = q.x - min(q.w, q.y); + half e = EPSILON; + return half3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +half3 HsvToRgb(half3 c) +{ + half4 K = half4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + half3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y); +} + +half RotateHue(half value, half low, half hi) +{ + return (value < low) + ? value + hi + : (value > hi) + ? value - hi + : value; +} + +// +// Remaps Y/R/G/B values +// +half3 YrgbCurve(half3 c, sampler2D curveTex) +{ + const float kHalfPixel = (1.0 / 128.0) / 2.0; + + // Y + c += kHalfPixel.xxx; + float mr = tex2D(curveTex, float2(c.r, 0.75)).a; + float mg = tex2D(curveTex, float2(c.g, 0.75)).a; + float mb = tex2D(curveTex, float2(c.b, 0.75)).a; + c = saturate(float3(mr, mg, mb)); + + // RGB + c += kHalfPixel.xxx; + float r = tex2D(curveTex, float2(c.r, 0.75)).r; + float g = tex2D(curveTex, float2(c.g, 0.75)).g; + float b = tex2D(curveTex, float2(c.b, 0.75)).b; + return saturate(half3(r, g, b)); +} + +// +// (X) Hue VS Hue - Remaps hue on a curve according to the current hue +// Input is Hue [0.0, 1.0] +// Output is Hue [0.0, 1.0] +// +half SecondaryHueHue(half hue, sampler2D curveTex) +{ + half offset = saturate(tex2D(curveTex, half2(hue, 0.25)).x) - 0.5; + hue += offset; + hue = RotateHue(hue, 0.0, 1.0); + return hue; +} + +// +// (Y) Hue VS Saturation - Remaps saturation on a curve according to the current hue +// Input is Hue [0.0, 1.0] +// Output is Saturation multiplier [0.0, 2.0] +// +half SecondaryHueSat(half hue, sampler2D curveTex) +{ + return saturate(tex2D(curveTex, half2(hue, 0.25)).y) * 2.0; +} + +// +// (Z) Saturation VS Saturation - Remaps saturation on a curve according to the current saturation +// Input is Saturation [0.0, 1.0] +// Output is Saturation multiplier [0.0, 2.0] +// +half SecondarySatSat(half sat, sampler2D curveTex) +{ + return saturate(tex2D(curveTex, half2(sat, 0.25)).z) * 2.0; +} + +// +// (W) Luminance VS Saturation - Remaps saturation on a curve according to the current luminance +// Input is Luminance [0.0, 1.0] +// Output is Saturation multiplier [0.0, 2.0] +// +half SecondaryLumSat(half lum, sampler2D curveTex) +{ + return saturate(tex2D(curveTex, half2(lum, 0.25)).w) * 2.0; +} + +// +// Channel mixing (same as Photoshop's and DaVinci's Resolve) +// Recommended workspace: ACEScg (linear) +// Input mixers should be in range [-2.0;2.0] +// +half3 ChannelMixer(half3 c, half3 red, half3 green, half3 blue) +{ + return half3( + dot(c, red), + dot(c, green), + dot(c, blue) + ); +} + +// +// LUT grading +// scaleOffset = (1 / lut_width, 1 / lut_height, lut_height - 1) +// +half3 ApplyLut2d(sampler2D tex, half3 uvw, half3 scaleOffset) +{ + // Strip format where `height = sqrt(width)` + uvw.z *= scaleOffset.z; + half shift = floor(uvw.z); + uvw.xy = uvw.xy * scaleOffset.z * scaleOffset.xy + scaleOffset.xy * 0.5; + uvw.x += (float)shift * scaleOffset.y; + uvw.xyz = lerp(tex2D(tex, uvw.xy).rgb, tex2D(tex, uvw.xy + half2(scaleOffset.y, 0)).rgb, uvw.z - shift); + return uvw; +} + +half3 ApplyLut3d(sampler3D tex, half3 uvw) +{ + return tex3D(tex, uvw).rgb; +} + +#endif // __COLOR_GRADING__ diff --git a/Assets/PostProcessing/Resources/Shaders/ColorGrading.cginc.meta b/Assets/PostProcessing/Resources/Shaders/ColorGrading.cginc.meta new file mode 100644 index 0000000..37626d5 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ColorGrading.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 26a62c2e30be83547bdfa9fe837165e3 +timeCreated: 1460363486 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/Common.cginc b/Assets/PostProcessing/Resources/Shaders/Common.cginc new file mode 100644 index 0000000..d70f2e5 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Common.cginc @@ -0,0 +1,187 @@ +#ifndef __COMMON__ +#define __COMMON__ + +#include "UnityCG.cginc" + +// Mobile: use RGBM instead of float/half RGB +#define USE_RGBM defined(SHADER_API_MOBILE) + +#define MOBILE_OR_CONSOLE (defined(SHADER_API_MOBILE) || defined(SHADER_API_PSSL) || defined(SHADER_API_XBOXONE) || defined(SHADER_API_WIIU) || defined(SHADER_API_SWITCH)) + +#if defined(SHADER_API_PSSL) +// No support for sampler2D_half on PS4 in 5.4 +#define sampler2D_half sampler2D_float +#endif + +// ----------------------------------------------------------------------------- +// Uniforms + +#if defined(SEPARATE_TEXTURE_SAMPLER) +Texture2D _MainTex; +SamplerState sampler_MainTex; +#else +sampler2D _MainTex; +#endif +float4 _MainTex_TexelSize; +float4 _MainTex_ST; + +// ----------------------------------------------------------------------------- +// Vertex shaders + +struct AttributesDefault +{ + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; +}; + +struct VaryingsDefault +{ + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uvSPR : TEXCOORD1; // Single Pass Stereo UVs +}; + +VaryingsDefault VertDefault(AttributesDefault v) +{ + VaryingsDefault o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.uvSPR = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + return o; +} + +// ----------------------------------------------------------------------------- +// Maths stuff + +#define HALF_MAX 65504.0 +#define EPSILON 1.0e-4 +#define UNITY_PI_2 (UNITY_PI * 2.0) + +inline half Min3(half3 x) { return min(x.x, min(x.y, x.z)); } +inline half Min3(half x, half y, half z) { return min(x, min(y, z)); } + +inline half Max3(half3 x) { return max(x.x, max(x.y, x.z)); } +inline half Max3(half x, half y, half z) { return max(x, max(y, z)); } + +inline half Min4(half4 x) { return min(x.x, min(x.y, min(x.z, x.w))); } +inline half Min4(half x, half y, half z, half w) { return min(x, min(y, min(z, w))); } + +inline half Max4(half4 x) { return max(x.x, max(x.y, max(x.z, x.w))); } +inline half Max4(half x, half y, half z, half w) { return max(x, max(y, min(z, w))); } + +inline half Pow2(half x) { return x * x; } +inline half2 Pow2(half2 x) { return x * x; } +inline half3 Pow2(half3 x) { return x * x; } +inline half4 Pow2(half4 x) { return x * x; } + +inline half Pow3(half x) { return x * x * x; } +inline half2 Pow3(half2 x) { return x * x * x; } +inline half3 Pow3(half3 x) { return x * x * x; } +inline half4 Pow3(half4 x) { return x * x * x; } + +#ifndef UNITY_STANDARD_BRDF_INCLUDED +inline half Pow4(half x) { return x * x * x * x; } +inline half2 Pow4(half2 x) { return x * x * x * x; } +inline half3 Pow4(half3 x) { return x * x * x * x; } +inline half4 Pow4(half4 x) { return x * x * x * x; } +#endif + +// Returns the largest vector of v1 and v2 +inline half2 MaxV(half2 v1, half2 v2) { return dot(v1, v1) < dot(v2, v2) ? v2 : v1; } +inline half3 MaxV(half3 v1, half3 v2) { return dot(v1, v1) < dot(v2, v2) ? v2 : v1; } +inline half4 MaxV(half4 v1, half4 v2) { return dot(v1, v1) < dot(v2, v2) ? v2 : v1; } + +// Clamp HDR value within a safe range +inline half SafeHDR(half c) { return min(c, HALF_MAX); } +inline half2 SafeHDR(half2 c) { return min(c, HALF_MAX); } +inline half3 SafeHDR(half3 c) { return min(c, HALF_MAX); } +inline half4 SafeHDR(half4 c) { return min(c, HALF_MAX); } + +// Compatibility function +#if (SHADER_TARGET < 50 && !defined(SHADER_API_PSSL)) +float rcp(float value) +{ + return 1.0 / value; +} +#endif + +// NAN checker +bool IsNan(float x) +{ + return (x <= 0.0 || 0.0 <= x) ? false : true; +} + +bool AnyIsNan(float2 x) +{ + return IsNan(x.x) || IsNan(x.y); +} + +bool AnyIsNan(float3 x) +{ + return IsNan(x.x) || IsNan(x.y) || IsNan(x.z); +} + +bool AnyIsNan(float4 x) +{ + return IsNan(x.x) || IsNan(x.y) || IsNan(x.z) || IsNan(x.w); +} + +// Tonemapper from http://gpuopen.com/optimized-reversible-tonemapper-for-resolve/ +float4 FastToneMap(in float4 color) +{ + return float4(color.rgb * rcp(Max3(color.rgb) + 1.), color.a); +} + +float4 FastToneMap(in float4 color, in float weight) +{ + return float4(color.rgb * rcp(weight * Max3(color.rgb) + 1.), color.a); +} + +float4 FastToneUnmap(in float4 color) +{ + return float4(color.rgb * rcp(1. - Max3(color.rgb)), color.a); +} + +// Interleaved gradient function from Jimenez 2014 http://goo.gl/eomGso +float GradientNoise(float2 uv) +{ + uv = floor(uv * _ScreenParams.xy); + float f = dot(float2(0.06711056, 0.00583715), uv); + return frac(52.9829189 * frac(f)); +} + +// Z buffer depth to linear 0-1 depth +// Handles orthographic projection correctly +float LinearizeDepth(float z) +{ + float isOrtho = unity_OrthoParams.w; + float isPers = 1.0 - unity_OrthoParams.w; + z *= _ZBufferParams.x; + return (1.0 - isOrtho * z) / (isPers * z + _ZBufferParams.y); +} + +// ----------------------------------------------------------------------------- +// RGBM encoding/decoding + +half4 EncodeHDR(float3 rgb) +{ +#if USE_RGBM + rgb *= 1.0 / 8.0; + float m = max(max(rgb.r, rgb.g), max(rgb.b, 1e-6)); + m = ceil(m * 255.0) / 255.0; + return half4(rgb / m, m); +#else + return half4(rgb, 0.0); +#endif +} + +float3 DecodeHDR(half4 rgba) +{ +#if USE_RGBM + return rgba.rgb * rgba.a * 8.0; +#else + return rgba.rgb; +#endif +} + +#endif // __COMMON__ diff --git a/Assets/PostProcessing/Resources/Shaders/Common.cginc.meta b/Assets/PostProcessing/Resources/Shaders/Common.cginc.meta new file mode 100644 index 0000000..67d0e83 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Common.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: eb88496804341c648b32a75843d92ccb +timeCreated: 1465205118 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/DepthOfField.cginc b/Assets/PostProcessing/Resources/Shaders/DepthOfField.cginc new file mode 100644 index 0000000..dad9b4e --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/DepthOfField.cginc @@ -0,0 +1,243 @@ +#ifndef __DEPTH_OF_FIELD__ +#define __DEPTH_OF_FIELD__ + +#if SHADER_TARGET >= 50 + // Use separate texture/sampler objects on Shader Model 5.0 + #define SEPARATE_TEXTURE_SAMPLER + #define DOF_DECL_TEX2D(tex) Texture2D tex; SamplerState sampler##tex + #define DOF_TEX2D(tex, coord) tex.Sample(sampler##tex, coord) +#else + #define DOF_DECL_TEX2D(tex) sampler2D tex + #define DOF_TEX2D(tex, coord) tex2D(tex, coord) +#endif + +#include "Common.cginc" +#include "DiskKernels.cginc" + +DOF_DECL_TEX2D(_CameraDepthTexture); +DOF_DECL_TEX2D(_CameraMotionVectorsTexture); +DOF_DECL_TEX2D(_CoCTex); + +// Camera parameters +float _Distance; +float _LensCoeff; // f^2 / (N * (S1 - f) * film_width * 2) +float _MaxCoC; +float _RcpMaxCoC; +float _RcpAspect; +half3 _TaaParams; // Jitter.x, Jitter.y, Blending + +struct VaryingsDOF +{ + float4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half2 uvAlt : TEXCOORD1; +}; + +// Common vertex shader with single pass stereo rendering support +VaryingsDOF VertDOF(AttributesDefault v) +{ + half2 uvAlt = v.texcoord; +#if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0.0) uvAlt.y = 1.0 - uvAlt.y; +#endif + + VaryingsDOF o; + o.pos = UnityObjectToClipPos(v.vertex); + +#if defined(UNITY_SINGLE_PASS_STEREO) + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST); + o.uvAlt = UnityStereoScreenSpaceUVAdjust(uvAlt, _MainTex_ST); +#else + o.uv = v.texcoord; + o.uvAlt = uvAlt; +#endif + + return o; +} + +// CoC calculation +half4 FragCoC(VaryingsDOF i) : SV_Target +{ + float depth = LinearEyeDepth(DOF_TEX2D(_CameraDepthTexture, i.uv)); + half coc = (depth - _Distance) * _LensCoeff / max(depth, 1e-5); + return saturate(coc * 0.5 * _RcpMaxCoC + 0.5); +} + +// Temporal filter +half4 FragTempFilter(VaryingsDOF i) : SV_Target +{ + float3 uvOffs = _MainTex_TexelSize.xyy * float3(1, 1, 0); + +#if defined(SEPARATE_TEXTURE_SAMPLER) + + half4 cocTL = _CoCTex.GatherRed(sampler_CoCTex, i.uv - uvOffs.xy * 0.5); // top-left + half4 cocBR = _CoCTex.GatherRed(sampler_CoCTex, i.uv + uvOffs.xy * 0.5); // bottom-right + half coc1 = cocTL.x; // top + half coc2 = cocTL.z; // left + half coc3 = cocBR.x; // bottom + half coc4 = cocBR.z; // right + +#else + + half coc1 = DOF_TEX2D(_CoCTex, i.uv - uvOffs.xz).r; // top + half coc2 = DOF_TEX2D(_CoCTex, i.uv - uvOffs.zy).r; // left + half coc3 = DOF_TEX2D(_CoCTex, i.uv + uvOffs.zy).r; // bottom + half coc4 = DOF_TEX2D(_CoCTex, i.uv + uvOffs.xz).r; // right + +#endif + + // Dejittered center sample. + half coc0 = DOF_TEX2D(_CoCTex, i.uv - _TaaParams.xy).r; + + // CoC dilation: determine the closest point in the four neighbors. + float3 closest = float3(0, 0, coc0); + closest = coc1 < closest.z ? float3(-uvOffs.xz, coc1) : closest; + closest = coc2 < closest.z ? float3(-uvOffs.zy, coc2) : closest; + closest = coc3 < closest.z ? float3(+uvOffs.zy, coc3) : closest; + closest = coc4 < closest.z ? float3(+uvOffs.xz, coc4) : closest; + + // Sample the history buffer with the motion vector at the closest point. + float2 motion = DOF_TEX2D(_CameraMotionVectorsTexture, i.uv + closest.xy).xy; + half cocHis = DOF_TEX2D(_MainTex, i.uv - motion).r; + + // Neighborhood clamping. + half cocMin = closest.z; + half cocMax = max(max(max(max(coc0, coc1), coc2), coc3), coc4); + cocHis = clamp(cocHis, cocMin, cocMax); + + // Blend with the history. + return lerp(coc0, cocHis, _TaaParams.z); +} + +// Prefilter: downsampling and premultiplying. +half4 FragPrefilter(VaryingsDOF i) : SV_Target +{ +#if defined(SEPARATE_TEXTURE_SAMPLER) + + // Sample source colors. + half4 c_r = _MainTex.GatherRed (sampler_MainTex, i.uv); + half4 c_g = _MainTex.GatherGreen(sampler_MainTex, i.uv); + half4 c_b = _MainTex.GatherBlue (sampler_MainTex, i.uv); + + half3 c0 = half3(c_r.x, c_g.x, c_b.x); + half3 c1 = half3(c_r.y, c_g.y, c_b.y); + half3 c2 = half3(c_r.z, c_g.z, c_b.z); + half3 c3 = half3(c_r.w, c_g.w, c_b.w); + + // Sample CoCs. + half4 cocs = _CoCTex.Gather(sampler_CoCTex, i.uvAlt) * 2.0 - 1.0; + half coc0 = cocs.x; + half coc1 = cocs.y; + half coc2 = cocs.z; + half coc3 = cocs.w; + +#else + + float3 duv = _MainTex_TexelSize.xyx * float3(0.5, 0.5, -0.5); + + // Sample source colors. + half3 c0 = DOF_TEX2D(_MainTex, i.uv - duv.xy).rgb; + half3 c1 = DOF_TEX2D(_MainTex, i.uv - duv.zy).rgb; + half3 c2 = DOF_TEX2D(_MainTex, i.uv + duv.zy).rgb; + half3 c3 = DOF_TEX2D(_MainTex, i.uv + duv.xy).rgb; + + // Sample CoCs. + half coc0 = DOF_TEX2D(_CoCTex, i.uvAlt - duv.xy).r * 2.0 - 1.0; + half coc1 = DOF_TEX2D(_CoCTex, i.uvAlt - duv.zy).r * 2.0 - 1.0; + half coc2 = DOF_TEX2D(_CoCTex, i.uvAlt + duv.zy).r * 2.0 - 1.0; + half coc3 = DOF_TEX2D(_CoCTex, i.uvAlt + duv.xy).r * 2.0 - 1.0; + +#endif + + // Apply CoC and luma weights to reduce bleeding and flickering. + float w0 = abs(coc0) / (Max3(c0) + 1.0); + float w1 = abs(coc1) / (Max3(c1) + 1.0); + float w2 = abs(coc2) / (Max3(c2) + 1.0); + float w3 = abs(coc3) / (Max3(c3) + 1.0); + + // Weighted average of the color samples + half3 avg = c0 * w0 + c1 * w1 + c2 * w2 + c3 * w3; + avg /= max(w0 + w1 + w2 + w3, 1e-5); + + // Select the largest CoC value. + half coc_min = Min4(coc0, coc1, coc2, coc3); + half coc_max = Max4(coc0, coc1, coc2, coc3); + half coc = (-coc_min > coc_max ? coc_min : coc_max) * _MaxCoC; + + // Premultiply CoC again. + avg *= smoothstep(0, _MainTex_TexelSize.y * 2, abs(coc)); + +#if defined(UNITY_COLORSPACE_GAMMA) + avg = GammaToLinearSpace(avg); +#endif + + return half4(avg, coc); +} + +// Bokeh filter with disk-shaped kernels +half4 FragBlur(VaryingsDOF i) : SV_Target +{ + half4 samp0 = DOF_TEX2D(_MainTex, i.uv); + + half4 bgAcc = 0.0; // Background: far field bokeh + half4 fgAcc = 0.0; // Foreground: near field bokeh + + UNITY_LOOP for (int si = 0; si < kSampleCount; si++) + { + float2 disp = kDiskKernel[si] * _MaxCoC; + float dist = length(disp); + + float2 duv = float2(disp.x * _RcpAspect, disp.y); + half4 samp = DOF_TEX2D(_MainTex, i.uv + duv); + + // BG: Compare CoC of the current sample and the center sample + // and select smaller one. + half bgCoC = max(min(samp0.a, samp.a), 0.0); + + // Compare the CoC to the sample distance. + // Add a small margin to smooth out. + const half margin = _MainTex_TexelSize.y * 2; + half bgWeight = saturate((bgCoC - dist + margin) / margin); + half fgWeight = saturate((-samp.a - dist + margin) / margin); + + // Cut influence from focused areas because they're darkened by CoC + // premultiplying. This is only needed for near field. + fgWeight *= step(_MainTex_TexelSize.y, -samp.a); + + // Accumulation + bgAcc += half4(samp.rgb, 1.0) * bgWeight; + fgAcc += half4(samp.rgb, 1.0) * fgWeight; + } + + // Get the weighted average. + bgAcc.rgb /= bgAcc.a + (bgAcc.a == 0.0); // zero-div guard + fgAcc.rgb /= fgAcc.a + (fgAcc.a == 0.0); + + // BG: Calculate the alpha value only based on the center CoC. + // This is a rather aggressive approximation but provides stable results. + bgAcc.a = smoothstep(_MainTex_TexelSize.y, _MainTex_TexelSize.y * 2.0, samp0.a); + + // FG: Normalize the total of the weights. + fgAcc.a *= UNITY_PI / kSampleCount; + + // Alpha premultiplying + half alpha = saturate(fgAcc.a); + half3 rgb = lerp(bgAcc.rgb, fgAcc.rgb, alpha); + + return half4(rgb, alpha); +} + +// Postfilter blur +half4 FragPostBlur(VaryingsDOF i) : SV_Target +{ + // 9 tap tent filter with 4 bilinear samples + const float4 duv = _MainTex_TexelSize.xyxy * float4(0.5, 0.5, -0.5, 0); + half4 acc; + acc = DOF_TEX2D(_MainTex, i.uv - duv.xy); + acc += DOF_TEX2D(_MainTex, i.uv - duv.zy); + acc += DOF_TEX2D(_MainTex, i.uv + duv.zy); + acc += DOF_TEX2D(_MainTex, i.uv + duv.xy); + return acc / 4.0; +} + +#endif // __DEPTH_OF_FIELD__ diff --git a/Assets/PostProcessing/Resources/Shaders/DepthOfField.cginc.meta b/Assets/PostProcessing/Resources/Shaders/DepthOfField.cginc.meta new file mode 100644 index 0000000..c5fa7b3 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/DepthOfField.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ddc2c19b8a216d748a357ffe32ba4dc1 +timeCreated: 1472211508 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/DepthOfField.shader b/Assets/PostProcessing/Resources/Shaders/DepthOfField.shader new file mode 100644 index 0000000..ca9830c --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/DepthOfField.shader @@ -0,0 +1,212 @@ +Shader "Hidden/Post FX/Depth Of Field" +{ + Properties + { + _MainTex ("", 2D) = "black" + } + + CGINCLUDE + #pragma exclude_renderers d3d11_9x + ENDCG + + // SubShader with SM 5.0 support + // Gather intrinsics are used to reduce texture sample count. + SubShader + { + Cull Off ZWrite Off ZTest Always + + Pass // 0 + { + Name "CoC Calculation" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragCoC + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 1 + { + Name "CoC Temporal Filter" + CGPROGRAM + #pragma target 5.0 + #pragma vertex VertDOF + #pragma fragment FragTempFilter + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 2 + { + Name "Downsample and Prefilter" + CGPROGRAM + #pragma target 5.0 + #pragma vertex VertDOF + #pragma fragment FragPrefilter + #pragma multi_compile __ UNITY_COLORSPACE_GAMMA + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 3 + { + Name "Bokeh Filter (small)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_SMALL + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 4 + { + Name "Bokeh Filter (medium)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_MEDIUM + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 5 + { + Name "Bokeh Filter (large)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_LARGE + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 6 + { + Name "Bokeh Filter (very large)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_VERYLARGE + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 7 + { + Name "Postfilter" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragPostBlur + #include "DepthOfField.cginc" + ENDCG + } + } + + // Fallback SubShader with SM 3.0 + SubShader + { + Cull Off ZWrite Off ZTest Always + + Pass // 0 + { + Name "CoC Calculation" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragCoC + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 1 + { + Name "CoC Temporal Filter" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragTempFilter + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 2 + { + Name "Downsample and Prefilter" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragPrefilter + #pragma multi_compile __ UNITY_COLORSPACE_GAMMA + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 3 + { + Name "Bokeh Filter (small)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_SMALL + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 4 + { + Name "Bokeh Filter (medium)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_MEDIUM + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 5 + { + Name "Bokeh Filter (large)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_LARGE + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 6 + { + Name "Bokeh Filter (very large)" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragBlur + #define KERNEL_VERYLARGE + #include "DepthOfField.cginc" + ENDCG + } + + Pass // 7 + { + Name "Postfilter" + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDOF + #pragma fragment FragPostBlur + #include "DepthOfField.cginc" + ENDCG + } + } + + FallBack Off +} diff --git a/Assets/PostProcessing/Resources/Shaders/DepthOfField.shader.meta b/Assets/PostProcessing/Resources/Shaders/DepthOfField.shader.meta new file mode 100644 index 0000000..fb0efd1 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/DepthOfField.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ac8ed710934a3564686a096bb351caee +timeCreated: 1465484939 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/DiskKernels.cginc b/Assets/PostProcessing/Resources/Shaders/DiskKernels.cginc new file mode 100644 index 0000000..6a8d12e --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/DiskKernels.cginc @@ -0,0 +1,204 @@ +#ifndef __DISK_KERNELS__ +#define __DISK_KERNELS__ + +#if !defined(KERNEL_SMALL) && !defined(KERNEL_MEDIUM) && \ + !defined(KERNEL_LARGE) && !defined(KERNEL_VERYLARGE) + +static const int kSampleCount = 1; +static const float2 kDiskKernel[1] = { float2(0, 0) }; + +#endif + +#if defined(KERNEL_SMALL) + +// rings = 2 +// points per ring = 5 +static const int kSampleCount = 16; +static const float2 kDiskKernel[kSampleCount] = { + float2(0,0), + float2(0.54545456,0), + float2(0.16855472,0.5187581), + float2(-0.44128203,0.3206101), + float2(-0.44128197,-0.3206102), + float2(0.1685548,-0.5187581), + float2(1,0), + float2(0.809017,0.58778524), + float2(0.30901697,0.95105654), + float2(-0.30901703,0.9510565), + float2(-0.80901706,0.5877852), + float2(-1,0), + float2(-0.80901694,-0.58778536), + float2(-0.30901664,-0.9510566), + float2(0.30901712,-0.9510565), + float2(0.80901694,-0.5877853), +}; + +#endif + +#if defined(KERNEL_MEDIUM) + +// rings = 3 +// points per ring = 7 +static const int kSampleCount = 22; +static const float2 kDiskKernel[kSampleCount] = { + float2(0,0), + float2(0.53333336,0), + float2(0.3325279,0.4169768), + float2(-0.11867785,0.5199616), + float2(-0.48051673,0.2314047), + float2(-0.48051673,-0.23140468), + float2(-0.11867763,-0.51996166), + float2(0.33252785,-0.4169769), + float2(1,0), + float2(0.90096885,0.43388376), + float2(0.6234898,0.7818315), + float2(0.22252098,0.9749279), + float2(-0.22252095,0.9749279), + float2(-0.62349,0.7818314), + float2(-0.90096885,0.43388382), + float2(-1,0), + float2(-0.90096885,-0.43388376), + float2(-0.6234896,-0.7818316), + float2(-0.22252055,-0.974928), + float2(0.2225215,-0.9749278), + float2(0.6234897,-0.7818316), + float2(0.90096885,-0.43388376), +}; + +#endif + +#if defined(KERNEL_LARGE) + +// rings = 4 +// points per ring = 7 +static const int kSampleCount = 43; +static const float2 kDiskKernel[kSampleCount] = { + float2(0,0), + float2(0.36363637,0), + float2(0.22672357,0.28430238), + float2(-0.08091671,0.35451925), + float2(-0.32762504,0.15777594), + float2(-0.32762504,-0.15777591), + float2(-0.08091656,-0.35451928), + float2(0.22672352,-0.2843024), + float2(0.6818182,0), + float2(0.614297,0.29582983), + float2(0.42510667,0.5330669), + float2(0.15171885,0.6647236), + float2(-0.15171883,0.6647236), + float2(-0.4251068,0.53306687), + float2(-0.614297,0.29582986), + float2(-0.6818182,0), + float2(-0.614297,-0.29582983), + float2(-0.42510656,-0.53306705), + float2(-0.15171856,-0.66472363), + float2(0.1517192,-0.6647235), + float2(0.4251066,-0.53306705), + float2(0.614297,-0.29582983), + float2(1,0), + float2(0.9555728,0.2947552), + float2(0.82623875,0.5633201), + float2(0.6234898,0.7818315), + float2(0.36534098,0.93087375), + float2(0.07473,0.9972038), + float2(-0.22252095,0.9749279), + float2(-0.50000006,0.8660254), + float2(-0.73305196,0.6801727), + float2(-0.90096885,0.43388382), + float2(-0.98883086,0.14904208), + float2(-0.9888308,-0.14904249), + float2(-0.90096885,-0.43388376), + float2(-0.73305184,-0.6801728), + float2(-0.4999999,-0.86602545), + float2(-0.222521,-0.9749279), + float2(0.07473029,-0.99720377), + float2(0.36534148,-0.9308736), + float2(0.6234897,-0.7818316), + float2(0.8262388,-0.56332), + float2(0.9555729,-0.29475483), +}; + +#endif + +#if defined(KERNEL_VERYLARGE) + +// rings = 5 +// points per ring = 7 +static const int kSampleCount = 71; +static const float2 kDiskKernel[kSampleCount] = { + float2(0,0), + float2(0.2758621,0), + float2(0.1719972,0.21567768), + float2(-0.061385095,0.26894566), + float2(-0.24854316,0.1196921), + float2(-0.24854316,-0.11969208), + float2(-0.061384983,-0.2689457), + float2(0.17199717,-0.21567771), + float2(0.51724136,0), + float2(0.46601835,0.22442262), + float2(0.32249472,0.40439558), + float2(0.11509705,0.50427306), + float2(-0.11509704,0.50427306), + float2(-0.3224948,0.40439552), + float2(-0.46601835,0.22442265), + float2(-0.51724136,0), + float2(-0.46601835,-0.22442262), + float2(-0.32249463,-0.40439564), + float2(-0.11509683,-0.5042731), + float2(0.11509732,-0.504273), + float2(0.32249466,-0.40439564), + float2(0.46601835,-0.22442262), + float2(0.7586207,0), + float2(0.7249173,0.22360738), + float2(0.6268018,0.4273463), + float2(0.47299224,0.59311354), + float2(0.27715522,0.7061801), + float2(0.056691725,0.75649947), + float2(-0.168809,0.7396005), + float2(-0.3793104,0.65698475), + float2(-0.55610836,0.51599306), + float2(-0.6834936,0.32915324), + float2(-0.7501475,0.113066405), + float2(-0.7501475,-0.11306671), + float2(-0.6834936,-0.32915318), + float2(-0.5561083,-0.5159932), + float2(-0.37931028,-0.6569848), + float2(-0.16880904,-0.7396005), + float2(0.056691945,-0.7564994), + float2(0.2771556,-0.7061799), + float2(0.47299215,-0.59311366), + float2(0.62680185,-0.4273462), + float2(0.72491735,-0.22360711), + float2(1,0), + float2(0.9749279,0.22252093), + float2(0.90096885,0.43388376), + float2(0.7818315,0.6234898), + float2(0.6234898,0.7818315), + float2(0.43388364,0.9009689), + float2(0.22252098,0.9749279), + float2(0,1), + float2(-0.22252095,0.9749279), + float2(-0.43388385,0.90096885), + float2(-0.62349,0.7818314), + float2(-0.7818317,0.62348956), + float2(-0.90096885,0.43388382), + float2(-0.9749279,0.22252093), + float2(-1,0), + float2(-0.9749279,-0.22252087), + float2(-0.90096885,-0.43388376), + float2(-0.7818314,-0.6234899), + float2(-0.6234896,-0.7818316), + float2(-0.43388346,-0.900969), + float2(-0.22252055,-0.974928), + float2(0,-1), + float2(0.2225215,-0.9749278), + float2(0.4338835,-0.90096897), + float2(0.6234897,-0.7818316), + float2(0.78183144,-0.62348986), + float2(0.90096885,-0.43388376), + float2(0.9749279,-0.22252086), +}; + +#endif + +#endif // __DISK_KERNELS__ diff --git a/Assets/PostProcessing/Resources/Shaders/DiskKernels.cginc.meta b/Assets/PostProcessing/Resources/Shaders/DiskKernels.cginc.meta new file mode 100644 index 0000000..87e37d8 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/DiskKernels.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: faeb738b5a2c3ff43bd104dd5b1a275c +timeCreated: 1476954194 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.cginc b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.cginc new file mode 100644 index 0000000..f2d1e1d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.cginc @@ -0,0 +1,22 @@ +#ifndef __EYE_ADAPTATION__ +#define __EYE_ADAPTATION__ + +// Optimal values for PS4/GCN +// Using a group size of 32x32 seems to be a bit faster on Kepler/Maxwell +// Don't forget to update 'EyeAdaptationController.cs' if you change these values ! +#define HISTOGRAM_BINS 64 +#define HISTOGRAM_TEXELS HISTOGRAM_BINS / 4 +#define HISTOGRAM_THREAD_X 16 +#define HISTOGRAM_THREAD_Y 16 + +float GetHistogramBinFromLuminance(float value, float2 scaleOffset) +{ + return saturate(log2(value) * scaleOffset.x + scaleOffset.y); +} + +float GetLuminanceFromHistogramBin(float bin, float2 scaleOffset) +{ + return exp2((bin - scaleOffset.y) / scaleOffset.x); +} + +#endif // __EYE_ADAPTATION__ diff --git a/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.cginc.meta b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.cginc.meta new file mode 100644 index 0000000..5881d23 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d2f406cad28afda489b94594fb3ce0af +timeCreated: 1465898178 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.shader b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.shader new file mode 100644 index 0000000..8ec509d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.shader @@ -0,0 +1,218 @@ +Shader "Hidden/Post FX/Eye Adaptation" +{ + Properties + { + _MainTex("Texture", 2D) = "white" {} + } + + CGINCLUDE + + #pragma target 4.5 + #pragma multi_compile __ AUTO_KEY_VALUE + #include "UnityCG.cginc" + #include "Common.cginc" + #include "EyeAdaptation.cginc" + + // Eye adaptation pass + float4 _Params; // x: lowPercent, y: highPercent, z: minBrightness, w: maxBrightness + float2 _Speed; // x: down, y: up + float4 _ScaleOffsetRes; // x: scale, y: offset, w: histogram pass width, h: histogram pass height + float _ExposureCompensation; + + StructuredBuffer _Histogram; + + float GetBinValue(uint index, float maxHistogramValue) + { + return float(_Histogram[index]) * maxHistogramValue; + } + + // Done in the vertex shader + float FindMaxHistogramValue() + { + uint maxValue = 0u; + + for (uint i = 0; i < HISTOGRAM_BINS; i++) + { + uint h = _Histogram[i]; + maxValue = max(maxValue, h); + } + + return float(maxValue); + } + + void FilterLuminance(uint i, float maxHistogramValue, inout float4 filter) + { + float binValue = GetBinValue(i, maxHistogramValue); + + // Filter dark areas + float offset = min(filter.z, binValue); + binValue -= offset; + filter.zw -= offset.xx; + + // Filter highlights + binValue = min(filter.w, binValue); + filter.w -= binValue; + + // Luminance at the bin + float luminance = GetLuminanceFromHistogramBin(float(i) / float(HISTOGRAM_BINS), _ScaleOffsetRes.xy); + + filter.xy += float2(luminance * binValue, binValue); + } + + float GetAverageLuminance(float maxHistogramValue) + { + // Sum of all bins + uint i; + float totalSum = 0.0; + + UNITY_LOOP + for (i = 0; i < HISTOGRAM_BINS; i++) + totalSum += GetBinValue(i, maxHistogramValue); + + // Skip darker and lighter parts of the histogram to stabilize the auto exposure + // x: filtered sum + // y: accumulator + // zw: fractions + float4 filter = float4(0.0, 0.0, totalSum * _Params.xy); + + UNITY_LOOP + for (i = 0; i < HISTOGRAM_BINS; i++) + FilterLuminance(i, maxHistogramValue, filter); + + // Clamp to user brightness range + return clamp(filter.x / max(filter.y, EPSILON), _Params.z, _Params.w); + } + + float GetExposureMultiplier(float avgLuminance) + { + avgLuminance = max(EPSILON, avgLuminance); + + #if AUTO_KEY_VALUE + half keyValue = 1.03 - (2.0 / (2.0 + log2(avgLuminance + 1.0))); + #else + half keyValue = _ExposureCompensation; + #endif + + half exposure = keyValue / avgLuminance; + + return exposure; + } + + float InterpolateExposure(float newExposure, float oldExposure) + { + float delta = newExposure - oldExposure; + float speed = delta > 0.0 ? _Speed.x : _Speed.y; + float exposure = oldExposure + delta * (1.0 - exp2(-unity_DeltaTime.x * speed)); + //float exposure = oldExposure + delta * (unity_DeltaTime.x * speed); + return exposure; + } + + float4 FragAdaptProgressive(VaryingsDefault i) : SV_Target + { + float maxValue = 1.0 / FindMaxHistogramValue(); + float avgLuminance = GetAverageLuminance(maxValue); + float exposure = GetExposureMultiplier(avgLuminance); + float prevExposure = tex2D(_MainTex, (0.5).xx); + exposure = InterpolateExposure(exposure, prevExposure); + return exposure.xxxx; + } + + float4 FragAdaptFixed(VaryingsDefault i) : SV_Target + { + float maxValue = 1.0 / FindMaxHistogramValue(); + float avgLuminance = GetAverageLuminance(maxValue); + float exposure = GetExposureMultiplier(avgLuminance); + return exposure.xxxx; + } + + // ---- Editor stuff + int _DebugWidth; + + struct VaryingsEditorHisto + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float maxValue : TEXCOORD1; + float avgLuminance : TEXCOORD2; + }; + + VaryingsEditorHisto VertEditorHisto(AttributesDefault v) + { + VaryingsEditorHisto o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.maxValue = 1.0 / FindMaxHistogramValue(); + o.avgLuminance = GetAverageLuminance(o.maxValue); + return o; + } + + float4 FragEditorHisto(VaryingsEditorHisto i) : SV_Target + { + const float3 kRangeColor = float3(0.05, 0.4, 0.6); + const float3 kAvgColor = float3(0.8, 0.3, 0.05); + + float4 color = float4(0.0, 0.0, 0.0, 0.7); + + uint ix = (uint)(round(i.uv.x * HISTOGRAM_BINS)); + float bin = saturate(float(_Histogram[ix]) * i.maxValue); + float fill = step(i.uv.y, bin); + + // Min / max brightness markers + float luminanceMin = GetHistogramBinFromLuminance(_Params.z, _ScaleOffsetRes.xy); + float luminanceMax = GetHistogramBinFromLuminance(_Params.w, _ScaleOffsetRes.xy); + + color.rgb += fill.rrr; + + if (i.uv.x > luminanceMin && i.uv.x < luminanceMax) + { + color.rgb = fill.rrr * kRangeColor; + color.rgb += kRangeColor; + } + + // Current average luminance marker + float luminanceAvg = GetHistogramBinFromLuminance(i.avgLuminance, _ScaleOffsetRes.xy); + float avgPx = luminanceAvg * _DebugWidth; + + if (abs(i.pos.x - avgPx) < 2) + color.rgb = kAvgColor; + + return color; + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragAdaptProgressive + + ENDCG + } + + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragAdaptFixed + + ENDCG + } + + Pass + { + CGPROGRAM + + #pragma vertex VertEditorHisto + #pragma fragment FragEditorHisto + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.shader.meta b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.shader.meta new file mode 100644 index 0000000..429c6b6 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/EyeAdaptation.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 81899cddfbc72494497a6db0ae045f2c +timeCreated: 1465903628 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/EyeHistogram.compute b/Assets/PostProcessing/Resources/Shaders/EyeHistogram.compute new file mode 100644 index 0000000..6ae7e4d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/EyeHistogram.compute @@ -0,0 +1,66 @@ +// Put the following line to 0 or comment it to disable vignette weighting +#define USE_VIGNETTE_WEIGHTING 1 + +#include "Common.cginc" +#include "EyeAdaptation.cginc" + +RWStructuredBuffer _Histogram; +Texture2D _Source; + +CBUFFER_START(Params) + float4 _ScaleOffsetRes; // x: scale, y: offset, z: width, w: height +CBUFFER_END + +groupshared uint gs_histogram[HISTOGRAM_BINS]; + +#pragma kernel KEyeHistogram +[numthreads(HISTOGRAM_THREAD_X,HISTOGRAM_THREAD_Y,1)] +void KEyeHistogram(uint2 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadId : SV_GroupThreadID) +{ + // Pretty straightforward implementation of histogram gathering using atomic ops. + // I tried a few methods (no atomic ops / heavy LDS leveraging) but this one turned out to be + // the fastest on desktop (Nvidia - Kepler/Maxwell) and PS4. Still need to try it on GCN/desktop + // but considering it runs very fast on PS4 we can expect it to run well (?). + + const uint localThreadId = groupThreadId.y * HISTOGRAM_THREAD_X + groupThreadId.x; + + // Clears the shared memory + if (localThreadId < HISTOGRAM_BINS) + gs_histogram[localThreadId] = 0u; + + GroupMemoryBarrierWithGroupSync(); + + // Gather local group histogram + if (dispatchThreadId.x < (uint)_ScaleOffsetRes.z && dispatchThreadId.y < (uint)_ScaleOffsetRes.w) + { +#if USE_VIGNETTE_WEIGHTING + // Vignette weighting to put more focus on what's in the center of the screen + float2 uv01 = float2(dispatchThreadId) / float2(_ScaleOffsetRes.z, _ScaleOffsetRes.w); + float2 d = abs(uv01 - (0.5).xx); + float vfactor = Pow2(saturate(1.0 - dot(d, d))); + uint weight = (uint)(64.0 * vfactor); +#else + uint weight = 1u; +#endif + + float3 color = _Source[dispatchThreadId].xyz; + float luminance = Max3(color); // Looks more natural than using a Rec.709 luminance for some reason + float logLuminance = GetHistogramBinFromLuminance(luminance, _ScaleOffsetRes.xy); + uint idx = (uint)(logLuminance * (HISTOGRAM_BINS - 1u)); + InterlockedAdd(gs_histogram[idx], weight); + } + + GroupMemoryBarrierWithGroupSync(); + + // Merge everything + if (localThreadId < HISTOGRAM_BINS) + InterlockedAdd(_Histogram[localThreadId], gs_histogram[localThreadId]); +} + +#pragma kernel KEyeHistogramClear +[numthreads(HISTOGRAM_THREAD_X, 1, 1)] +void KEyeHistogramClear(uint dispatchThreadId : SV_DispatchThreadID) +{ + if (dispatchThreadId < HISTOGRAM_BINS) + _Histogram[dispatchThreadId] = 0u; +} diff --git a/Assets/PostProcessing/Resources/Shaders/EyeHistogram.compute.meta b/Assets/PostProcessing/Resources/Shaders/EyeHistogram.compute.meta new file mode 100644 index 0000000..cab6281 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/EyeHistogram.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e213272ad8ff213409a6e13b5c26b4e4 +timeCreated: 1464341416 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 4 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/FXAA.shader b/Assets/PostProcessing/Resources/Shaders/FXAA.shader new file mode 100644 index 0000000..79525b2 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/FXAA.shader @@ -0,0 +1,90 @@ +Shader "Hidden/Post FX/FXAA" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + #include "Common.cginc" + #include "UberSecondPass.cginc" + #pragma multi_compile __ GRAIN + #pragma multi_compile __ DITHERING + + #if defined(SHADER_API_PS3) + #define FXAA_PS3 1 + + // Shaves off 2 cycles from the shader + #define FXAA_EARLY_EXIT 0 + #elif defined(SHADER_API_XBOX360) + #define FXAA_360 1 + + // Shaves off 10ms from the shader's execution time + #define FXAA_EARLY_EXIT 1 + #elif defined(SHADER_API_SWITCH) + #define FXAA_QUALITY__PRESET 10 + #define FXAA_PC 1 + #else + #define FXAA_PC 1 + #endif + + #define FXAA_HLSL_3 1 + #ifndef FXAA_QUALITY__PRESET + #define FXAA_QUALITY__PRESET 39 + #endif + + #define FXAA_GREEN_AS_LUMA 1 + + #pragma target 3.0 + #include "FXAA3.cginc" + + float3 _QualitySettings; + float4 _ConsoleSettings; + + half4 Frag(VaryingsDefault i) : SV_Target + { + const float4 consoleUV = i.uv.xyxy + 0.5 * float4(-_MainTex_TexelSize.xy, _MainTex_TexelSize.xy); + const float4 consoleSubpixelFrame = _ConsoleSettings.x * float4(-1.0, -1.0, 1.0, 1.0) * + _MainTex_TexelSize.xyxy; + + const float4 consoleSubpixelFramePS3 = float4(-2.0, -2.0, 2.0, 2.0) * _MainTex_TexelSize.xyxy; + const float4 consoleSubpixelFrameXBOX = float4(8.0, 8.0, -4.0, -4.0) * _MainTex_TexelSize.xyxy; + + #if defined(SHADER_API_XBOX360) + const float4 consoleConstants = float4(1.0, -1.0, 0.25, -0.25); + #else + const float4 consoleConstants = float4(0.0, 0.0, 0.0, 0.0); + #endif + + half4 color = FxaaPixelShader( + UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST), + UnityStereoScreenSpaceUVAdjust(consoleUV, _MainTex_ST), + _MainTex, _MainTex, _MainTex, _MainTex_TexelSize.xy, + consoleSubpixelFrame, consoleSubpixelFramePS3, consoleSubpixelFrameXBOX, + _QualitySettings.x, _QualitySettings.y, _QualitySettings.z, + _ConsoleSettings.y, _ConsoleSettings.z, _ConsoleSettings.w, consoleConstants); + + color.rgb = UberSecondPass(color.rgb, i.uv); + + return half4(color.rgb, 1.0); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment Frag + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/FXAA.shader.meta b/Assets/PostProcessing/Resources/Shaders/FXAA.shader.meta new file mode 100644 index 0000000..a7aab28 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/FXAA.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 291f0d5b6045f4646847c59b4ce13ac5 +timeCreated: 1462350540 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/FXAA3.cginc b/Assets/PostProcessing/Resources/Shaders/FXAA3.cginc new file mode 100644 index 0000000..8b70f5d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/FXAA3.cginc @@ -0,0 +1,2073 @@ +#ifndef __FXAA3_INC__ +#define __FXAA3_INC__ + +/*============================================================================ + + +NVIDIA FXAA 3.11 by TIMOTHY LOTTES + + +------------------------------------------------------------------------------ +COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED. +------------------------------------------------------------------------------ +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED +*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA +OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR +CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, +OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE +THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +------------------------------------------------------------------------------ +INTEGRATION CHECKLIST +------------------------------------------------------------------------------ +(1.) +In the shader source, setup defines for the desired configuration. +When providing multiple shaders (for different presets), +simply setup the defines differently in multiple files. +Example, + +#define FXAA_PC 1 +#define FXAA_HLSL_5 1 +#define FXAA_QUALITY__PRESET 12 + +Or, + +#define FXAA_360 1 + +Or, + +#define FXAA_PS3 1 + +Etc. + +(2.) +Then include this file, + +#include "Fxaa3_11.h" + +(3.) +Then call the FXAA pixel shader from within your desired shader. +Look at the FXAA Quality FxaaPixelShader() for docs on inputs. +As for FXAA 3.11 all inputs for all shaders are the same +to enable easy porting between platforms. + +return FxaaPixelShader(...); + +(4.) +Insure pass prior to FXAA outputs RGBL (see next section). +Or use, + +#define FXAA_GREEN_AS_LUMA 1 + +(5.) +Setup engine to provide the following constants +which are used in the FxaaPixelShader() inputs, + +FxaaFloat2 fxaaQualityRcpFrame, +FxaaFloat4 fxaaConsoleRcpFrameOpt, +FxaaFloat4 fxaaConsoleRcpFrameOpt2, +FxaaFloat4 fxaaConsole360RcpFrameOpt2, +FxaaFloat fxaaQualitySubpix, +FxaaFloat fxaaQualityEdgeThreshold, +FxaaFloat fxaaQualityEdgeThresholdMin, +FxaaFloat fxaaConsoleEdgeSharpness, +FxaaFloat fxaaConsoleEdgeThreshold, +FxaaFloat fxaaConsoleEdgeThresholdMin, +FxaaFloat4 fxaaConsole360ConstDir + +Look at the FXAA Quality FxaaPixelShader() for docs on inputs. + +(6.) +Have FXAA vertex shader run as a full screen triangle, +and output "pos" and "fxaaConsolePosPos" +such that inputs in the pixel shader provide, + +// {xy} = center of pixel +FxaaFloat2 pos, + +// {xy__} = upper left of pixel +// {__zw} = lower right of pixel +FxaaFloat4 fxaaConsolePosPos, + +(7.) +Insure the texture sampler(s) used by FXAA are set to bilinear filtering. + + +------------------------------------------------------------------------------ +INTEGRATION - RGBL AND COLORSPACE +------------------------------------------------------------------------------ +FXAA3 requires RGBL as input unless the following is set, + +#define FXAA_GREEN_AS_LUMA 1 + +In which case the engine uses green in place of luma, +and requires RGB input is in a non-linear colorspace. + +RGB should be LDR (low dynamic range). +Specifically do FXAA after tonemapping. + +RGB data as returned by a texture fetch can be non-linear, +or linear when FXAA_GREEN_AS_LUMA is not set. +Note an "sRGB format" texture counts as linear, +because the result of a texture fetch is linear data. +Regular "RGBA8" textures in the sRGB colorspace are non-linear. + +If FXAA_GREEN_AS_LUMA is not set, +luma must be stored in the alpha channel prior to running FXAA. +This luma should be in a perceptual space (could be gamma 2.0). +Example pass before FXAA where output is gamma 2.0 encoded, + +color.rgb = ToneMap(color.rgb); // linear color output +color.rgb = sqrt(color.rgb); // gamma 2.0 color output +return color; + +To use FXAA, + +color.rgb = ToneMap(color.rgb); // linear color output +color.rgb = sqrt(color.rgb); // gamma 2.0 color output +color.a = dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114)); // compute luma +return color; + +Another example where output is linear encoded, +say for instance writing to an sRGB formated render target, +where the render target does the conversion back to sRGB after blending, + +color.rgb = ToneMap(color.rgb); // linear color output +return color; + +To use FXAA, + +color.rgb = ToneMap(color.rgb); // linear color output +color.a = sqrt(dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114))); // compute luma +return color; + +Getting luma correct is required for the algorithm to work correctly. + + +------------------------------------------------------------------------------ +BEING LINEARLY CORRECT? +------------------------------------------------------------------------------ +Applying FXAA to a framebuffer with linear RGB color will look worse. +This is very counter intuitive, but happends to be true in this case. +The reason is because dithering artifacts will be more visiable +in a linear colorspace. + + +------------------------------------------------------------------------------ +COMPLEX INTEGRATION +------------------------------------------------------------------------------ +Q. What if the engine is blending into RGB before wanting to run FXAA? + +A. In the last opaque pass prior to FXAA, +have the pass write out luma into alpha. +Then blend into RGB only. +FXAA should be able to run ok +assuming the blending pass did not any add aliasing. +This should be the common case for particles and common blending passes. + +A. Or use FXAA_GREEN_AS_LUMA. + +============================================================================*/ + +/*============================================================================ + +INTEGRATION KNOBS + +============================================================================*/ +// +// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE). +// FXAA_360_OPT is a prototype for the new optimized 360 version. +// +// 1 = Use API. +// 0 = Don't use API. +// +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_PS3 +#define FXAA_PS3 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_360 +#define FXAA_360 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_360_OPT +#define FXAA_360_OPT 0 +#endif +/*==========================================================================*/ +#ifndef FXAA_PC +// +// FXAA Quality +// The high quality PC algorithm. +// +#define FXAA_PC 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_PC_CONSOLE +// +// The console algorithm for PC is included +// for developers targeting really low spec machines. +// Likely better to just run FXAA_PC, and use a really low preset. +// +#define FXAA_PC_CONSOLE 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_GLSL_120 +#define FXAA_GLSL_120 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_GLSL_130 +#define FXAA_GLSL_130 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_HLSL_3 +#define FXAA_HLSL_3 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_HLSL_4 +#define FXAA_HLSL_4 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_HLSL_5 +#define FXAA_HLSL_5 0 +#endif +/*==========================================================================*/ +#ifndef FXAA_GREEN_AS_LUMA +// +// For those using non-linear color, +// and either not able to get luma in alpha, or not wanting to, +// this enables FXAA to run using green as a proxy for luma. +// So with this enabled, no need to pack luma in alpha. +// +// This will turn off AA on anything which lacks some amount of green. +// Pure red and blue or combination of only R and B, will get no AA. +// +// Might want to lower the settings for both, +// fxaaConsoleEdgeThresholdMin +// fxaaQualityEdgeThresholdMin +// In order to insure AA does not get turned off on colors +// which contain a minor amount of green. +// +// 1 = On. +// 0 = Off. +// +#define FXAA_GREEN_AS_LUMA 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_EARLY_EXIT +// +// Controls algorithm's early exit path. +// On PS3 turning this ON adds 2 cycles to the shader. +// On 360 turning this OFF adds 10ths of a millisecond to the shader. +// Turning this off on console will result in a more blurry image. +// So this defaults to on. +// +// 1 = On. +// 0 = Off. +// +#define FXAA_EARLY_EXIT 1 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_DISCARD +// +// Only valid for PC OpenGL currently. +// Probably will not work when FXAA_GREEN_AS_LUMA = 1. +// +// 1 = Use discard on pixels which don't need AA. +// For APIs which enable concurrent TEX+ROP from same surface. +// 0 = Return unchanged color on pixels which don't need AA. +// +#define FXAA_DISCARD 0 +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_FAST_PIXEL_OFFSET +// +// Used for GLSL 120 only. +// +// 1 = GL API supports fast pixel offsets +// 0 = do not use fast pixel offsets +// +#ifdef GL_EXT_gpu_shader4 +#define FXAA_FAST_PIXEL_OFFSET 1 +#endif +#ifdef GL_NV_gpu_shader5 +#define FXAA_FAST_PIXEL_OFFSET 1 +#endif +#ifdef GL_ARB_gpu_shader5 +#define FXAA_FAST_PIXEL_OFFSET 1 +#endif +#ifndef FXAA_FAST_PIXEL_OFFSET +#define FXAA_FAST_PIXEL_OFFSET 0 +#endif +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_GATHER4_ALPHA +// +// 1 = API supports gather4 on alpha channel. +// 0 = API does not support gather4 on alpha channel. +// +#if (FXAA_HLSL_5 == 1) +#define FXAA_GATHER4_ALPHA 1 +#endif +#ifdef GL_ARB_gpu_shader5 +#define FXAA_GATHER4_ALPHA 1 +#endif +#ifdef GL_NV_gpu_shader5 +#define FXAA_GATHER4_ALPHA 1 +#endif +#ifndef FXAA_GATHER4_ALPHA +#define FXAA_GATHER4_ALPHA 0 +#endif +#endif + +/*============================================================================ +FXAA CONSOLE PS3 - TUNING KNOBS +============================================================================*/ +#ifndef FXAA_CONSOLE__PS3_EDGE_SHARPNESS +// +// Consoles the sharpness of edges on PS3 only. +// Non-PS3 tuning is done with shader input. +// +// Due to the PS3 being ALU bound, +// there are only two safe values here: 4 and 8. +// These options use the shaders ability to a free *|/ by 2|4|8. +// +// 8.0 is sharper +// 4.0 is softer +// 2.0 is really soft (good for vector graphics inputs) +// +#if 1 +#define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 8.0 +#endif +#if 0 +#define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 4.0 +#endif +#if 0 +#define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 2.0 +#endif +#endif +/*--------------------------------------------------------------------------*/ +#ifndef FXAA_CONSOLE__PS3_EDGE_THRESHOLD +// +// Only effects PS3. +// Non-PS3 tuning is done with shader input. +// +// The minimum amount of local contrast required to apply algorithm. +// The console setting has a different mapping than the quality setting. +// +// This only applies when FXAA_EARLY_EXIT is 1. +// +// Due to the PS3 being ALU bound, +// there are only two safe values here: 0.25 and 0.125. +// These options use the shaders ability to a free *|/ by 2|4|8. +// +// 0.125 leaves less aliasing, but is softer +// 0.25 leaves more aliasing, and is sharper +// +#if 1 +#define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.125 +#else +#define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.25 +#endif +#endif + +/*============================================================================ +FXAA QUALITY - TUNING KNOBS +------------------------------------------------------------------------------ +NOTE the other tuning knobs are now in the shader function inputs! +============================================================================*/ +#ifndef FXAA_QUALITY__PRESET +// +// Choose the quality preset. +// This needs to be compiled into the shader as it effects code. +// Best option to include multiple presets is to +// in each shader define the preset, then include this file. +// +// OPTIONS +// ----------------------------------------------------------------------- +// 10 to 15 - default medium dither (10=fastest, 15=highest quality) +// 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality) +// 39 - no dither, very expensive +// +// NOTES +// ----------------------------------------------------------------------- +// 12 = slightly faster then FXAA 3.9 and higher edge quality (default) +// 13 = about same speed as FXAA 3.9 and better than 12 +// 23 = closest to FXAA 3.9 visually and performance wise +// _ = the lowest digit is directly related to performance +// _ = the highest digit is directly related to style +// +#define FXAA_QUALITY__PRESET 12 +#endif + + +/*============================================================================ + +FXAA QUALITY - PRESETS + +============================================================================*/ + +/*============================================================================ +FXAA QUALITY - MEDIUM DITHER PRESETS +============================================================================*/ +#if (FXAA_QUALITY__PRESET == 10) +#define FXAA_QUALITY__PS 3 +#define FXAA_QUALITY__P0 1.5 +#define FXAA_QUALITY__P1 3.0 +#define FXAA_QUALITY__P2 12.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 11) +#define FXAA_QUALITY__PS 4 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 3.0 +#define FXAA_QUALITY__P3 12.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 12) +#define FXAA_QUALITY__PS 5 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 4.0 +#define FXAA_QUALITY__P4 12.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 13) +#define FXAA_QUALITY__PS 6 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 4.0 +#define FXAA_QUALITY__P5 12.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 14) +#define FXAA_QUALITY__PS 7 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 4.0 +#define FXAA_QUALITY__P6 12.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 15) +#define FXAA_QUALITY__PS 8 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 2.0 +#define FXAA_QUALITY__P6 4.0 +#define FXAA_QUALITY__P7 12.0 +#endif + +/*============================================================================ +FXAA QUALITY - LOW DITHER PRESETS +============================================================================*/ +#if (FXAA_QUALITY__PRESET == 20) +#define FXAA_QUALITY__PS 3 +#define FXAA_QUALITY__P0 1.5 +#define FXAA_QUALITY__P1 2.0 +#define FXAA_QUALITY__P2 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 21) +#define FXAA_QUALITY__PS 4 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 22) +#define FXAA_QUALITY__PS 5 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 23) +#define FXAA_QUALITY__PS 6 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 24) +#define FXAA_QUALITY__PS 7 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 3.0 +#define FXAA_QUALITY__P6 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 25) +#define FXAA_QUALITY__PS 8 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 2.0 +#define FXAA_QUALITY__P6 4.0 +#define FXAA_QUALITY__P7 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 26) +#define FXAA_QUALITY__PS 9 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 2.0 +#define FXAA_QUALITY__P6 2.0 +#define FXAA_QUALITY__P7 4.0 +#define FXAA_QUALITY__P8 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 27) +#define FXAA_QUALITY__PS 10 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 2.0 +#define FXAA_QUALITY__P6 2.0 +#define FXAA_QUALITY__P7 2.0 +#define FXAA_QUALITY__P8 4.0 +#define FXAA_QUALITY__P9 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 28) +#define FXAA_QUALITY__PS 11 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 2.0 +#define FXAA_QUALITY__P6 2.0 +#define FXAA_QUALITY__P7 2.0 +#define FXAA_QUALITY__P8 2.0 +#define FXAA_QUALITY__P9 4.0 +#define FXAA_QUALITY__P10 8.0 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PRESET == 29) +#define FXAA_QUALITY__PS 12 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.5 +#define FXAA_QUALITY__P2 2.0 +#define FXAA_QUALITY__P3 2.0 +#define FXAA_QUALITY__P4 2.0 +#define FXAA_QUALITY__P5 2.0 +#define FXAA_QUALITY__P6 2.0 +#define FXAA_QUALITY__P7 2.0 +#define FXAA_QUALITY__P8 2.0 +#define FXAA_QUALITY__P9 2.0 +#define FXAA_QUALITY__P10 4.0 +#define FXAA_QUALITY__P11 8.0 +#endif + +/*============================================================================ +FXAA QUALITY - EXTREME QUALITY +============================================================================*/ +#if (FXAA_QUALITY__PRESET == 39) +#define FXAA_QUALITY__PS 12 +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.0 +#define FXAA_QUALITY__P2 1.0 +#define FXAA_QUALITY__P3 1.0 +#define FXAA_QUALITY__P4 1.0 +#define FXAA_QUALITY__P5 1.5 +#define FXAA_QUALITY__P6 2.0 +#define FXAA_QUALITY__P7 2.0 +#define FXAA_QUALITY__P8 2.0 +#define FXAA_QUALITY__P9 2.0 +#define FXAA_QUALITY__P10 4.0 +#define FXAA_QUALITY__P11 8.0 +#endif + + + +/*============================================================================ + +API PORTING + +============================================================================*/ +#if (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1) +#define FxaaBool bool +#define FxaaDiscard discard +#define FxaaFloat float +#define FxaaFloat2 vec2 +#define FxaaFloat3 vec3 +#define FxaaFloat4 vec4 +#define FxaaHalf float +#define FxaaHalf2 vec2 +#define FxaaHalf3 vec3 +#define FxaaHalf4 vec4 +#define FxaaInt2 ivec2 +#define FxaaSat(x) clamp(x, 0.0, 1.0) +#define FxaaTex sampler2D +#else +#define FxaaBool bool +#define FxaaDiscard clip(-1) +#define FxaaFloat float +#define FxaaFloat2 float2 +#define FxaaFloat3 float3 +#define FxaaFloat4 float4 +#define FxaaHalf half +#define FxaaHalf2 half2 +#define FxaaHalf3 half3 +#define FxaaHalf4 half4 +#define FxaaSat(x) saturate(x) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_GLSL_120 == 1) +// Requires, +// #version 120 +// And at least, +// #extension GL_EXT_gpu_shader4 : enable +// (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9) +#define FxaaTexTop(t, p) texture2DLod(t, p, 0.0) +#if (FXAA_FAST_PIXEL_OFFSET == 1) +#define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o) +#else +#define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0) +#endif +#if (FXAA_GATHER4_ALPHA == 1) +// use #extension GL_ARB_gpu_shader5 : enable +#define FxaaTexAlpha4(t, p) textureGather(t, p, 3) +#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3) +#define FxaaTexGreen4(t, p) textureGather(t, p, 1) +#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1) +#endif +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_GLSL_130 == 1) +// Requires "#version 130" or better +#define FxaaTexTop(t, p) textureLod(t, p, 0.0) +#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) +#if (FXAA_GATHER4_ALPHA == 1) +// use #extension GL_ARB_gpu_shader5 : enable +#define FxaaTexAlpha4(t, p) textureGather(t, p, 3) +#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3) +#define FxaaTexGreen4(t, p) textureGather(t, p, 1) +#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1) +#endif +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1) || (FXAA_PS3 == 1) +#define FxaaInt2 float2 +#define FxaaTex sampler2D +#define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0)) +#define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0)) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_HLSL_4 == 1) +#define FxaaInt2 int2 +struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) +#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_HLSL_5 == 1) +#define FxaaInt2 int2 +struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) +#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) +#define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p) +#define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o) +#define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p) +#define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o) +#endif + + +/*============================================================================ +GREEN AS LUMA OPTION SUPPORT FUNCTION +============================================================================*/ +#if (FXAA_GREEN_AS_LUMA == 0) +FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; } +#else +FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; } +#endif + + + + +/*============================================================================ + +FXAA3 QUALITY - PC + +============================================================================*/ +#if (FXAA_PC == 1) +/*--------------------------------------------------------------------------*/ +FxaaFloat4 FxaaPixelShader( + // + // Use noperspective interpolation here (turn off perspective interpolation). + // {xy} = center of pixel + FxaaFloat2 pos, + // + // Used only for FXAA Console, and not used on the 360 version. + // Use noperspective interpolation here (turn off perspective interpolation). + // {xy__} = upper left of pixel + // {__zw} = lower right of pixel + FxaaFloat4 fxaaConsolePosPos, + // + // Input color texture. + // {rgb_} = color in linear or perceptual color space + // if (FXAA_GREEN_AS_LUMA == 0) + // {___a} = luma in perceptual color space (not linear) + FxaaTex tex, + // + // Only used on the optimized 360 version of FXAA Console. + // For everything but 360, just use the same input here as for "tex". + // For 360, same texture, just alias with a 2nd sampler. + // This sampler needs to have an exponent bias of -1. + FxaaTex fxaaConsole360TexExpBiasNegOne, + // + // Only used on the optimized 360 version of FXAA Console. + // For everything but 360, just use the same input here as for "tex". + // For 360, same texture, just alias with a 3nd sampler. + // This sampler needs to have an exponent bias of -2. + FxaaTex fxaaConsole360TexExpBiasNegTwo, + // + // Only used on FXAA Quality. + // This must be from a constant/uniform. + // {x_} = 1.0/screenWidthInPixels + // {_y} = 1.0/screenHeightInPixels + FxaaFloat2 fxaaQualityRcpFrame, + // + // Only used on FXAA Console. + // This must be from a constant/uniform. + // This effects sub-pixel AA quality and inversely sharpness. + // Where N ranges between, + // N = 0.50 (default) + // N = 0.33 (sharper) + // {x___} = -N/screenWidthInPixels + // {_y__} = -N/screenHeightInPixels + // {__z_} = N/screenWidthInPixels + // {___w} = N/screenHeightInPixels + FxaaFloat4 fxaaConsoleRcpFrameOpt, + // + // Only used on FXAA Console. + // Not used on 360, but used on PS3 and PC. + // This must be from a constant/uniform. + // {x___} = -2.0/screenWidthInPixels + // {_y__} = -2.0/screenHeightInPixels + // {__z_} = 2.0/screenWidthInPixels + // {___w} = 2.0/screenHeightInPixels + FxaaFloat4 fxaaConsoleRcpFrameOpt2, + // + // Only used on FXAA Console. + // Only used on 360 in place of fxaaConsoleRcpFrameOpt2. + // This must be from a constant/uniform. + // {x___} = 8.0/screenWidthInPixels + // {_y__} = 8.0/screenHeightInPixels + // {__z_} = -4.0/screenWidthInPixels + // {___w} = -4.0/screenHeightInPixels + FxaaFloat4 fxaaConsole360RcpFrameOpt2, + // + // Only used on FXAA Quality. + // This used to be the FXAA_QUALITY__SUBPIX define. + // It is here now to allow easier tuning. + // Choose the amount of sub-pixel aliasing removal. + // This can effect sharpness. + // 1.00 - upper limit (softer) + // 0.75 - default amount of filtering + // 0.50 - lower limit (sharper, less sub-pixel aliasing removal) + // 0.25 - almost off + // 0.00 - completely off + FxaaFloat fxaaQualitySubpix, + // + // Only used on FXAA Quality. + // This used to be the FXAA_QUALITY__EDGE_THRESHOLD define. + // It is here now to allow easier tuning. + // The minimum amount of local contrast required to apply algorithm. + // 0.333 - too little (faster) + // 0.250 - low quality + // 0.166 - default + // 0.125 - high quality + // 0.063 - overkill (slower) + FxaaFloat fxaaQualityEdgeThreshold, + // + // Only used on FXAA Quality. + // This used to be the FXAA_QUALITY__EDGE_THRESHOLD_MIN define. + // It is here now to allow easier tuning. + // Trims the algorithm from processing darks. + // 0.0833 - upper limit (default, the start of visible unfiltered edges) + // 0.0625 - high quality (faster) + // 0.0312 - visible limit (slower) + // Special notes when using FXAA_GREEN_AS_LUMA, + // Likely want to set this to zero. + // As colors that are mostly not-green + // will appear very dark in the green channel! + // Tune by looking at mostly non-green content, + // then start at zero and increase until aliasing is a problem. + FxaaFloat fxaaQualityEdgeThresholdMin, + // + // Only used on FXAA Console. + // This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define. + // It is here now to allow easier tuning. + // This does not effect PS3, as this needs to be compiled in. + // Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3. + // Due to the PS3 being ALU bound, + // there are only three safe values here: 2 and 4 and 8. + // These options use the shaders ability to a free *|/ by 2|4|8. + // For all other platforms can be a non-power of two. + // 8.0 is sharper (default!!!) + // 4.0 is softer + // 2.0 is really soft (good only for vector graphics inputs) + FxaaFloat fxaaConsoleEdgeSharpness, + // + // Only used on FXAA Console. + // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define. + // It is here now to allow easier tuning. + // This does not effect PS3, as this needs to be compiled in. + // Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3. + // Due to the PS3 being ALU bound, + // there are only two safe values here: 1/4 and 1/8. + // These options use the shaders ability to a free *|/ by 2|4|8. + // The console setting has a different mapping than the quality setting. + // Other platforms can use other values. + // 0.125 leaves less aliasing, but is softer (default!!!) + // 0.25 leaves more aliasing, and is sharper + FxaaFloat fxaaConsoleEdgeThreshold, + // + // Only used on FXAA Console. + // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define. + // It is here now to allow easier tuning. + // Trims the algorithm from processing darks. + // The console setting has a different mapping than the quality setting. + // This only applies when FXAA_EARLY_EXIT is 1. + // This does not apply to PS3, + // PS3 was simplified to avoid more shader instructions. + // 0.06 - faster but more aliasing in darks + // 0.05 - default + // 0.04 - slower and less aliasing in darks + // Special notes when using FXAA_GREEN_AS_LUMA, + // Likely want to set this to zero. + // As colors that are mostly not-green + // will appear very dark in the green channel! + // Tune by looking at mostly non-green content, + // then start at zero and increase until aliasing is a problem. + FxaaFloat fxaaConsoleEdgeThresholdMin, + // + // Extra constants for 360 FXAA Console only. + // Use zeros or anything else for other platforms. + // These must be in physical constant registers and NOT immedates. + // Immedates will result in compiler un-optimizing. + // {xyzw} = float4(1.0, -1.0, 0.25, -0.25) + FxaaFloat4 fxaaConsole360ConstDir +) { + /*--------------------------------------------------------------------------*/ + FxaaFloat2 posM; + posM.x = pos.x; + posM.y = pos.y; +#if (FXAA_GATHER4_ALPHA == 1) +#if (FXAA_DISCARD == 0) + FxaaFloat4 rgbyM = FxaaTexTop(tex, posM); +#if (FXAA_GREEN_AS_LUMA == 0) +#define lumaM rgbyM.w +#else +#define lumaM rgbyM.y +#endif +#endif +#if (FXAA_GREEN_AS_LUMA == 0) + FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM); + FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1)); +#else + FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM); + FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1)); +#endif +#if (FXAA_DISCARD == 1) +#define lumaM luma4A.w +#endif +#define lumaE luma4A.z +#define lumaS luma4A.x +#define lumaSE luma4A.y +#define lumaNW luma4B.w +#define lumaN luma4B.z +#define lumaW luma4B.x +#else + FxaaFloat4 rgbyM = FxaaTexTop(tex, posM); +#if (FXAA_GREEN_AS_LUMA == 0) +#define lumaM rgbyM.w +#else +#define lumaM rgbyM.y +#endif + FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(0, 1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, 0), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(0, -1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy)); +#endif + /*--------------------------------------------------------------------------*/ + FxaaFloat maxSM = max(lumaS, lumaM); + FxaaFloat minSM = min(lumaS, lumaM); + FxaaFloat maxESM = max(lumaE, maxSM); + FxaaFloat minESM = min(lumaE, minSM); + FxaaFloat maxWN = max(lumaN, lumaW); + FxaaFloat minWN = min(lumaN, lumaW); + FxaaFloat rangeMax = max(maxWN, maxESM); + FxaaFloat rangeMin = min(minWN, minESM); + FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; + FxaaFloat range = rangeMax - rangeMin; + FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); + FxaaBool earlyExit = range < rangeMaxClamped; + /*--------------------------------------------------------------------------*/ + if (earlyExit) +#if (FXAA_DISCARD == 1) + FxaaDiscard; +#else + return rgbyM; +#endif + /*--------------------------------------------------------------------------*/ +#if (FXAA_GATHER4_ALPHA == 0) + FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, -1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, 1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy)); +#else + FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy)); + FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy)); +#endif + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaNS = lumaN + lumaS; + FxaaFloat lumaWE = lumaW + lumaE; + FxaaFloat subpixRcpRange = 1.0 / range; + FxaaFloat subpixNSWE = lumaNS + lumaWE; + FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS; + FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE; + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaNESE = lumaNE + lumaSE; + FxaaFloat lumaNWNE = lumaNW + lumaNE; + FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE; + FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE; + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaNWSW = lumaNW + lumaSW; + FxaaFloat lumaSWSE = lumaSW + lumaSE; + FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); + FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); + FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; + FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE; + FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4; + FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4; + /*--------------------------------------------------------------------------*/ + FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE; + FxaaFloat lengthSign = fxaaQualityRcpFrame.x; + FxaaBool horzSpan = edgeHorz >= edgeVert; + FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; + /*--------------------------------------------------------------------------*/ + if (!horzSpan) lumaN = lumaW; + if (!horzSpan) lumaS = lumaE; + if (horzSpan) lengthSign = fxaaQualityRcpFrame.y; + FxaaFloat subpixB = (subpixA * (1.0 / 12.0)) - lumaM; + /*--------------------------------------------------------------------------*/ + FxaaFloat gradientN = lumaN - lumaM; + FxaaFloat gradientS = lumaS - lumaM; + FxaaFloat lumaNN = lumaN + lumaM; + FxaaFloat lumaSS = lumaS + lumaM; + FxaaBool pairN = abs(gradientN) >= abs(gradientS); + FxaaFloat gradient = max(abs(gradientN), abs(gradientS)); + if (pairN) lengthSign = -lengthSign; + FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); + /*--------------------------------------------------------------------------*/ + FxaaFloat2 posB; + posB.x = posM.x; + posB.y = posM.y; + FxaaFloat2 offNP; + offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; + offNP.y = (horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; + if (!horzSpan) posB.x += lengthSign * 0.5; + if (horzSpan) posB.y += lengthSign * 0.5; + /*--------------------------------------------------------------------------*/ + FxaaFloat2 posN; + posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; + posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; + FxaaFloat2 posP; + posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; + posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; + FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0; + FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); + FxaaFloat subpixE = subpixC * subpixC; + FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); + /*--------------------------------------------------------------------------*/ + if (!pairN) lumaNN = lumaSS; + FxaaFloat gradientScaled = gradient * 1.0 / 4.0; + FxaaFloat lumaMM = lumaM - lumaNN * 0.5; + FxaaFloat subpixF = subpixD * subpixE; + FxaaBool lumaMLTZero = lumaMM < 0.0; + /*--------------------------------------------------------------------------*/ + lumaEndN -= lumaNN * 0.5; + lumaEndP -= lumaNN * 0.5; + FxaaBool doneN = abs(lumaEndN) >= gradientScaled; + FxaaBool doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; + FxaaBool doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; + /*--------------------------------------------------------------------------*/ + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P2; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P2; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 3) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P3; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P3; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 4) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P4; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P4; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 5) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P5; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P5; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 6) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P6; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P6; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 7) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P7; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P7; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 8) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P8; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P8; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 9) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P9; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P9; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 10) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P10; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P10; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 11) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P11; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P11; + /*--------------------------------------------------------------------------*/ +#if (FXAA_QUALITY__PS > 12) + if (doneNP) + { + if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); + if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); + if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; + if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; + doneN = abs(lumaEndN) >= gradientScaled; + doneP = abs(lumaEndP) >= gradientScaled; + if (!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12; + if (!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12; + doneNP = (!doneN) || (!doneP); + if (!doneP) posP.x += offNP.x * FXAA_QUALITY__P12; + if (!doneP) posP.y += offNP.y * FXAA_QUALITY__P12; + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } +#endif + /*--------------------------------------------------------------------------*/ + } + /*--------------------------------------------------------------------------*/ + FxaaFloat dstN = posM.x - posN.x; + FxaaFloat dstP = posP.x - posM.x; + if (!horzSpan) dstN = posM.y - posN.y; + if (!horzSpan) dstP = posP.y - posM.y; + /*--------------------------------------------------------------------------*/ + FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; + FxaaFloat spanLength = (dstP + dstN); + FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; + FxaaFloat spanLengthRcp = 1.0 / spanLength; + /*--------------------------------------------------------------------------*/ + FxaaBool directionN = dstN < dstP; + FxaaFloat dst = min(dstN, dstP); + FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP; + FxaaFloat subpixG = subpixF * subpixF; + FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5; + FxaaFloat subpixH = subpixG * fxaaQualitySubpix; + /*--------------------------------------------------------------------------*/ + FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0; + FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH); + if (!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; + if (horzSpan) posM.y += pixelOffsetSubpix * lengthSign; +#if (FXAA_DISCARD == 1) + return FxaaTexTop(tex, posM); +#else + return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM); +#endif +} +/*==========================================================================*/ +#endif + + + + +/*============================================================================ + +FXAA3 CONSOLE - PC VERSION + +------------------------------------------------------------------------------ +Instead of using this on PC, I'd suggest just using FXAA Quality with +#define FXAA_QUALITY__PRESET 10 +Or +#define FXAA_QUALITY__PRESET 20 +Either are higher qualilty and almost as fast as this on modern PC GPUs. +============================================================================*/ +#if (FXAA_PC_CONSOLE == 1) +/*--------------------------------------------------------------------------*/ +FxaaFloat4 FxaaPixelShader( + // See FXAA Quality FxaaPixelShader() source for docs on Inputs! + FxaaFloat2 pos, + FxaaFloat4 fxaaConsolePosPos, + FxaaTex tex, + FxaaTex fxaaConsole360TexExpBiasNegOne, + FxaaTex fxaaConsole360TexExpBiasNegTwo, + FxaaFloat2 fxaaQualityRcpFrame, + FxaaFloat4 fxaaConsoleRcpFrameOpt, + FxaaFloat4 fxaaConsoleRcpFrameOpt2, + FxaaFloat4 fxaaConsole360RcpFrameOpt2, + FxaaFloat fxaaQualitySubpix, + FxaaFloat fxaaQualityEdgeThreshold, + FxaaFloat fxaaQualityEdgeThresholdMin, + FxaaFloat fxaaConsoleEdgeSharpness, + FxaaFloat fxaaConsoleEdgeThreshold, + FxaaFloat fxaaConsoleEdgeThresholdMin, + FxaaFloat4 fxaaConsole360ConstDir +) +{ + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy)); + FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw)); + FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy)); + FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw)); + /*--------------------------------------------------------------------------*/ + FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy); +#if (FXAA_GREEN_AS_LUMA == 0) + FxaaFloat lumaM = rgbyM.w; +#else + FxaaFloat lumaM = rgbyM.y; +#endif + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw); + lumaNe += 1.0 / 384.0; + FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw); + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe); + FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe); + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw); + FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw); + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold; + /*--------------------------------------------------------------------------*/ + FxaaFloat lumaMinM = min(lumaMin, lumaM); + FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled); + FxaaFloat lumaMaxM = max(lumaMax, lumaM); + FxaaFloat dirSwMinusNe = lumaSw - lumaNe; + FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM; + FxaaFloat dirSeMinusNw = lumaSe - lumaNw; + if (lumaMaxSubMinM < lumaMaxScaledClamped) return rgbyM; + /*--------------------------------------------------------------------------*/ + FxaaFloat2 dir; + dir.x = dirSwMinusNe + dirSeMinusNw; + dir.y = dirSwMinusNe - dirSeMinusNw; + /*--------------------------------------------------------------------------*/ + FxaaFloat2 dir1 = normalize(dir.xy); + FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw); + FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw); + /*--------------------------------------------------------------------------*/ + FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness; + FxaaFloat2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0); + /*--------------------------------------------------------------------------*/ + FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * fxaaConsoleRcpFrameOpt2.zw); + FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * fxaaConsoleRcpFrameOpt2.zw); + /*--------------------------------------------------------------------------*/ + FxaaFloat4 rgbyA = rgbyN1 + rgbyP1; + FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25); + /*--------------------------------------------------------------------------*/ +#if (FXAA_GREEN_AS_LUMA == 0) + FxaaBool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax); +#else + FxaaBool twoTap = (rgbyB.y < lumaMin) || (rgbyB.y > lumaMax); +#endif + if (twoTap) rgbyB.xyz = rgbyA.xyz * 0.5; + return rgbyB; +} +/*==========================================================================*/ +#endif + + + +/*============================================================================ + +FXAA3 CONSOLE - 360 PIXEL SHADER + +------------------------------------------------------------------------------ +This optimized version thanks to suggestions from Andy Luedke. +Should be fully tex bound in all cases. +As of the FXAA 3.11 release, I have still not tested this code, +however I fixed a bug which was in both FXAA 3.9 and FXAA 3.10. +And note this is replacing the old unoptimized version. +If it does not work, please let me know so I can fix it. +============================================================================*/ +#if (FXAA_360 == 1) +/*--------------------------------------------------------------------------*/ +[reduceTempRegUsage(4)] +float4 FxaaPixelShader( + // See FXAA Quality FxaaPixelShader() source for docs on Inputs! + FxaaFloat2 pos, + FxaaFloat4 fxaaConsolePosPos, + FxaaTex tex, + FxaaTex fxaaConsole360TexExpBiasNegOne, + FxaaTex fxaaConsole360TexExpBiasNegTwo, + FxaaFloat2 fxaaQualityRcpFrame, + FxaaFloat4 fxaaConsoleRcpFrameOpt, + FxaaFloat4 fxaaConsoleRcpFrameOpt2, + FxaaFloat4 fxaaConsole360RcpFrameOpt2, + FxaaFloat fxaaQualitySubpix, + FxaaFloat fxaaQualityEdgeThreshold, + FxaaFloat fxaaQualityEdgeThresholdMin, + FxaaFloat fxaaConsoleEdgeSharpness, + FxaaFloat fxaaConsoleEdgeThreshold, + FxaaFloat fxaaConsoleEdgeThresholdMin, + FxaaFloat4 fxaaConsole360ConstDir +) +{ + /*--------------------------------------------------------------------------*/ + float4 lumaNwNeSwSe; +#if (FXAA_GREEN_AS_LUMA == 0) + asm + { + tfetch2D lumaNwNeSwSe.w___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD = false + tfetch2D lumaNwNeSwSe._w__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD = false + tfetch2D lumaNwNeSwSe.__w_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD = false + tfetch2D lumaNwNeSwSe.___w, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD = false + }; +#else + asm + { + tfetch2D lumaNwNeSwSe.y___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD = false + tfetch2D lumaNwNeSwSe._y__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD = false + tfetch2D lumaNwNeSwSe.__y_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD = false + tfetch2D lumaNwNeSwSe.___y, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD = false + }; +#endif + /*--------------------------------------------------------------------------*/ + lumaNwNeSwSe.y += 1.0 / 384.0; + float2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw); + float2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw); + float lumaMin = min(lumaMinTemp.x, lumaMinTemp.y); + float lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y); + /*--------------------------------------------------------------------------*/ + float4 rgbyM = tex2Dlod(tex, float4(pos.xy, 0.0, 0.0)); +#if (FXAA_GREEN_AS_LUMA == 0) + float lumaMinM = min(lumaMin, rgbyM.w); + float lumaMaxM = max(lumaMax, rgbyM.w); +#else + float lumaMinM = min(lumaMin, rgbyM.y); + float lumaMaxM = max(lumaMax, rgbyM.y); +#endif + if ((lumaMaxM - lumaMinM) < max(fxaaConsoleEdgeThresholdMin, lumaMax * fxaaConsoleEdgeThreshold)) return rgbyM; + /*--------------------------------------------------------------------------*/ + float2 dir; + dir.x = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.yyxx); + dir.y = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.xyxy); + dir = normalize(dir); + /*--------------------------------------------------------------------------*/ + float4 dir1 = dir.xyxy * fxaaConsoleRcpFrameOpt.xyzw; + /*--------------------------------------------------------------------------*/ + float4 dir2; + float dirAbsMinTimesC = min(abs(dir.x), abs(dir.y)) * fxaaConsoleEdgeSharpness; + dir2 = saturate(fxaaConsole360ConstDir.zzww * dir.xyxy / dirAbsMinTimesC + 0.5); + dir2 = dir2 * fxaaConsole360RcpFrameOpt2.xyxy + fxaaConsole360RcpFrameOpt2.zwzw; + /*--------------------------------------------------------------------------*/ + float4 rgbyN1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.xy, 0.0, 0.0)); + float4 rgbyP1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.zw, 0.0, 0.0)); + float4 rgbyN2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.xy, 0.0, 0.0)); + float4 rgbyP2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.zw, 0.0, 0.0)); + /*--------------------------------------------------------------------------*/ + float4 rgbyA = rgbyN1 + rgbyP1; + float4 rgbyB = rgbyN2 + rgbyP2 + rgbyA * 0.5; + /*--------------------------------------------------------------------------*/ + float4 rgbyR = ((FxaaLuma(rgbyB) - lumaMax) > 0.0) ? rgbyA : rgbyB; + rgbyR = ((FxaaLuma(rgbyB) - lumaMin) > 0.0) ? rgbyR : rgbyA; + return rgbyR; +} +/*==========================================================================*/ +#endif + + + +/*============================================================================ + +FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT) + +============================================================================== +The code below does not exactly match the assembly. +I have a feeling that 12 cycles is possible, but was not able to get there. +Might have to increase register count to get full performance. +Note this shader does not use perspective interpolation. + +Use the following cgc options, + +--fenable-bx2 --fastmath --fastprecision --nofloatbindings + +------------------------------------------------------------------------------ +NVSHADERPERF OUTPUT +------------------------------------------------------------------------------ +For reference and to aid in debug, output of NVShaderPerf should match this, + +Shader to schedule: +0: texpkb h0.w(TRUE), v5.zyxx, #0 +2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x +4: texpkb h0.w(TRUE), v5.xwxx, #0 +6: addh h0.z(TRUE), -h2, h0.w +7: texpkb h1.w(TRUE), v5, #0 +9: addh h0.x(TRUE), h0.z, -h1.w +10: addh h3.w(TRUE), h0.z, h1 +11: texpkb h2.w(TRUE), v5.zwzz, #0 +13: addh h0.z(TRUE), h3.w, -h2.w +14: addh h0.x(TRUE), h2.w, h0 +15: nrmh h1.xz(TRUE), h0_n +16: minh_m8 h0.x(TRUE), |h1|, |h1.z| +17: maxh h4.w(TRUE), h0, h1 +18: divx h2.xy(TRUE), h1_n.xzzw, h0_n +19: movr r1.zw(TRUE), v4.xxxy +20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww +22: minh h5.w(TRUE), h0, h1 +23: texpkb h0(TRUE), r2.xzxx, #0 +25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1 +27: maxh h4.x(TRUE), h2.z, h2.w +28: texpkb h1(TRUE), r0.zwzz, #0 +30: addh_d2 h1(TRUE), h0, h1 +31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz +33: texpkb h0(TRUE), r0, #0 +35: minh h4.z(TRUE), h2, h2.w +36: fenct TRUE +37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz +39: texpkb h2(TRUE), r1, #0 +41: addh_d2 h0(TRUE), h0, h2 +42: maxh h2.w(TRUE), h4, h4.x +43: minh h2.x(TRUE), h5.w, h4.z +44: addh_d2 h0(TRUE), h0, h1 +45: slth h2.x(TRUE), h0.w, h2 +46: sgth h2.w(TRUE), h0, h2 +47: movh h0(TRUE), h0 +48: addx.c0 rc(TRUE), h2, h2.w +49: movh h0(c0.NE.x), h1 + +IPU0 ------ Simplified schedule: -------- +Pass | Unit | uOp | PC: Op +-----+--------+------+------------------------- +1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0; +| TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0; +| SCB1 | add | 2: ADDh h2.z, h0.--w-, const.--x-; +| | | +2 | SCT0/1 | mov | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0; +| TEX | txl | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0; +| SCB1 | add | 6: ADDh h0.z,-h2, h0.--w-; +| | | +3 | SCT0/1 | mov | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0; +| TEX | txl | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0; +| SCB0 | add | 9: ADDh h0.x, h0.z---,-h1.w---; +| SCB1 | add | 10: ADDh h3.w, h0.---z, h1; +| | | +4 | SCT0/1 | mov | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0; +| TEX | txl | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0; +| SCB0 | add | 14: ADDh h0.x, h2.w---, h0; +| SCB1 | add | 13: ADDh h0.z, h3.--w-,-h2.--w-; +| | | +5 | SCT1 | mov | 15: NRMh h1.xz, h0; +| SRB | nrm | 15: NRMh h1.xz, h0; +| SCB0 | min | 16: MINh*8 h0.x, |h1|, |h1.z---|; +| SCB1 | max | 17: MAXh h4.w, h0, h1; +| | | +6 | SCT0 | div | 18: DIVx h2.xy, h1.xz--, h0; +| SCT1 | mov | 19: MOVr r1.zw, g[TEX0].--xy; +| SCB0 | mad | 20: MADr r2.xz,-h1, const.z-w-, r1.z-w-; +| SCB1 | min | 22: MINh h5.w, h0, h1; +| | | +7 | SCT0/1 | mov | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0; +| TEX | txl | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0; +| SCB0 | max | 27: MAXh h4.x, h2.z---, h2.w---; +| SCB1 | mad | 25: MADr r0.zw, h1.--xz, const, r1; +| | | +8 | SCT0/1 | mov | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0; +| TEX | txl | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0; +| SCB0/1 | add | 30: ADDh/2 h1, h0, h1; +| | | +9 | SCT0 | mad | 31: MADr r0.xy,-h2, const.xy--, r1.zw--; +| SCT1 | mov | 33: TXLr h0, r0, const.zzzz, TEX0; +| TEX | txl | 33: TXLr h0, r0, const.zzzz, TEX0; +| SCB1 | min | 35: MINh h4.z, h2, h2.--w-; +| | | +10 | SCT0 | mad | 37: MADr r1.xy, h2, const.xy--, r1.zw--; +| SCT1 | mov | 39: TXLr h2, r1, const.zzzz, TEX0; +| TEX | txl | 39: TXLr h2, r1, const.zzzz, TEX0; +| SCB0/1 | add | 41: ADDh/2 h0, h0, h2; +| | | +11 | SCT0 | min | 43: MINh h2.x, h5.w---, h4.z---; +| SCT1 | max | 42: MAXh h2.w, h4, h4.---x; +| SCB0/1 | add | 44: ADDh/2 h0, h0, h1; +| | | +12 | SCT0 | set | 45: SLTh h2.x, h0.w---, h2; +| SCT1 | set | 46: SGTh h2.w, h0, h2; +| SCB0/1 | mul | 47: MOVh h0, h0; +| | | +13 | SCT0 | mad | 48: ADDxc0_s rc, h2, h2.w---; +| SCB0/1 | mul | 49: MOVh h0(NE0.xxxx), h1; + +Pass SCT TEX SCB +1: 0% 100% 25% +2: 0% 100% 25% +3: 0% 100% 50% +4: 0% 100% 50% +5: 0% 0% 50% +6: 100% 0% 75% +7: 0% 100% 75% +8: 0% 100% 100% +9: 0% 100% 25% +10: 0% 100% 100% +11: 50% 0% 100% +12: 50% 0% 100% +13: 25% 0% 100% + +MEAN: 17% 61% 67% + +Pass SCT0 SCT1 TEX SCB0 SCB1 +1: 0% 0% 100% 0% 100% +2: 0% 0% 100% 0% 100% +3: 0% 0% 100% 100% 100% +4: 0% 0% 100% 100% 100% +5: 0% 0% 0% 100% 100% +6: 100% 100% 0% 100% 100% +7: 0% 0% 100% 100% 100% +8: 0% 0% 100% 100% 100% +9: 0% 0% 100% 0% 100% +10: 0% 0% 100% 100% 100% +11: 100% 100% 0% 100% 100% +12: 100% 100% 0% 100% 100% +13: 100% 0% 0% 100% 100% + +MEAN: 30% 23% 61% 76% 100% +Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5 +Results 13 cycles, 3 r regs, 923,076,923 pixels/s +============================================================================*/ +#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0) +/*--------------------------------------------------------------------------*/ +#pragma regcount 7 +#pragma disablepc all +#pragma option O3 +#pragma option OutColorPrec=fp16 +#pragma texformat default RGBA8 +/*==========================================================================*/ +half4 FxaaPixelShader( + // See FXAA Quality FxaaPixelShader() source for docs on Inputs! + FxaaFloat2 pos, + FxaaFloat4 fxaaConsolePosPos, + FxaaTex tex, + FxaaTex fxaaConsole360TexExpBiasNegOne, + FxaaTex fxaaConsole360TexExpBiasNegTwo, + FxaaFloat2 fxaaQualityRcpFrame, + FxaaFloat4 fxaaConsoleRcpFrameOpt, + FxaaFloat4 fxaaConsoleRcpFrameOpt2, + FxaaFloat4 fxaaConsole360RcpFrameOpt2, + FxaaFloat fxaaQualitySubpix, + FxaaFloat fxaaQualityEdgeThreshold, + FxaaFloat fxaaQualityEdgeThresholdMin, + FxaaFloat fxaaConsoleEdgeSharpness, + FxaaFloat fxaaConsoleEdgeThreshold, + FxaaFloat fxaaConsoleEdgeThresholdMin, + FxaaFloat4 fxaaConsole360ConstDir +) +{ + /*--------------------------------------------------------------------------*/ + // (1) + half4 dir; + half4 lumaNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + lumaNe.w += half(1.0 / 512.0); + dir.x = -lumaNe.w; + dir.z = -lumaNe.w; +#else + lumaNe.y += half(1.0 / 512.0); + dir.x = -lumaNe.y; + dir.z = -lumaNe.y; +#endif + /*--------------------------------------------------------------------------*/ + // (2) + half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + dir.x += lumaSw.w; + dir.z += lumaSw.w; +#else + dir.x += lumaSw.y; + dir.z += lumaSw.y; +#endif + /*--------------------------------------------------------------------------*/ + // (3) + half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + dir.x -= lumaNw.w; + dir.z += lumaNw.w; +#else + dir.x -= lumaNw.y; + dir.z += lumaNw.y; +#endif + /*--------------------------------------------------------------------------*/ + // (4) + half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + dir.x += lumaSe.w; + dir.z -= lumaSe.w; +#else + dir.x += lumaSe.y; + dir.z -= lumaSe.y; +#endif + /*--------------------------------------------------------------------------*/ + // (5) + half4 dir1_pos; + dir1_pos.xy = normalize(dir.xyz).xz; + half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS); + /*--------------------------------------------------------------------------*/ + // (6) + half4 dir2_pos; + dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0)); + dir1_pos.zw = pos.xy; + dir2_pos.zw = pos.xy; + half4 temp1N; + temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw; + /*--------------------------------------------------------------------------*/ + // (7) + temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0)); + half4 rgby1; + rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw; + /*--------------------------------------------------------------------------*/ + // (8) + rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0)); + rgby1 = (temp1N + rgby1) * 0.5; + /*--------------------------------------------------------------------------*/ + // (9) + half4 temp2N; + temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw; + temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0)); + /*--------------------------------------------------------------------------*/ + // (10) + half4 rgby2; + rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw; + rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0)); + rgby2 = (temp2N + rgby2) * 0.5; + /*--------------------------------------------------------------------------*/ + // (11) + // compilier moves these scalar ops up to other cycles +#if (FXAA_GREEN_AS_LUMA == 0) + half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w)); + half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w)); +#else + half lumaMin = min(min(lumaNw.y, lumaSw.y), min(lumaNe.y, lumaSe.y)); + half lumaMax = max(max(lumaNw.y, lumaSw.y), max(lumaNe.y, lumaSe.y)); +#endif + rgby2 = (rgby2 + rgby1) * 0.5; + /*--------------------------------------------------------------------------*/ + // (12) +#if (FXAA_GREEN_AS_LUMA == 0) + bool twoTapLt = rgby2.w < lumaMin; + bool twoTapGt = rgby2.w > lumaMax; +#else + bool twoTapLt = rgby2.y < lumaMin; + bool twoTapGt = rgby2.y > lumaMax; +#endif + /*--------------------------------------------------------------------------*/ + // (13) + if (twoTapLt || twoTapGt) rgby2 = rgby1; + /*--------------------------------------------------------------------------*/ + return rgby2; +} +/*==========================================================================*/ +#endif + + + +/*============================================================================ + +FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT) + +============================================================================== +The code mostly matches the assembly. +I have a feeling that 14 cycles is possible, but was not able to get there. +Might have to increase register count to get full performance. +Note this shader does not use perspective interpolation. + +Use the following cgc options, + +--fenable-bx2 --fastmath --fastprecision --nofloatbindings + +Use of FXAA_GREEN_AS_LUMA currently adds a cycle (16 clks). +Will look at fixing this for FXAA 3.12. +------------------------------------------------------------------------------ +NVSHADERPERF OUTPUT +------------------------------------------------------------------------------ +For reference and to aid in debug, output of NVShaderPerf should match this, + +Shader to schedule: +0: texpkb h0.w(TRUE), v5.zyxx, #0 +2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x +4: texpkb h1.w(TRUE), v5.xwxx, #0 +6: addh h0.x(TRUE), h1.w, -h2.y +7: texpkb h2.w(TRUE), v5.zwzz, #0 +9: minh h4.w(TRUE), h2.y, h2 +10: maxh h5.x(TRUE), h2.y, h2.w +11: texpkb h0.w(TRUE), v5, #0 +13: addh h3.w(TRUE), -h0, h0.x +14: addh h0.x(TRUE), h0.w, h0 +15: addh h0.z(TRUE), -h2.w, h0.x +16: addh h0.x(TRUE), h2.w, h3.w +17: minh h5.y(TRUE), h0.w, h1.w +18: nrmh h2.xz(TRUE), h0_n +19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z| +20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w +21: movr r1.zw(TRUE), v4.xxxy +22: maxh h2.w(TRUE), h0, h1 +23: fenct TRUE +24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz +26: texpkb h0(TRUE), r0, #0 +28: maxh h5.x(TRUE), h2.w, h5 +29: minh h5.w(TRUE), h5.y, h4 +30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz +32: texpkb h2(TRUE), r1, #0 +34: addh_d2 h2(TRUE), h0, h2 +35: texpkb h1(TRUE), v4, #0 +37: maxh h5.y(TRUE), h5.x, h1.w +38: minh h4.w(TRUE), h1, h5 +39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz +41: texpkb h0(TRUE), r0, #0 +43: addh_m8 h5.z(TRUE), h5.y, -h4.w +44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz +46: texpkb h3(TRUE), r2, #0 +48: addh_d2 h0(TRUE), h0, h3 +49: addh_d2 h3(TRUE), h0, h2 +50: movh h0(TRUE), h3 +51: slth h3.x(TRUE), h3.w, h5.w +52: sgth h3.w(TRUE), h3, h5.x +53: addx.c0 rc(TRUE), h3.x, h3 +54: slth.c0 rc(TRUE), h5.z, h5 +55: movh h0(c0.NE.w), h2 +56: movh h0(c0.NE.x), h1 + +IPU0 ------ Simplified schedule: -------- +Pass | Unit | uOp | PC: Op +-----+--------+------+------------------------- +1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0; +| TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0; +| SCB0 | add | 2: ADDh h2.y, h0.-w--, const.-x--; +| | | +2 | SCT0/1 | mov | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0; +| TEX | txl | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0; +| SCB0 | add | 6: ADDh h0.x, h1.w---,-h2.y---; +| | | +3 | SCT0/1 | mov | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0; +| TEX | txl | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0; +| SCB0 | max | 10: MAXh h5.x, h2.y---, h2.w---; +| SCB1 | min | 9: MINh h4.w, h2.---y, h2; +| | | +4 | SCT0/1 | mov | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0; +| TEX | txl | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0; +| SCB0 | add | 14: ADDh h0.x, h0.w---, h0; +| SCB1 | add | 13: ADDh h3.w,-h0, h0.---x; +| | | +5 | SCT0 | mad | 16: ADDh h0.x, h2.w---, h3.w---; +| SCT1 | mad | 15: ADDh h0.z,-h2.--w-, h0.--x-; +| SCB0 | min | 17: MINh h5.y, h0.-w--, h1.-w--; +| | | +6 | SCT1 | mov | 18: NRMh h2.xz, h0; +| SRB | nrm | 18: NRMh h2.xz, h0; +| SCB1 | min | 19: MINh*8 h2.w, |h2.---x|, |h2.---z|; +| | | +7 | SCT0 | div | 20: DIVx h4.xy, h2.xz--, h2.ww--; +| SCT1 | mov | 21: MOVr r1.zw, g[TEX0].--xy; +| SCB1 | max | 22: MAXh h2.w, h0, h1; +| | | +8 | SCT0 | mad | 24: MADr r0.xy,-h2.xz--, const.zw--, r1.zw--; +| SCT1 | mov | 26: TXLr h0, r0, const.xxxx, TEX0; +| TEX | txl | 26: TXLr h0, r0, const.xxxx, TEX0; +| SCB0 | max | 28: MAXh h5.x, h2.w---, h5; +| SCB1 | min | 29: MINh h5.w, h5.---y, h4; +| | | +9 | SCT0 | mad | 30: MADr r1.xy, h2.xz--, const.zw--, r1.zw--; +| SCT1 | mov | 32: TXLr h2, r1, const.xxxx, TEX0; +| TEX | txl | 32: TXLr h2, r1, const.xxxx, TEX0; +| SCB0/1 | add | 34: ADDh/2 h2, h0, h2; +| | | +10 | SCT0/1 | mov | 35: TXLr h1, g[TEX0], const.xxxx, TEX0; +| TEX | txl | 35: TXLr h1, g[TEX0], const.xxxx, TEX0; +| SCB0 | max | 37: MAXh h5.y, h5.-x--, h1.-w--; +| SCB1 | min | 38: MINh h4.w, h1, h5; +| | | +11 | SCT0 | mad | 39: MADr r0.xy,-h4, const.xy--, r1.zw--; +| SCT1 | mov | 41: TXLr h0, r0, const.zzzz, TEX0; +| TEX | txl | 41: TXLr h0, r0, const.zzzz, TEX0; +| SCB0 | mad | 44: MADr r2.xy, h4, const.xy--, r1.zw--; +| SCB1 | add | 43: ADDh*8 h5.z, h5.--y-,-h4.--w-; +| | | +12 | SCT0/1 | mov | 46: TXLr h3, r2, const.xxxx, TEX0; +| TEX | txl | 46: TXLr h3, r2, const.xxxx, TEX0; +| SCB0/1 | add | 48: ADDh/2 h0, h0, h3; +| | | +13 | SCT0/1 | mad | 49: ADDh/2 h3, h0, h2; +| SCB0/1 | mul | 50: MOVh h0, h3; +| | | +14 | SCT0 | set | 51: SLTh h3.x, h3.w---, h5.w---; +| SCT1 | set | 52: SGTh h3.w, h3, h5.---x; +| SCB0 | set | 54: SLThc0 rc, h5.z---, h5; +| SCB1 | add | 53: ADDxc0_s rc, h3.---x, h3; +| | | +15 | SCT0/1 | mul | 55: MOVh h0(NE0.wwww), h2; +| SCB0/1 | mul | 56: MOVh h0(NE0.xxxx), h1; + +Pass SCT TEX SCB +1: 0% 100% 25% +2: 0% 100% 25% +3: 0% 100% 50% +4: 0% 100% 50% +5: 50% 0% 25% +6: 0% 0% 25% +7: 100% 0% 25% +8: 0% 100% 50% +9: 0% 100% 100% +10: 0% 100% 50% +11: 0% 100% 75% +12: 0% 100% 100% +13: 100% 0% 100% +14: 50% 0% 50% +15: 100% 0% 100% + +MEAN: 26% 60% 56% + +Pass SCT0 SCT1 TEX SCB0 SCB1 +1: 0% 0% 100% 100% 0% +2: 0% 0% 100% 100% 0% +3: 0% 0% 100% 100% 100% +4: 0% 0% 100% 100% 100% +5: 100% 100% 0% 100% 0% +6: 0% 0% 0% 0% 100% +7: 100% 100% 0% 0% 100% +8: 0% 0% 100% 100% 100% +9: 0% 0% 100% 100% 100% +10: 0% 0% 100% 100% 100% +11: 0% 0% 100% 100% 100% +12: 0% 0% 100% 100% 100% +13: 100% 100% 0% 100% 100% +14: 100% 100% 0% 100% 100% +15: 100% 100% 0% 100% 100% + +MEAN: 33% 33% 60% 86% 80% +Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5 +Results 15 cycles, 3 r regs, 800,000,000 pixels/s +============================================================================*/ +#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1) +/*--------------------------------------------------------------------------*/ +#pragma regcount 7 +#pragma disablepc all +#pragma option O2 +#pragma option OutColorPrec=fp16 +#pragma texformat default RGBA8 +/*==========================================================================*/ +half4 FxaaPixelShader( + // See FXAA Quality FxaaPixelShader() source for docs on Inputs! + FxaaFloat2 pos, + FxaaFloat4 fxaaConsolePosPos, + FxaaTex tex, + FxaaTex fxaaConsole360TexExpBiasNegOne, + FxaaTex fxaaConsole360TexExpBiasNegTwo, + FxaaFloat2 fxaaQualityRcpFrame, + FxaaFloat4 fxaaConsoleRcpFrameOpt, + FxaaFloat4 fxaaConsoleRcpFrameOpt2, + FxaaFloat4 fxaaConsole360RcpFrameOpt2, + FxaaFloat fxaaQualitySubpix, + FxaaFloat fxaaQualityEdgeThreshold, + FxaaFloat fxaaQualityEdgeThresholdMin, + FxaaFloat fxaaConsoleEdgeSharpness, + FxaaFloat fxaaConsoleEdgeThreshold, + FxaaFloat fxaaConsoleEdgeThresholdMin, + FxaaFloat4 fxaaConsole360ConstDir +) +{ + /*--------------------------------------------------------------------------*/ + // (1) + half4 rgbyNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + half lumaNe = rgbyNe.w + half(1.0 / 512.0); +#else + half lumaNe = rgbyNe.y + half(1.0 / 512.0); +#endif + /*--------------------------------------------------------------------------*/ + // (2) + half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + half lumaSwNegNe = lumaSw.w - lumaNe; +#else + half lumaSwNegNe = lumaSw.y - lumaNe; +#endif + /*--------------------------------------------------------------------------*/ + // (3) + half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + half lumaMaxNwSw = max(lumaNw.w, lumaSw.w); + half lumaMinNwSw = min(lumaNw.w, lumaSw.w); +#else + half lumaMaxNwSw = max(lumaNw.y, lumaSw.y); + half lumaMinNwSw = min(lumaNw.y, lumaSw.y); +#endif + /*--------------------------------------------------------------------------*/ + // (4) + half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0)); +#if (FXAA_GREEN_AS_LUMA == 0) + half dirZ = lumaNw.w + lumaSwNegNe; + half dirX = -lumaNw.w + lumaSwNegNe; +#else + half dirZ = lumaNw.y + lumaSwNegNe; + half dirX = -lumaNw.y + lumaSwNegNe; +#endif + /*--------------------------------------------------------------------------*/ + // (5) + half3 dir; + dir.y = 0.0; +#if (FXAA_GREEN_AS_LUMA == 0) + dir.x = lumaSe.w + dirX; + dir.z = -lumaSe.w + dirZ; + half lumaMinNeSe = min(lumaNe, lumaSe.w); +#else + dir.x = lumaSe.y + dirX; + dir.z = -lumaSe.y + dirZ; + half lumaMinNeSe = min(lumaNe, lumaSe.y); +#endif + /*--------------------------------------------------------------------------*/ + // (6) + half4 dir1_pos; + dir1_pos.xy = normalize(dir).xz; + half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS); + /*--------------------------------------------------------------------------*/ + // (7) + half4 dir2_pos; + dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0)); + dir1_pos.zw = pos.xy; + dir2_pos.zw = pos.xy; +#if (FXAA_GREEN_AS_LUMA == 0) + half lumaMaxNeSe = max(lumaNe, lumaSe.w); +#else + half lumaMaxNeSe = max(lumaNe, lumaSe.y); +#endif + /*--------------------------------------------------------------------------*/ + // (8) + half4 temp1N; + temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw; + temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0)); + half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe); + half lumaMin = min(lumaMinNwSw, lumaMinNeSe); + /*--------------------------------------------------------------------------*/ + // (9) + half4 rgby1; + rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw; + rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0)); + rgby1 = (temp1N + rgby1) * 0.5; + /*--------------------------------------------------------------------------*/ + // (10) + half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0)); +#if (FXAA_GREEN_AS_LUMA == 0) + half lumaMaxM = max(lumaMax, rgbyM.w); + half lumaMinM = min(lumaMin, rgbyM.w); +#else + half lumaMaxM = max(lumaMax, rgbyM.y); + half lumaMinM = min(lumaMin, rgbyM.y); +#endif + /*--------------------------------------------------------------------------*/ + // (11) + half4 temp2N; + temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw; + temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0)); + half4 rgby2; + rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw; + half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__PS3_EDGE_THRESHOLD; + /*--------------------------------------------------------------------------*/ + // (12) + rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0)); + rgby2 = (temp2N + rgby2) * 0.5; + /*--------------------------------------------------------------------------*/ + // (13) + rgby2 = (rgby2 + rgby1) * 0.5; + /*--------------------------------------------------------------------------*/ + // (14) +#if (FXAA_GREEN_AS_LUMA == 0) + bool twoTapLt = rgby2.w < lumaMin; + bool twoTapGt = rgby2.w > lumaMax; +#else + bool twoTapLt = rgby2.y < lumaMin; + bool twoTapGt = rgby2.y > lumaMax; +#endif + bool earlyExit = lumaRangeM < lumaMax; + bool twoTap = twoTapLt || twoTapGt; + /*--------------------------------------------------------------------------*/ + // (15) + if (twoTap) rgby2 = rgby1; + if (earlyExit) rgby2 = rgbyM; + /*--------------------------------------------------------------------------*/ + return rgby2; +} +/*==========================================================================*/ +#endif + +#endif // __FXAA3_INC__ diff --git a/Assets/PostProcessing/Resources/Shaders/FXAA3.cginc.meta b/Assets/PostProcessing/Resources/Shaders/FXAA3.cginc.meta new file mode 100644 index 0000000..0d882dd --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/FXAA3.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 613b4036a9f55c34fb054bde02455e46 +timeCreated: 1462350552 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/Fog.shader b/Assets/PostProcessing/Resources/Shaders/Fog.shader new file mode 100644 index 0000000..b607a64 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Fog.shader @@ -0,0 +1,109 @@ +Shader "Hidden/Post FX/Fog" +{ + Properties + { + _MainTex("Main Texture", 2D) = "white" {} + } + + CGINCLUDE + + #pragma multi_compile __ FOG_LINEAR FOG_EXP FOG_EXP2 + #include "UnityCG.cginc" + #include "Common.cginc" + + #define SKYBOX_THREASHOLD_VALUE 0.9999 + + struct Varyings + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + Varyings VertFog(AttributesDefault v) + { + Varyings o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST); + return o; + } + + sampler2D _CameraDepthTexture; + + half4 _FogColor; + float _Density; + float _Start; + float _End; + + half ComputeFog(float z) + { + half fog = 0.0; + #if FOG_LINEAR + fog = (_End - z) / (_End - _Start); + #elif FOG_EXP + fog = exp2(-_Density * z); + #else // FOG_EXP2 + fog = _Density * z; + fog = exp2(-fog * fog); + #endif + return saturate(fog); + } + + float ComputeDistance(float depth) + { + float dist = depth * _ProjectionParams.z; + dist -= _ProjectionParams.y; + return dist; + } + + half4 FragFog(Varyings i) : SV_Target + { + half4 color = tex2D(_MainTex, i.uv); + + float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv); + depth = Linear01Depth(depth); + float dist = ComputeDistance(depth); + half fog = 1.0 - ComputeFog(dist); + + return lerp(color, _FogColor, fog); + } + + half4 FragFogExcludeSkybox(Varyings i) : SV_Target + { + half4 color = tex2D(_MainTex, i.uv); + + float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv); + depth = Linear01Depth(depth); + float skybox = depth < SKYBOX_THREASHOLD_VALUE; + float dist = ComputeDistance(depth); + half fog = 1.0 - ComputeFog(dist); + + return lerp(color, _FogColor, fog * skybox); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + Pass + { + CGPROGRAM + + #pragma vertex VertFog + #pragma fragment FragFog + + ENDCG + } + + Pass + { + CGPROGRAM + + #pragma vertex VertFog + #pragma fragment FragFogExcludeSkybox + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/Fog.shader.meta b/Assets/PostProcessing/Resources/Shaders/Fog.shader.meta new file mode 100644 index 0000000..9a4194d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Fog.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2a72fc91cbae3cc4686a6143e8517993 +timeCreated: 1487335480 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/GrainGen.shader b/Assets/PostProcessing/Resources/Shaders/GrainGen.shader new file mode 100644 index 0000000..0c1bc81 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/GrainGen.shader @@ -0,0 +1,104 @@ +Shader "Hidden/Post FX/Grain Generator" +{ + CGINCLUDE + + #pragma exclude_renderers d3d11_9x + #pragma target 3.0 + #include "UnityCG.cginc" + #include "Common.cginc" + + float _Phase; + + // Implementation based on Timothy Lottes' "Large Grain" + // Reference code: https://www.shadertoy.com/view/4sSXDW + // Other article of interest: http://devlog-martinsh.blogspot.fr/2013/05/image-imperfections-and-film-grain-post.html + float Noise(float2 n, float x) + { + n += x; + return frac(sin(dot(n.xy, float2(12.9898, 78.233))) * 43758.5453); + } + + float Step1(float2 uv, float n) + { + float b = 2.0, c = -12.0; + return (1.0 / (4.0 + b * 4.0 + abs(c))) * ( + Noise(uv + float2(-1.0, -1.0), n) + + Noise(uv + float2( 0.0, -1.0), n) * b + + Noise(uv + float2( 1.0, -1.0), n) + + Noise(uv + float2(-1.0, 0.0), n) * b + + Noise(uv + float2( 0.0, 0.0), n) * c + + Noise(uv + float2( 1.0, 0.0), n) * b + + Noise(uv + float2(-1.0, 1.0), n) + + Noise(uv + float2( 0.0, 1.0), n) * b + + Noise(uv + float2( 1.0, 1.0), n) + ); + } + + float Step2(float2 uv, float n) + { + float b = 2.0, c = 4.0; + return (1.0 / (4.0 + b * 4.0 + abs(c))) * ( + Step1(uv + float2(-1.0, -1.0), n) + + Step1(uv + float2( 0.0, -1.0), n) * b + + Step1(uv + float2( 1.0, -1.0), n) + + Step1(uv + float2(-1.0, 0.0), n) * b + + Step1(uv + float2( 0.0, 0.0), n) * c + + Step1(uv + float2( 1.0, 0.0), n) * b + + Step1(uv + float2(-1.0, 1.0), n) + + Step1(uv + float2( 0.0, 1.0), n) * b + + Step1(uv + float2( 1.0, 1.0), n) + ); + } + + float Step3BW(float2 uv) + { + return Step2(uv, frac(_Phase)); + } + + float3 Step3(float2 uv) + { + float a = Step2(uv, 0.07 * frac(_Phase)); + float b = Step2(uv, 0.11 * frac(_Phase)); + float c = Step2(uv, 0.13 * frac(_Phase)); + return float3(a, b, c); + } + + float4 FragGrain(VaryingsDefault i) : SV_Target + { + float grain = Step3BW(i.uv * float2(192.0, 192.0)); + return float4(grain.xxx, 1.0); + } + + float4 FragGrainColored(VaryingsDefault i) : SV_Target + { + float3 grain = Step3(i.uv * float2(192.0, 192.0)); + return float4(grain, 1.0); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragGrain + + ENDCG + } + + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragGrainColored + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/GrainGen.shader.meta b/Assets/PostProcessing/Resources/Shaders/GrainGen.shader.meta new file mode 100644 index 0000000..2339c05 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/GrainGen.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 11852d1b1b034654bb03e7c8fda28fbf +timeCreated: 1476347976 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/LutGen.shader b/Assets/PostProcessing/Resources/Shaders/LutGen.shader new file mode 100644 index 0000000..587719d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/LutGen.shader @@ -0,0 +1,129 @@ +Shader "Hidden/Post FX/Lut Generator" +{ + CGINCLUDE + + #pragma target 3.0 + #pragma multi_compile __ TONEMAPPING_NEUTRAL TONEMAPPING_FILMIC + + #include "UnityCG.cginc" + #include "ACES.cginc" + #include "Common.cginc" + #include "ColorGrading.cginc" + #include "Tonemapping.cginc" + + half3 _Balance; + + half3 _Lift; + half3 _InvGamma; + half3 _Gain; + + half3 _Offset; + half3 _Power; + half3 _Slope; + + half _HueShift; + half _Saturation; + half _Contrast; + + half3 _ChannelMixerRed; + half3 _ChannelMixerGreen; + half3 _ChannelMixerBlue; + + half4 _NeutralTonemapperParams1; + half4 _NeutralTonemapperParams2; + + sampler2D _Curves; + + half4 _LutParams; + + half3 ColorGrade(half3 color) + { + half3 aces = unity_to_ACES(color); + + // ACEScc (log) space + half3 acescc = ACES_to_ACEScc(aces); + + acescc = OffsetPowerSlope(acescc, _Offset, _Power, _Slope); + + half2 hs = RgbToHsv(acescc).xy; + half satMultiplier = SecondaryHueSat(hs.x, _Curves); + satMultiplier *= SecondarySatSat(hs.y, _Curves); + satMultiplier *= SecondaryLumSat(AcesLuminance(acescc), _Curves); + + acescc = Saturation(acescc, _Saturation * satMultiplier); + acescc = ContrastLog(acescc, _Contrast); + + aces = ACEScc_to_ACES(acescc); + + // ACEScg (linear) space + half3 acescg = ACES_to_ACEScg(aces); + + acescg = WhiteBalance(acescg, _Balance); + acescg = LiftGammaGain(acescg, _Lift, _InvGamma, _Gain); + + half3 hsv = RgbToHsv(max(acescg, 0.0)); + hsv.x = SecondaryHueHue(hsv.x + _HueShift, _Curves); + acescg = HsvToRgb(hsv); + + acescg = ChannelMixer(acescg, _ChannelMixerRed, _ChannelMixerGreen, _ChannelMixerBlue); + + #if TONEMAPPING_FILMIC + + aces = ACEScg_to_ACES(acescg); + color = FilmicTonemap(aces); + + #elif TONEMAPPING_NEUTRAL + + color = ACEScg_to_ACES(acescg); + color = NeutralTonemap(color, _NeutralTonemapperParams1, _NeutralTonemapperParams2); + color = ACES_to_unity(color); + + #else + + color = ACEScg_to_unity(acescg); + + #endif + + // YRGB curves (done in linear/LDR for now) + color = YrgbCurve(color, _Curves); + + return color; + } + + half4 FragCreateLut(VaryingsDefault i) : SV_Target + { + // 2D strip lut + half2 uv = i.uv - _LutParams.yz; + half3 color; + color.r = frac(uv.x * _LutParams.x); + color.b = uv.x - color.r / _LutParams.x; + color.g = uv.y; + + // Lut is in LogC + half3 colorLogC = color * _LutParams.w; + + // Switch back to unity linear and color grade + half3 colorLinear = LogCToLinear(colorLogC); + half3 graded = ColorGrade(colorLinear); + + return half4(graded, 1.0); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // (0) + Pass + { + CGPROGRAM + + #pragma vertex VertDefault + #pragma fragment FragCreateLut + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/LutGen.shader.meta b/Assets/PostProcessing/Resources/Shaders/LutGen.shader.meta new file mode 100644 index 0000000..52d97e3 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/LutGen.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d248d4d1588851f43a9fa18a4e6f0209 +timeCreated: 1460361871 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/MotionBlur.cginc b/Assets/PostProcessing/Resources/Shaders/MotionBlur.cginc new file mode 100644 index 0000000..eca446a --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/MotionBlur.cginc @@ -0,0 +1,420 @@ +#ifndef __MOTION_BLUR__ +#define __MOTION_BLUR__ + +#include "UnityCG.cginc" +#include "Common.cginc" + +// Camera depth texture +sampler2D_float _CameraDepthTexture; + +// Camera motion vectors texture +sampler2D_half _CameraMotionVectorsTexture; +float4 _CameraMotionVectorsTexture_TexelSize; + +// Packed velocity texture (2/10/10/10) +sampler2D_half _VelocityTex; +float2 _VelocityTex_TexelSize; + +// NeighborMax texture +sampler2D_half _NeighborMaxTex; +float2 _NeighborMaxTex_TexelSize; + +// Velocity scale factor +float _VelocityScale; + +// TileMax filter parameters +int _TileMaxLoop; +float2 _TileMaxOffs; + +// Maximum blur radius (in pixels) +half _MaxBlurRadius; +float _RcpMaxBlurRadius; + +// Filter parameters/coefficients +half _LoopCount; + +// History buffer for frame blending +sampler2D _History1LumaTex; +sampler2D _History2LumaTex; +sampler2D _History3LumaTex; +sampler2D _History4LumaTex; + +sampler2D _History1ChromaTex; +sampler2D _History2ChromaTex; +sampler2D _History3ChromaTex; +sampler2D _History4ChromaTex; + +half _History1Weight; +half _History2Weight; +half _History3Weight; +half _History4Weight; + +struct VaryingsMultitex +{ + float4 pos : SV_POSITION; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; +}; + +VaryingsMultitex VertMultitex(AttributesDefault v) +{ + VaryingsMultitex o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv0 = v.texcoord.xy; + o.uv1 = v.texcoord.xy; + +#if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0.0) + o.uv1.y = 1.0 - v.texcoord.y; +#endif + + return o; +} + +// ----------------------------------------------------------------------------- +// Prefilter + +// Velocity texture setup +half4 FragVelocitySetup(VaryingsDefault i) : SV_Target +{ + // Sample the motion vector. + float2 v = tex2D(_CameraMotionVectorsTexture, i.uv).rg; + + // Apply the exposure time and convert to the pixel space. + v *= (_VelocityScale * 0.5) * _CameraMotionVectorsTexture_TexelSize.zw; + + // Clamp the vector with the maximum blur radius. + v /= max(1.0, length(v) * _RcpMaxBlurRadius); + + // Sample the depth of the pixel. + half d = LinearizeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv)); + + // Pack into 10/10/10/2 format. + return half4((v * _RcpMaxBlurRadius + 1.0) * 0.5, d, 0.0); +} + +// TileMax filter (2 pixel width with normalization) +half4 FragTileMax1(VaryingsDefault i) : SV_Target +{ + float4 d = _MainTex_TexelSize.xyxy * float4(-0.5, -0.5, 0.5, 0.5); + + half2 v1 = tex2D(_MainTex, i.uv + d.xy).rg; + half2 v2 = tex2D(_MainTex, i.uv + d.zy).rg; + half2 v3 = tex2D(_MainTex, i.uv + d.xw).rg; + half2 v4 = tex2D(_MainTex, i.uv + d.zw).rg; + + v1 = (v1 * 2.0 - 1.0) * _MaxBlurRadius; + v2 = (v2 * 2.0 - 1.0) * _MaxBlurRadius; + v3 = (v3 * 2.0 - 1.0) * _MaxBlurRadius; + v4 = (v4 * 2.0 - 1.0) * _MaxBlurRadius; + + return half4(MaxV(MaxV(MaxV(v1, v2), v3), v4), 0.0, 0.0); +} + +// TileMax filter (2 pixel width) +half4 FragTileMax2(VaryingsDefault i) : SV_Target +{ + float4 d = _MainTex_TexelSize.xyxy * float4(-0.5, -0.5, 0.5, 0.5); + + half2 v1 = tex2D(_MainTex, i.uv + d.xy).rg; + half2 v2 = tex2D(_MainTex, i.uv + d.zy).rg; + half2 v3 = tex2D(_MainTex, i.uv + d.xw).rg; + half2 v4 = tex2D(_MainTex, i.uv + d.zw).rg; + + return half4(MaxV(MaxV(MaxV(v1, v2), v3), v4), 0.0, 0.0); +} + +// TileMax filter (variable width) +half4 FragTileMaxV(VaryingsDefault i) : SV_Target +{ + float2 uv0 = i.uv + _MainTex_TexelSize.xy * _TileMaxOffs.xy; + + float2 du = float2(_MainTex_TexelSize.x, 0.0); + float2 dv = float2(0, _MainTex_TexelSize.y); + + half2 vo = 0; + + UNITY_LOOP + for (int ix = 0; ix < _TileMaxLoop; ix++) + { + UNITY_LOOP + for (int iy = 0; iy < _TileMaxLoop; iy++) + { + float2 uv = uv0 + du * ix + dv * iy; + vo = MaxV(vo, tex2D(_MainTex, uv).rg); + } + } + + return half4(vo, 0.0, 0.0); +} + +// NeighborMax filter +half4 FragNeighborMax(VaryingsDefault i) : SV_Target +{ + const half cw = 1.01; // Center weight tweak + + float4 d = _MainTex_TexelSize.xyxy * float4(1.0, 1.0, -1.0, 0.0); + + half2 v1 = tex2D(_MainTex, i.uv - d.xy).rg; + half2 v2 = tex2D(_MainTex, i.uv - d.wy).rg; + half2 v3 = tex2D(_MainTex, i.uv - d.zy).rg; + + half2 v4 = tex2D(_MainTex, i.uv - d.xw).rg; + half2 v5 = tex2D(_MainTex, i.uv).rg * cw; + half2 v6 = tex2D(_MainTex, i.uv + d.xw).rg; + + half2 v7 = tex2D(_MainTex, i.uv + d.zy).rg; + half2 v8 = tex2D(_MainTex, i.uv + d.wy).rg; + half2 v9 = tex2D(_MainTex, i.uv + d.xy).rg; + + half2 va = MaxV(v1, MaxV(v2, v3)); + half2 vb = MaxV(v4, MaxV(v5, v6)); + half2 vc = MaxV(v7, MaxV(v8, v9)); + + return half4(MaxV(va, MaxV(vb, vc)) * (1.0 / cw), 0.0, 0.0); +} + +// ----------------------------------------------------------------------------- +// Reconstruction + +// Returns true or false with a given interval. +bool Interval(half phase, half interval) +{ + return frac(phase / interval) > 0.499; +} + +// Jitter function for tile lookup +float2 JitterTile(float2 uv) +{ + float rx, ry; + sincos(GradientNoise(uv + float2(2.0, 0.0)) * UNITY_PI_2, ry, rx); + return float2(rx, ry) * _NeighborMaxTex_TexelSize.xy * 0.25; +} + +// Velocity sampling function +half3 SampleVelocity(float2 uv) +{ + half3 v = tex2Dlod(_VelocityTex, float4(uv, 0.0, 0.0)).xyz; + return half3((v.xy * 2.0 - 1.0) * _MaxBlurRadius, v.z); +} + +// Reconstruction filter +half4 FragReconstruction(VaryingsMultitex i) : SV_Target +{ + // Color sample at the center point + const half4 c_p = tex2D(_MainTex, i.uv0); + + // Velocity/Depth sample at the center point + const half3 vd_p = SampleVelocity(i.uv1); + const half l_v_p = max(length(vd_p.xy), 0.5); + const half rcp_d_p = 1.0 / vd_p.z; + + // NeighborMax vector sample at the center point + const half2 v_max = tex2D(_NeighborMaxTex, i.uv1 + JitterTile(i.uv1)).xy; + const half l_v_max = length(v_max); + const half rcp_l_v_max = 1.0 / l_v_max; + + // Escape early if the NeighborMax vector is small enough. + if (l_v_max < 2.0) return c_p; + + // Use V_p as a secondary sampling direction except when it's too small + // compared to V_max. This vector is rescaled to be the length of V_max. + const half2 v_alt = (l_v_p * 2.0 > l_v_max) ? vd_p.xy * (l_v_max / l_v_p) : v_max; + + // Determine the sample count. + const half sc = floor(min(_LoopCount, l_v_max * 0.5)); + + // Loop variables (starts from the outermost sample) + const half dt = 1.0 / sc; + const half t_offs = (GradientNoise(i.uv0) - 0.5) * dt; + half t = 1.0 - dt * 0.5; + half count = 0.0; + + // Background velocity + // This is used for tracking the maximum velocity in the background layer. + half l_v_bg = max(l_v_p, 1.0); + + // Color accumlation + half4 acc = 0.0; + + UNITY_LOOP while (t > dt * 0.25) + { + // Sampling direction (switched per every two samples) + const half2 v_s = Interval(count, 4.0) ? v_alt : v_max; + + // Sample position (inverted per every sample) + const half t_s = (Interval(count, 2.0) ? -t : t) + t_offs; + + // Distance to the sample position + const half l_t = l_v_max * abs(t_s); + + // UVs for the sample position + const float2 uv0 = i.uv0 + v_s * t_s * _MainTex_TexelSize.xy; + const float2 uv1 = i.uv1 + v_s * t_s * _VelocityTex_TexelSize.xy; + + // Color sample + const half3 c = tex2Dlod(_MainTex, float4(uv0, 0.0, 0.0)).rgb; + + // Velocity/Depth sample + const half3 vd = SampleVelocity(uv1); + + // Background/Foreground separation + const half fg = saturate((vd_p.z - vd.z) * 20.0 * rcp_d_p); + + // Length of the velocity vector + const half l_v = lerp(l_v_bg, length(vd.xy), fg); + + // Sample weight + // (Distance test) * (Spreading out by motion) * (Triangular window) + const half w = saturate(l_v - l_t) / l_v * (1.2 - t); + + // Color accumulation + acc += half4(c, 1.0) * w; + + // Update the background velocity. + l_v_bg = max(l_v_bg, l_v); + + // Advance to the next sample. + t = Interval(count, 2.0) ? t - dt : t; + count += 1.0; + } + + // Add the center sample. + acc += half4(c_p.rgb, 1.0) * (1.2 / (l_v_bg * sc * 2.0)); + + return half4(acc.rgb / acc.a, c_p.a); +} + +// ----------------------------------------------------------------------------- +// Frame blending + +VaryingsDefault VertFrameCompress(AttributesDefault v) +{ + VaryingsDefault o; + o.pos = v.vertex; + o.uvSPR = 0; +#if UNITY_UV_STARTS_AT_TOP + o.uv = v.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0); +#else + o.uv = v.texcoord; +#endif + return o; +} + +#if !SHADER_API_GLES + +// MRT output struct for the compressor +struct CompressorOutput +{ + half4 luma : SV_Target0; + half4 chroma : SV_Target1; +}; + +// Frame compression fragment shader +CompressorOutput FragFrameCompress(VaryingsDefault i) +{ + float sw = _ScreenParams.x; // Screen width + float pw = _ScreenParams.z - 1; // Pixel width + + // RGB to YCbCr convertion matrix + const half3 kY = half3( 0.299 , 0.587 , 0.114 ); + const half3 kCB = half3(-0.168736, -0.331264, 0.5 ); + const half3 kCR = half3( 0.5 , -0.418688, -0.081312); + + // 0: even column, 1: odd column + half odd = frac(i.uv.x * sw * 0.5) > 0.5; + + // Calculate UV for chroma componetns. + // It's between the even and odd columns. + float2 uv_c = i.uv.xy; + uv_c.x = (floor(uv_c.x * sw * 0.5) * 2.0 + 1.0) * pw; + + // Sample the source texture. + half3 rgb_y = tex2D(_MainTex, i.uv).rgb; + half3 rgb_c = tex2D(_MainTex, uv_c).rgb; + + #if !UNITY_COLORSPACE_GAMMA + rgb_y = LinearToGammaSpace(rgb_y); + rgb_c = LinearToGammaSpace(rgb_c); + #endif + + // Convertion and subsampling + CompressorOutput o; + o.luma = dot(kY, rgb_y); + o.chroma = dot(lerp(kCB, kCR, odd), rgb_c) + 0.5; + return o; +} + +#else + +// MRT might not be supported. Replace it with a null shader. +half4 FragFrameCompress(VaryingsDefault i) : SV_Target +{ + return 0; +} + +#endif + +// Sample luma-chroma textures and convert to RGB +half3 DecodeHistory(float2 uvLuma, float2 uvCb, float2 uvCr, sampler2D lumaTex, sampler2D chromaTex) +{ + half y = tex2D(lumaTex, uvLuma).r; + half cb = tex2D(chromaTex, uvCb).r - 0.5; + half cr = tex2D(chromaTex, uvCr).r - 0.5; + return y + half3(1.402 * cr, -0.34414 * cb - 0.71414 * cr, 1.772 * cb); +} + +// Frame blending fragment shader +half4 FragFrameBlending(VaryingsMultitex i) : SV_Target +{ + float sw = _MainTex_TexelSize.z; // Texture width + float pw = _MainTex_TexelSize.x; // Texel width + + // UV for luma + float2 uvLuma = i.uv1; + + // UV for Cb (even columns) + float2 uvCb = i.uv1; + uvCb.x = (floor(uvCb.x * sw * 0.5) * 2.0 + 0.5) * pw; + + // UV for Cr (even columns) + float2 uvCr = uvCb; + uvCr.x += pw; + + // Sample from the source image + half4 src = tex2D(_MainTex, i.uv0); + + // Sampling and blending + #if UNITY_COLORSPACE_GAMMA + half3 acc = src.rgb; + #else + half3 acc = LinearToGammaSpace(src.rgb); + #endif + + acc += DecodeHistory(uvLuma, uvCb, uvCr, _History1LumaTex, _History1ChromaTex) * _History1Weight; + acc += DecodeHistory(uvLuma, uvCb, uvCr, _History2LumaTex, _History2ChromaTex) * _History2Weight; + acc += DecodeHistory(uvLuma, uvCb, uvCr, _History3LumaTex, _History3ChromaTex) * _History3Weight; + acc += DecodeHistory(uvLuma, uvCb, uvCr, _History4LumaTex, _History4ChromaTex) * _History4Weight; + acc /= 1.0 + _History1Weight + _History2Weight +_History3Weight +_History4Weight; + + #if !UNITY_COLORSPACE_GAMMA + acc = GammaToLinearSpace(acc); + #endif + + return half4(acc, src.a); +} + +// Frame blending fragment shader (without chroma subsampling) +half4 FragFrameBlendingRaw(VaryingsMultitex i) : SV_Target +{ + half4 src = tex2D(_MainTex, i.uv0); + half3 acc = src.rgb; + acc += tex2D(_History1LumaTex, i.uv0) * _History1Weight; + acc += tex2D(_History2LumaTex, i.uv0) * _History2Weight; + acc += tex2D(_History3LumaTex, i.uv0) * _History3Weight; + acc += tex2D(_History4LumaTex, i.uv0) * _History4Weight; + acc /= 1.0 + _History1Weight + _History2Weight +_History3Weight +_History4Weight; + return half4(acc, src.a); +} + +#endif // __MOTION_BLUR__ diff --git a/Assets/PostProcessing/Resources/Shaders/MotionBlur.cginc.meta b/Assets/PostProcessing/Resources/Shaders/MotionBlur.cginc.meta new file mode 100644 index 0000000..f464df0 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/MotionBlur.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c83956915580e42489479d2a109470ab +timeCreated: 1470404606 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/MotionBlur.shader b/Assets/PostProcessing/Resources/Shaders/MotionBlur.shader new file mode 100644 index 0000000..a5ab97d --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/MotionBlur.shader @@ -0,0 +1,123 @@ +Shader "Hidden/Post FX/Motion Blur" +{ + CGINCLUDE + + #pragma target 3.0 + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // (0) Velocity texture setup + Pass + { + CGPROGRAM + + #include "MotionBlur.cginc" + #pragma vertex VertDefault + #pragma fragment FragVelocitySetup + + ENDCG + } + + // (1) TileMax filter (2 pixel width with normalization) + Pass + { + CGPROGRAM + + #include "MotionBlur.cginc" + #pragma vertex VertDefault + #pragma fragment FragTileMax1 + + ENDCG + } + + // (2) TileMax filter (2 pixel width) + Pass + { + CGPROGRAM + + #include "MotionBlur.cginc" + #pragma vertex VertDefault + #pragma fragment FragTileMax2 + + ENDCG + } + + // (3) TileMax filter (variable width) + Pass + { + CGPROGRAM + + #include "MotionBlur.cginc" + #pragma vertex VertDefault + #pragma fragment FragTileMaxV + + ENDCG + } + + // (4) NeighborMax filter + Pass + { + CGPROGRAM + + #include "MotionBlur.cginc" + #pragma vertex VertDefault + #pragma fragment FragNeighborMax + + ENDCG + } + + // (5) Reconstruction filter + Pass + { + CGPROGRAM + + #include "MotionBlur.cginc" + #pragma vertex VertMultitex + #pragma fragment FragReconstruction + + ENDCG + } + + // (6) Frame compression + Pass + { + CGPROGRAM + + #pragma multi_compile __ UNITY_COLORSPACE_GAMMA + #include "MotionBlur.cginc" + #pragma vertex VertFrameCompress + #pragma fragment FragFrameCompress + + ENDCG + } + + // (7) Frame blending + Pass + { + CGPROGRAM + + #pragma multi_compile __ UNITY_COLORSPACE_GAMMA + #include "MotionBlur.cginc" + #pragma vertex VertMultitex + #pragma fragment FragFrameBlending + + ENDCG + } + + // (8) Frame blending (without chroma subsampling) + Pass + { + CGPROGRAM + + #include "MotionBlur.cginc" + #pragma vertex VertMultitex + #pragma fragment FragFrameBlendingRaw + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/MotionBlur.shader.meta b/Assets/PostProcessing/Resources/Shaders/MotionBlur.shader.meta new file mode 100644 index 0000000..25a8555 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/MotionBlur.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6ab8493603d8f8e408750b81666a95f1 +timeCreated: 1468327385 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/ScreenSpaceRaytrace.cginc b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceRaytrace.cginc new file mode 100644 index 0000000..0a8def0 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceRaytrace.cginc @@ -0,0 +1,238 @@ +/** +\author Michael Mara and Morgan McGuire, Casual Effects. 2015. +*/ + +#ifndef __SCREEN_SPACE_RAYTRACE__ +#define __SCREEN_SPACE_RAYTRACE__ + +sampler2D_float _CameraDepthTexture; + +float distanceSquared(float2 A, float2 B) +{ + A -= B; + return dot(A, A); +} + +float distanceSquared(float3 A, float3 B) +{ + A -= B; + return dot(A, A); +} + +void swap(inout float v0, inout float v1) +{ + float temp = v0; + v0 = v1; + v1 = temp; +} + +bool isIntersecting(float rayZMin, float rayZMax, float sceneZ, float layerThickness) +{ + return (rayZMax >= sceneZ - layerThickness) && (rayZMin <= sceneZ); +} + +void rayIterations(in bool traceBehindObjects, inout float2 P, inout float stepDirection, inout float end, inout int stepCount, inout int maxSteps, inout bool intersecting, + inout float sceneZ, inout float2 dP, inout float3 Q, inout float3 dQ, inout float k, inout float dk, + inout float rayZMin, inout float rayZMax, inout float prevZMaxEstimate, inout bool permute, inout float2 hitPixel, + inout float2 invSize, inout float layerThickness) +{ + bool stop = intersecting; + + UNITY_LOOP + for (; (P.x * stepDirection) <= end && stepCount < maxSteps && !stop; P += dP, Q.z += dQ.z, k += dk, stepCount += 1) + { + // The depth range that the ray covers within this loop iteration. + // Assume that the ray is moving in increasing z and swap if backwards. + rayZMin = prevZMaxEstimate; + //rayZMin = (dQ.z * -0.5 + Q.z) / (dk * -0.5 + k); + // Compute the value at 1/2 pixel into the future + rayZMax = (dQ.z * 0.5 + Q.z) / (dk * 0.5 + k); + prevZMaxEstimate = rayZMax; + + if (rayZMin > rayZMax) + { + swap(rayZMin, rayZMax); + } + + // Undo the homogeneous operation to obtain the camera-space + // Q at each point + hitPixel = permute ? P.yx : P; + + sceneZ = SAMPLE_DEPTH_TEXTURE_LOD(_CameraDepthTexture, float4(hitPixel * invSize,0,0)).r; + sceneZ = -LinearEyeDepth(sceneZ); + + bool isBehind = (rayZMin <= sceneZ); + intersecting = isBehind && (rayZMax >= sceneZ - layerThickness); + stop = traceBehindObjects ? intersecting : isBehind; + + } // pixel on ray + + P -= dP, Q.z -= dQ.z, k -= dk; +} + +/** + \param csOrigin must have z < -0.01, and project within the valid screen rectangle + \param stepRate Set to 1.0 by default, higher to step faster + */ +bool castDenseScreenSpaceRay + (float3 csOrigin, + float3 csDirection, + float4x4 projectToPixelMatrix, + float2 csZBufferSize, + float3 clipInfo, + float jitterFraction, + int maxSteps, + float layerThickness, + float maxRayTraceDistance, + out float2 hitPixel, + int stepRate, + bool traceBehindObjects, + out float3 csHitPoint, + out float stepCount) { + + float2 invSize = float2(1.0 / csZBufferSize.x, 1.0 / csZBufferSize.y); + + // Initialize to off screen + hitPixel = float2(-1, -1); + + float nearPlaneZ = -0.01; + // Clip ray to a near plane in 3D (doesn't have to be *the* near plane, although that would be a good idea) + float rayLength = ((csOrigin.z + csDirection.z * maxRayTraceDistance) > nearPlaneZ) ? + ((nearPlaneZ - csOrigin.z) / csDirection.z) : + maxRayTraceDistance; + + float3 csEndPoint = csDirection * rayLength + csOrigin; + + // Project into screen space + // This matrix has a lot of zeroes in it. We could expand + // out these multiplies to avoid multiplying by zero + // ...but 16 MADDs are not a big deal compared to what's ahead + float4 H0 = mul(projectToPixelMatrix, float4(csOrigin, 1.0)); + float4 H1 = mul(projectToPixelMatrix, float4(csEndPoint, 1.0)); + + // There are a lot of divisions by w that can be turned into multiplications + // at some minor precision loss...and we need to interpolate these 1/w values + // anyway. + // + // Because the caller was required to clip to the near plane, + // this homogeneous division (projecting from 4D to 2D) is guaranteed + // to succeed. + float k0 = 1.0 / H0.w; + float k1 = 1.0 / H1.w; + + // Screen-space endpoints + float2 P0 = H0.xy * k0; + float2 P1 = H1.xy * k1; + + // Switch the original points to values that interpolate linearly in 2D: + float3 Q0 = csOrigin * k0; + float3 Q1 = csEndPoint * k1; + +#if 1 // Clipping to the screen coordinates. We could simply modify maxSteps instead + float yMax = csZBufferSize.y - 0.5; + float yMin = 0.5; + float xMax = csZBufferSize.x - 0.5; + float xMin = 0.5; + + // 2D interpolation parameter + float alpha = 0.0; + // P0 must be in bounds + if (P1.y > yMax || P1.y < yMin) { + float yClip = (P1.y > yMax) ? yMax : yMin; + float yAlpha = (P1.y - yClip) / (P1.y - P0.y); // Denominator is not zero, since P0 != P1 (or P0 would have been clipped!) + alpha = yAlpha; + } + + // P0 must be in bounds + if (P1.x > xMax || P1.x < xMin) { + float xClip = (P1.x > xMax) ? xMax : xMin; + float xAlpha = (P1.x - xClip) / (P1.x - P0.x); // Denominator is not zero, since P0 != P1 (or P0 would have been clipped!) + alpha = max(alpha, xAlpha); + } + + // These are all in homogeneous space, so they interpolate linearly + P1 = lerp(P1, P0, alpha); + k1 = lerp(k1, k0, alpha); + Q1 = lerp(Q1, Q0, alpha); +#endif + + // We're doing this to avoid divide by zero (rays exactly parallel to an eye ray) + P1 = (distanceSquared(P0, P1) < 0.0001) ? P0 + float2(0.01, 0.01) : P1; + + float2 delta = P1 - P0; + + // Assume horizontal + bool permute = false; + if (abs(delta.x) < abs(delta.y)) { + // More-vertical line. Create a permutation that swaps x and y in the output + permute = true; + + // Directly swizzle the inputs + delta = delta.yx; + P1 = P1.yx; + P0 = P0.yx; + } + + // From now on, "x" is the primary iteration direction and "y" is the secondary one + + float stepDirection = sign(delta.x); + float invdx = stepDirection / delta.x; + float2 dP = float2(stepDirection, invdx * delta.y); + + // Track the derivatives of Q and k + float3 dQ = (Q1 - Q0) * invdx; + float dk = (k1 - k0) * invdx; + + dP *= stepRate; + dQ *= stepRate; + dk *= stepRate; + + P0 += dP * jitterFraction; + Q0 += dQ * jitterFraction; + k0 += dk * jitterFraction; + + // Slide P from P0 to P1, (now-homogeneous) Q from Q0 to Q1, and k from k0 to k1 + float3 Q = Q0; + float k = k0; + + // We track the ray depth at +/- 1/2 pixel to treat pixels as clip-space solid + // voxels. Because the depth at -1/2 for a given pixel will be the same as at + // +1/2 for the previous iteration, we actually only have to compute one value + // per iteration. + float prevZMaxEstimate = csOrigin.z; + stepCount = 0.0; + float rayZMax = prevZMaxEstimate, rayZMin = prevZMaxEstimate; + float sceneZ = 100000; + + // P1.x is never modified after this point, so pre-scale it by + // the step direction for a signed comparison + float end = P1.x * stepDirection; + + bool intersecting = isIntersecting(rayZMin, rayZMax, sceneZ, layerThickness); + // We only advance the z field of Q in the inner loop, since + // Q.xy is never used until after the loop terminates + + //int rayIterations = min(maxSteps, stepsToGetOffscreen); + + + float2 P = P0; + + int originalStepCount = 0; + rayIterations(traceBehindObjects, P, stepDirection, end, originalStepCount, maxSteps, intersecting, + sceneZ, dP, Q, dQ, k, dk, + rayZMin, rayZMax, prevZMaxEstimate, permute, hitPixel, + invSize, layerThickness); + + + stepCount = originalStepCount; + + // Loop only advanced the Z component. Now that we know where we are going + // update xy + Q.xy += dQ.xy * stepCount; + // Q is a vector, so we are trying to get by with 1 division instead of 3. + csHitPoint = Q * (1.0 / k); + + return intersecting; +} + +#endif // __SCREEN_SPACE_RAYTRACE__ diff --git a/Assets/PostProcessing/Resources/Shaders/ScreenSpaceRaytrace.cginc.meta b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceRaytrace.cginc.meta new file mode 100644 index 0000000..aad9b2c --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceRaytrace.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a92d6fdbe2c35f94190497c18b88f9af +timeCreated: 1464350148 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/ScreenSpaceReflection.shader b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceReflection.shader new file mode 100644 index 0000000..1ecb853 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceReflection.shader @@ -0,0 +1,923 @@ +/** +\author Michael Mara and Morgan McGuire, Casual Effects. 2015. +*/ +Shader "Hidden/Post FX/Screen Space Reflection" +{ + Properties + { + _MainTex ("Base (RGB)", 2D) = "white" {} + } + + CGINCLUDE + + #pragma target 3.0 + #include "UnityCG.cginc" + #include "UnityPBSLighting.cginc" + #include "UnityStandardBRDF.cginc" + #include "UnityStandardUtils.cginc" + #include "Common.cginc" + #include "ScreenSpaceRaytrace.cginc" + + float4 _ProjInfo; + float4x4 _WorldToCameraMatrix; + float4x4 _CameraToWorldMatrix; + float4x4 _ProjectToPixelMatrix; + float2 _ScreenSize; + float2 _ReflectionBufferSize; + float2 _InvScreenSize; + float3 _CameraClipInfo; + + sampler2D _CameraGBufferTexture0; + sampler2D _CameraGBufferTexture1; + sampler2D _CameraGBufferTexture2; + sampler2D _CameraGBufferTexture3; + sampler2D _CameraReflectionsTexture; + + float _CurrentMipLevel; + float _RayStepSize; + float _MaxRayTraceDistance; + float _LayerThickness; + float _FresnelFade; + float _FresnelFadePower; + float _ReflectionBlur; + + + int _HalfResolution; + int _TreatBackfaceHitAsMiss; + int _AllowBackwardsRays; + + + // RG: SS Hitpoint of ray + // B: distance ray travelled, used for mip-selection in the final resolve + // A: confidence value + sampler2D _HitPointTexture; + sampler2D _FinalReflectionTexture; + + // RGB: camera-space normal (encoded in [0-1]) + // A: Roughness + sampler2D _NormalAndRoughnessTexture; + + int _EnableRefine; + int _AdditiveReflection; + + float _ScreenEdgeFading; + + int _MaxSteps; + + int _BilateralUpsampling; + + float _MaxRoughness; + float _RoughnessFalloffRange; + float _SSRMultiplier; + + float _FadeDistance; + + int _TraceBehindObjects; + int _UseEdgeDetector; + int _HighlightSuppression; + + /** The height in pixels of a 1m object if viewed from 1m away. */ + float _PixelsPerMeterAtOneMeter; + + // For temporal filtering: + float4x4 _CurrentCameraToPreviousCamera; + sampler2D _PreviousReflectionTexture; + sampler2D _PreviousCSZBuffer; + float _TemporalAlpha; + int _UseTemporalConfidence; + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uv2 : TEXCOORD1; + }; + + v2f vert( appdata_img v ) + { + v2f o; + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.uv2 = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + o.uv2.y = 1.0 - o.uv2.y; + #endif + + return o; + } + + float2 mipToSize(int mip) + { + return floor(_ReflectionBufferSize * exp2(-mip)); + } + + float3 ReconstructCSPosition(float2 S, float z) + { + float linEyeZ = -LinearEyeDepth(z); + return float3((((S.xy * _MainTex_TexelSize.zw)) * _ProjInfo.xy + _ProjInfo.zw) * linEyeZ, linEyeZ); + } + + /** Read the camera-space position of the point at screen-space pixel ssP */ + float3 GetPosition(float2 ssP) + { + float3 P; + + P.z = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, ssP.xy); + + // Offset to pixel center + P = ReconstructCSPosition(float2(ssP) /*+ float2(0.5, 0.5)*/, P.z); + return P; + } + + float applyEdgeFade(float2 tsP, float fadeStrength) + { + float maxFade = 0.1; + + float2 itsP = float2(1.0, 1.0) - tsP; + float dist = min(min(itsP.x, itsP.y), min(tsP.x, tsP.x)); + float fade = dist / (maxFade*fadeStrength + 0.001); + fade = max(min(fade, 1.0), 0.0); + fade = pow(fade, 0.2); + + return fade; + } + + float3 csMirrorVector(float3 csPosition, float3 csN) + { + float3 csE = -normalize(csPosition.xyz); + float cos_o = dot(csN, csE); + float3 c_mi = normalize((csN * (2.0 * cos_o)) - csE); + + return c_mi; + } + + float4 fragRaytrace(v2f i, int stepRate) + { + float2 ssP = i.uv2.xy; + float3 csPosition = GetPosition(ssP); + + float smoothness = tex2D(_CameraGBufferTexture1, ssP).a; + if (csPosition.z < -100.0 || smoothness == 0.0) + { + return float4(0.0,0.0,0.0,0.0); + } + + float3 wsNormal = tex2D(_CameraGBufferTexture2, ssP).rgb * 2.0 - 1.0; + + int2 ssC = int2(ssP * _ScreenSize); + + float3 csN = mul((float3x3)(_WorldToCameraMatrix), wsNormal); + float3 csRayDirection = csMirrorVector(csPosition, csN); + + if (_AllowBackwardsRays == 0 && csRayDirection.z > 0.0) + { + return float4(0.0, 0.0, 0.0, 0.0); + } + + float maxRayTraceDistance = _MaxRayTraceDistance; + float jitterFraction = 0.0f; + float layerThickness = _LayerThickness; + + int maxSteps = _MaxSteps; + + // Bump the ray more in world space as it gets farther away (and so each pixel covers more WS distance) + float rayBump = max(-0.01*csPosition.z, 0.001); + float2 hitPixel; + float3 csHitPoint; + float stepCount; + + bool wasHit = castDenseScreenSpaceRay + (csPosition + (csN) * rayBump, + csRayDirection, + _ProjectToPixelMatrix, + _ScreenSize, + _CameraClipInfo, + jitterFraction, + maxSteps, + layerThickness, + maxRayTraceDistance, + hitPixel, + stepRate, + _TraceBehindObjects == 1, + csHitPoint, + stepCount); + + float2 tsPResult = hitPixel / _ScreenSize; + + float rayDist = dot(csHitPoint - csPosition, csRayDirection); + float confidence = 0.0; + + if (wasHit) + { + confidence = Pow2(1.0 - max(2.0*float(stepCount) / float(maxSteps) - 1.0, 0.0)); + confidence *= clamp(((_MaxRayTraceDistance - rayDist) / _FadeDistance), 0.0, 1.0); + + // Fake fresnel fade + float3 csE = -normalize(csPosition.xyz); + confidence *= max(0.0, lerp(pow(abs(dot(csRayDirection, -csE)), _FresnelFadePower), 1, 1.0 - _FresnelFade)); + + if (_TreatBackfaceHitAsMiss > 0) + { + float3 wsHitNormal = tex2Dlod(_CameraGBufferTexture2, float4(tsPResult, 0, 0)).rgb * 2.0 - 1.0; + float3 wsRayDirection = mul(_CameraToWorldMatrix, float4(csRayDirection, 0)).xyz; + + if (dot(wsHitNormal, wsRayDirection) > 0) + { + confidence = 0.0; + } + } + } + + // Fade out reflections that hit near edge of screen, to prevent abrupt appearance/disappearance when object go off screen + // Fade out reflections that hit near edge of screen, + // to prevent abrupt appearance/disappearance when object go off screen + float vignette = applyEdgeFade(tsPResult, _ScreenEdgeFading); + confidence *= vignette; + confidence *= vignette; + + return float4(tsPResult, rayDist, confidence); + } + + float4 fragComposite(v2f i) : SV_Target + { + // Pixel being shaded + float2 tsP = i.uv2.xy; + + // View space point being shaded + float3 C = GetPosition(tsP); + + // Final image before this pass + float4 gbuffer3 = tex2D(_MainTex, i.uv); + + float4 specEmission = float4(0.0,0.0,0.0,0.0); + float3 specColor = tex2D(_CameraGBufferTexture1, tsP).rgb; + + float roughness = tex2D(_CameraGBufferTexture1, tsP).a; + + float4 reflectionTexel = tex2D(_FinalReflectionTexture, tsP); + + float4 gbuffer0 = tex2D(_CameraGBufferTexture0, tsP); + // Let core Unity functions do the dirty work of applying the BRDF + float3 baseColor = gbuffer0.rgb; + float occlusion = gbuffer0.a; + half oneMinusReflectivity; + baseColor = EnergyConservationBetweenDiffuseAndSpecular(baseColor, specColor, oneMinusReflectivity); + + float3 wsNormal = tex2D(_CameraGBufferTexture2, tsP).rgb * 2.0 - 1.0; + + float3 csEyeVec = normalize(C); + float3 eyeVec = mul(_CameraToWorldMatrix, float4(csEyeVec, 0)).xyz; + + float3 worldPos = mul(_CameraToWorldMatrix, float4(C, 1)).xyz; + + float cos_o = dot(wsNormal, eyeVec); + float3 w_mi = -normalize((wsNormal * (2.0 * cos_o)) - eyeVec); + + float3 incomingRadiance = reflectionTexel.rgb; + + UnityLight light; + light.color = 0; + light.dir = 0; + #if UNITY_VERSION < 550 + light.ndotl = 0; + #endif + + UnityIndirect ind; + ind.diffuse = 0; + ind.specular = incomingRadiance; + + float3 ssrResult = UNITY_BRDF_PBS (0, specColor, oneMinusReflectivity, roughness, wsNormal, -eyeVec, light, ind).rgb * _SSRMultiplier; + float confidence = reflectionTexel.a; + + specEmission.rgb = tex2D(_CameraReflectionsTexture, tsP).rgb; + float3 finalGlossyTerm; + + // Subtract out Unity's glossy result: (we're just applying the delta) + if (_AdditiveReflection == 0) + { + gbuffer3 -= specEmission; + // We may have blown out our dynamic range by adding then subtracting the reflection probes. + // As a half-measure to fix this, simply clamp to zero + gbuffer3 = max(gbuffer3, 0); + finalGlossyTerm = lerp(specEmission.rgb, ssrResult, saturate(confidence)); + } + else + { + finalGlossyTerm = ssrResult*saturate(confidence); + } + + finalGlossyTerm *= occlusion; + + // Additively blend the glossy GI result with the output buffer + return gbuffer3 + float4(finalGlossyTerm, 0); + } + + float roughnessWeight(float midpointRoughness, float tapRoughness) + { + return (1.0 - sqrt(sqrt(abs(midpointRoughness-tapRoughness)))); + } + + float normalWeight(float3 midpointNormal, float3 tapNormal) + { + return clamp(dot(midpointNormal, tapNormal), 0, 1); + } + + float highlightDecompression(float x) + { + return x / (1.0 - x); + } + + float3 highlightDecompression(float3 x) + { + return float3( + highlightDecompression(x.x), + highlightDecompression(x.y), + highlightDecompression(x.z) + ); + } + + float highlightCompression(float x) + { + return x / (1.0 + x); + } + + float3 highlightCompression(float3 x) + { + return float3( + highlightCompression(x.x), + highlightCompression(x.y), + highlightCompression(x.z) + ); + } + + float4 _Axis; + float4 fragGBlur(v2f i) : SV_Target + { + int radius = 4; + + // Pixel being shaded + float2 tsP = i.uv2.xy; + + float weightSum = 0.0; + float gaussWeights[5] = { 0.225, 0.150, 0.110, 0.075, 0.0525 };//{0.225, 0.150, 0.110, 0.075, 0.0525}; + float4 resultSum = float4(0.0, 0.0, 0.0, 0.0); + float4 unweightedResultSum = float4(0.0, 0.0, 0.0, 0.0); + float4 nAndRough = tex2D(_NormalAndRoughnessTexture, tsP); + float midpointRoughness = nAndRough.a; + float3 midpointNormal = nAndRough.rgb * 2 - 1; + + for (int i = -radius; i <= radius; ++i) + { + float4 temp; + float tapRoughness; + float3 tapNormal; + float2 tsTap = tsP + (_Axis.xy * _MainTex_TexelSize.xy * float2(i,i)*2.0); + + temp = tex2D(_MainTex, tsTap); + + float weight = temp.a * gaussWeights[abs(i)]; + // Bilateral filtering + // if (_ImproveCorners) + // { + nAndRough = tex2D(_NormalAndRoughnessTexture, tsTap); + tapRoughness = nAndRough.a; + tapNormal = nAndRough.rgb * 2 - 1; + weight *= normalWeight(midpointNormal, tapNormal); + // } + + weightSum += weight; + + if (_HighlightSuppression) + { + temp.rgb = highlightCompression(temp.rgb); + } + + unweightedResultSum += temp; + resultSum += temp*weight; + } + + if (weightSum > 0.01) + { + float invWeightSum = (1.0/weightSum); + // Adding the sqrt seems to decrease temporal flickering at the expense + // of having larger "halos" of fallback on rough surfaces + // Subject to change with testing. Sqrt around only half the expression is *intentional*. + float confidence = min(resultSum.a * sqrt(max(invWeightSum, 2.0)), 1.0); + float3 finalColor = resultSum.rgb * invWeightSum; + + if (_HighlightSuppression) + { + finalColor = highlightDecompression(finalColor); + } + + return float4(finalColor, confidence); + } + else + { + float3 finalColor = unweightedResultSum.rgb / (2 * radius + 1); + + if (_HighlightSuppression) + { + finalColor = highlightDecompression(finalColor); + } + + return float4(finalColor, 0.0); + } + } + + sampler2D _ReflectionTexture0; + sampler2D _ReflectionTexture1; + sampler2D _ReflectionTexture2; + sampler2D _ReflectionTexture3; + sampler2D _ReflectionTexture4; + + // Simulate mip maps, since we don't have NPOT mip-chains + float4 getReflectionValue(float2 tsP, int mip) + { + float4 coord = float4(tsP,0,0); + if (mip == 0) + { + return tex2Dlod(_ReflectionTexture0, coord); + } + else if (mip == 1) + { + return tex2Dlod(_ReflectionTexture1, coord); + } + else if (mip == 2) + { + return tex2Dlod(_ReflectionTexture2, coord); + } + else if (mip == 3) + { + return tex2Dlod(_ReflectionTexture3, coord); + } + else + { + return tex2Dlod(_ReflectionTexture4, coord); + } + } + + sampler2D _EdgeTexture0; + sampler2D _EdgeTexture1; + sampler2D _EdgeTexture2; + sampler2D _EdgeTexture3; + sampler2D _EdgeTexture4; + + // Simulate mip maps, since we don't have NPOT mip-chains + float4 getEdgeValue(float2 tsP, int mip) + { + float4 coord = float4(tsP + float2(1.0/(2 * mipToSize(mip))),0,0); + + if (mip == 0) + { + return tex2Dlod(_EdgeTexture0, coord); + } + else if (mip == 1) + { + return tex2Dlod(_EdgeTexture1, coord); + } + else if (mip == 2) + { + return tex2Dlod(_EdgeTexture2, coord); + } + else if (mip == 3) + { + return tex2Dlod(_EdgeTexture3, coord); + } + else + { + return tex2Dlod(_EdgeTexture4, coord); + } + } + + float2 centerPixel(float2 inputP) + { + return floor(inputP - float2(0.5,0.5)) + float2(0.5,0.5); + } + + float2 snapToTexelCenter(float2 inputP, float2 texSize, float2 texSizeInv) + { + return centerPixel(inputP * texSize) * texSizeInv; + } + + float4 bilateralUpsampleReflection(float2 tsP, int mip) + { + float2 smallTexSize = mipToSize(mip); + float2 smallPixelPos = tsP * smallTexSize; + float2 smallPixelPosi = centerPixel(smallPixelPos); + float2 smallTexSizeInv = 1.0 / smallTexSize; + + + float2 p0 = smallPixelPosi * smallTexSizeInv; + float2 p3 = (smallPixelPosi + float2(1.0, 1.0)) * smallTexSizeInv; + float2 p1 = float2(p3.x, p0.y); + float2 p2 = float2(p0.x, p3.y); + + float4 V0 = getReflectionValue(p0.xy, mip); + float4 V1 = getReflectionValue(p1.xy, mip); + float4 V2 = getReflectionValue(p2.xy, mip); + float4 V3 = getReflectionValue(p3.xy, mip); + + // Bilateral weights: + // Bilinear interpolation (filter distance) + float2 smallPixelPosf = smallPixelPos - smallPixelPosi; + float a0 = (1.0 - smallPixelPosf.x) * (1.0 - smallPixelPosf.y); + float a1 = smallPixelPosf.x * (1.0 - smallPixelPosf.y); + float a2 = (1.0 - smallPixelPosf.x) * smallPixelPosf.y; + float a3 = smallPixelPosf.x * smallPixelPosf.y; + + float2 fullTexSize = _ReflectionBufferSize; + float2 fullTexSizeInv = 1.0 / fullTexSize; + + float4 hiP0 = float4(snapToTexelCenter(p0, fullTexSize, fullTexSizeInv), 0,0); + float4 hiP3 = float4(snapToTexelCenter(p3, fullTexSize, fullTexSizeInv), 0,0); + float4 hiP1 = float4(snapToTexelCenter(p1, fullTexSize, fullTexSizeInv), 0,0); + float4 hiP2 = float4(snapToTexelCenter(p2, fullTexSize, fullTexSizeInv), 0,0); + + float4 tempCenter = tex2Dlod(_NormalAndRoughnessTexture, float4(tsP, 0, 0)); + float3 n = tempCenter.xyz * 2 - 1; + + float4 temp0 = tex2Dlod(_NormalAndRoughnessTexture, hiP0); + float4 temp1 = tex2Dlod(_NormalAndRoughnessTexture, hiP1); + float4 temp2 = tex2Dlod(_NormalAndRoughnessTexture, hiP2); + float4 temp3 = tex2Dlod(_NormalAndRoughnessTexture, hiP3); + + float3 n0 = temp0.xyz * 2 - 1; + float3 n1 = temp1.xyz * 2 - 1; + float3 n2 = temp2.xyz * 2 - 1; + float3 n3 = temp3.xyz * 2 - 1; + + a0 *= normalWeight(n, n0); + a1 *= normalWeight(n, n1); + a2 *= normalWeight(n, n2); + a3 *= normalWeight(n, n3); + + float r = tempCenter.a; + float r0 = temp0.a; + float r1 = temp1.a; + float r2 = temp2.a; + float r3 = temp3.a; + + a0 *= roughnessWeight(r, r0); + a1 *= roughnessWeight(r, r1); + a2 *= roughnessWeight(r, r2); + a3 *= roughnessWeight(r, r3); + + // Slightly offset from zero + a0 = max(a0, 0.001); + a1 = max(a1, 0.001); + a2 = max(a2, 0.001); + a3 = max(a3, 0.001); + + // Nearest neighbor + // a0 = a1 = a2 = a3 = 1.0; + + // Normalize the blending weights (weights were chosen so that + // the denominator can never be zero) + float norm = 1.0 / (a0 + a1 + a2 + a3); + + // Blend + float4 value = (V0 * a0 + V1 * a1 + V2 * a2 + V3 * a3) * norm; + //return V0; + return value; + } + + /** Explicit bilinear fetches; must be used if the reflection buffer is bound using point sampling */ + float4 bilinearUpsampleReflection(float2 tsP, int mip) + { + float2 smallTexSize = mipToSize(mip); + float2 smallPixelPos = tsP * smallTexSize; + float2 smallPixelPosi = centerPixel(smallPixelPos); + float2 smallTexSizeInv = 1.0 / smallTexSize; + + + float2 p0 = smallPixelPosi * smallTexSizeInv; + float2 p3 = (smallPixelPosi + float2(1.0, 1.0)) * smallTexSizeInv; + float2 p1 = float2(p3.x, p0.y); + float2 p2 = float2(p0.x, p3.y); + + float4 V0 = getReflectionValue(p0.xy, mip); + float4 V1 = getReflectionValue(p1.xy, mip); + float4 V2 = getReflectionValue(p2.xy, mip); + float4 V3 = getReflectionValue(p3.xy, mip); + + float a0 = 1.0; + float a1 = 1.0; + float a2 = 1.0; + float a3 = 1.0; + + // Bilateral weights: + // Bilinear interpolation (filter distance) + float2 smallPixelPosf = smallPixelPos - smallPixelPosi; + a0 = (1.0 - smallPixelPosf.x) * (1.0 - smallPixelPosf.y); + a1 = smallPixelPosf.x * (1.0 - smallPixelPosf.y); + a2 = (1.0 - smallPixelPosf.x) * smallPixelPosf.y; + a3 = smallPixelPosf.x * smallPixelPosf.y; + + // Blend + float4 value = (V0 * a0 + V1 * a1 + V2 * a2 + V3 * a3); + return value; + } + + // Unity's roughness is GGX roughness squared + float roughnessToBlinnPhongExponent(float roughness) + { + float r2 = roughness*roughness; + return 2.0f / r2*r2 - 2.0f; + } + + float glossyLobeSlope(float roughness) + { + return pow(roughness, 4.0/3.0); + } + + // Empirically based on our filter: + // Mip | Pixels + // -------------- + // 0 | 1 no filter, so single pixel + // 1 | 17 2r + 1 filter applied once, grabbing from pixels r away in either direction (r=8, four samples times stride of 2) + // 2 | 50 2r + 1 filter applied on double size pixels, and each of those pixels had reached another r out to the side 2(2r + 1) + m_1 + // 3 | 118 4(2r + 1) + m_2 + // 4 | 254 8(2r + 1) + m_3 + // + // Approximated by pixels = 16*2^mip-15 + // rearranging we get mip = log_2((pixels + 15) / 16) + // + float filterFootprintInPixelsToMip(float footprint) + { + return log2((footprint + 15) / 16); + } + + float3 ansiGradient(float t) + { + //return float3(t, t, t); + return fmod(floor(t * float3(8.0, 4.0, 2.0)), 2.0); + } + + float4 fragCompositeSSR(v2f i) : SV_Target + { + // Pixel being shaded + float2 tsP = i.uv2.xy; + + float roughness = 1.0-tex2D(_CameraGBufferTexture1, tsP).a; + + float rayDistance = tex2D(_HitPointTexture, tsP).z; + + // Get the camera space position of the reflection hit + float3 csPosition = GetPosition(tsP); + float3 wsNormal = tex2D(_CameraGBufferTexture2, tsP).rgb * 2.0 - 1.0; + float3 csN = mul((float3x3)(_WorldToCameraMatrix), wsNormal); + float3 c_mi = csMirrorVector(csPosition, csN); + float3 csHitpoint = c_mi * rayDistance + csPosition; + + + float gatherFootprintInMeters = glossyLobeSlope(roughness) * rayDistance; + // We could add a term that incorporates the normal + // This approximation assumes reflections happen at a glancing angle + float filterFootprintInPixels = gatherFootprintInMeters * _PixelsPerMeterAtOneMeter / csHitpoint.z; + if (_HalfResolution == 1) + { + filterFootprintInPixels *= 0.5; + } + + float mip = filterFootprintInPixelsToMip(filterFootprintInPixels); + + float nonPhysicalMip = pow(roughness, 3.0 / 4.0) * UNITY_SPECCUBE_LOD_STEPS; + + if (_HalfResolution == 1) + { + nonPhysicalMip = nonPhysicalMip * 0.7; + } + + mip = max(0, min(4, mip)); + + float4 result = 0.; + + { + int mipMin = int(mip); + int mipMax = min(mipMin + 1, 4); + float mipLerp = mip-mipMin; + + if (_BilateralUpsampling == 1) + { + result = lerp(bilateralUpsampleReflection(tsP, mipMin), bilateralUpsampleReflection(tsP, mipMax), mipLerp); + } + else + { + float4 minResult = getReflectionValue(tsP, mipMin); + float4 maxResult = getReflectionValue(tsP, mipMax); + result = lerp(minResult, maxResult, mipLerp); + result.a = min(minResult.a, maxResult.a); + } + } + + result.a = min(result.a, 1.0); + float vignette = applyEdgeFade(tsP, _ScreenEdgeFading); + result.a *= vignette; + + + // THIS MIGHT BE SLIGHTLY WRONG, TRY STEP() + float alphaModifier = 1.0 - clamp(roughness * .3, 0., 1.); + result.a *= alphaModifier; + return result; + } + + int _LastMip; + + float4 fragMin(v2f i) : SV_Target + { + float2 tsP = i.uv2.xy; + float2 lastTexSize = mipToSize(_LastMip); + float2 lastTexSizeInv = 1.0 / lastTexSize; + float2 p00 = snapToTexelCenter(tsP, lastTexSize, lastTexSizeInv); + float2 p11 = p00 + lastTexSizeInv; + + return min( + min(tex2D(_MainTex, p00), tex2D(_MainTex, p11)), + min(tex2D(_MainTex, float2(p00.x, p11.y)), tex2D(_MainTex, float2(p11.x, p00.y))) + ); + } + + float4 fragResolveHitPoints(v2f i) : SV_Target + { + float2 tsP = i.uv2.xy; + float4 temp = tex2D(_HitPointTexture, tsP); + float2 hitPoint = temp.xy; + float confidence = temp.w; + float3 colorResult = confidence > 0.0 ? tex2D(_MainTex, hitPoint).rgb : tex2D(_CameraReflectionsTexture, tsP).rgb; + + if (AnyIsNan(colorResult)) + colorResult = float3(0.0, 0.0, 0.0); + + return float4(colorResult, confidence); + } + + float4 fragBilatKeyPack(v2f i) : SV_Target + { + float2 tsP = i.uv2.xy; + float3 csN = tex2D(_CameraGBufferTexture2, tsP).xyz; + float roughness = tex2D(_CameraGBufferTexture1, tsP).a; + return float4(csN, roughness); + } + + float4 fragDepthToCSZ(v2f i) : SV_Target + { + float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv2.xy); + return float4(-LinearEyeDepth(depth), 0.0, 0.0, 0.0); + } + + static const int NUM_POISSON_TAPS = 12; + // Same as used in CameraMotionBlur.shader + static const float2 poissonSamples[NUM_POISSON_TAPS] = + { + float2(-0.326212,-0.40581), + float2(-0.840144,-0.07358), + float2(-0.695914,0.457137), + float2(-0.203345,0.620716), + float2(0.96234,-0.194983), + float2(0.473434,-0.480026), + float2(0.519456,0.767022), + float2(0.185461,-0.893124), + float2(0.507431,0.064425), + float2(0.89642,0.412458), + float2(-0.32194,-0.932615), + float2(-0.791559,-0.59771) + }; + + float4 fragFilterSharpReflections(v2f i) : SV_Target + { + // Could improve perf by not computing blur when we won't be sampling the highest level anyways + float2 tsP = i.uv2.xy; + float4 sum = 0.0; + float sampleRadius = _MainTex_TexelSize.xy * _ReflectionBlur; + + for (int i = 0; i < NUM_POISSON_TAPS; i++) + { + float2 p = tsP + poissonSamples[i] * sampleRadius; + + float4 tap = tex2D(_MainTex, p); + if (_HighlightSuppression) + { + tap.rgb = highlightCompression(tap.rgb); + } + + sum += tap; + } + + float4 result = sum / float(NUM_POISSON_TAPS); + + if (_HighlightSuppression) + { + result.rgb = highlightDecompression(result.rgb); + } + + return result; + } + + ENDCG + + SubShader + { + ZTest Always Cull Off ZWrite Off + + // 0: Raytrace + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragRaytrace1 + + float4 fragRaytrace1(v2f i) : SV_Target + { + return fragRaytrace(i, _RayStepSize); + } + ENDCG + } + + // 1: Composite + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragComposite + ENDCG + } + + // 2: GBlur + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragGBlur + ENDCG + } + + // 3: CompositeSSR + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragCompositeSSR + ENDCG + } + + // 4: Min mip generation + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragMin + ENDCG + } + + // 5: Hit point texture to reflection buffer + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragResolveHitPoints + ENDCG + } + + // 6: Pack Bilateral Filter Keys in single buffer + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragBilatKeyPack + ENDCG + } + + // 7: Blit depth information as camera space Z + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragDepthToCSZ + ENDCG + } + + // 8: Filter the highest quality reflection buffer + Pass + { + CGPROGRAM + #pragma exclude_renderers gles xbox360 ps3 + #pragma vertex vert + #pragma fragment fragFilterSharpReflections + ENDCG + } + } + + Fallback "Diffuse" +} diff --git a/Assets/PostProcessing/Resources/Shaders/ScreenSpaceReflection.shader.meta b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceReflection.shader.meta new file mode 100644 index 0000000..3da014c --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/ScreenSpaceReflection.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 607a5643efb168f429e438f7d6ad270a +timeCreated: 1464350149 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/TAA.cginc b/Assets/PostProcessing/Resources/Shaders/TAA.cginc new file mode 100644 index 0000000..041f8ed --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/TAA.cginc @@ -0,0 +1,206 @@ +#ifndef __TAA__ +#define __TAA__ + +#pragma only_renderers ps4 xboxone d3d11 d3d9 xbox360 opengl glcore +#pragma exclude_renderers gles + +#include "UnityCG.cginc" +#include "Common.cginc" + +// ----------------------------------------------------------------------------- +// Solver + +#define TAA_USE_STABLE_BUT_GHOSTY_VARIANT 0 + +#if !defined(TAA_DILATE_MOTION_VECTOR_SAMPLE) + #define TAA_DILATE_MOTION_VECTOR_SAMPLE 1 +#endif + +#define TAA_FRAGMENT_MOTION_HISTORY_DECAY 0.85 + +#define TAA_FINAL_BLEND_STATIC_FACTOR _FinalBlendParameters.x +#define TAA_FINAL_BLEND_DYNAMIC_FACTOR _FinalBlendParameters.y +#define TAA_MOTION_AMPLIFICATION _FinalBlendParameters.z + +struct VaryingsSolver +{ + float4 vertex : SV_POSITION; + float4 uv : TEXCOORD0; // [xy: _MainTex.uv, zw: _HistoryTex.uv] +}; + +struct OutputSolver +{ + float4 destination : SV_Target0; + float4 history : SV_Target1; +}; + +sampler2D _HistoryTex; + +sampler2D _CameraMotionVectorsTexture; +sampler2D _CameraDepthTexture; + +float4 _HistoryTex_TexelSize; +float4 _CameraDepthTexture_TexelSize; + +float2 _Jitter; +float4 _SharpenParameters; +float4 _FinalBlendParameters; + +VaryingsSolver VertSolver(AttributesDefault input) +{ + VaryingsSolver output; + + float4 vertex = UnityObjectToClipPos(input.vertex); + + output.vertex = vertex; + output.uv = input.texcoord.xyxy; + +#if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + output.uv.y = 1.0 - input.texcoord.y; +#endif + + return output; +} + +float2 GetClosestFragment(float2 uv) +{ + const float2 k = _CameraDepthTexture_TexelSize.xy; + const float4 neighborhood = float4( + SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv - k), + SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv + float2(k.x, -k.y)), + SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv + float2(-k.x, k.y)), + SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv + k) + ); + +#if defined(UNITY_REVERSED_Z) + #define COMPARE_DEPTH(a, b) step(b, a) +#else + #define COMPARE_DEPTH(a, b) step(a, b) +#endif + + float3 result = float3(0.0, 0.0, SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv)); + result = lerp(result, float3(-1.0, -1.0, neighborhood.x), COMPARE_DEPTH(neighborhood.x, result.z)); + result = lerp(result, float3( 1.0, -1.0, neighborhood.y), COMPARE_DEPTH(neighborhood.y, result.z)); + result = lerp(result, float3(-1.0, 1.0, neighborhood.z), COMPARE_DEPTH(neighborhood.z, result.z)); + result = lerp(result, float3( 1.0, 1.0, neighborhood.w), COMPARE_DEPTH(neighborhood.w, result.z)); + + return (uv + result.xy * k); +} + +// Adapted from Playdead's TAA implementation +// https://github.com/playdeadgames/temporal +float4 ClipToAABB(float4 color, float p, float3 minimum, float3 maximum) +{ + // note: only clips towards aabb center (but fast!) + float3 center = 0.5 * (maximum + minimum); + float3 extents = 0.5 * (maximum - minimum); + + // This is actually `distance`, however the keyword is reserved + float4 offset = color - float4(center, p); + float3 repeat = abs(offset.xyz / extents); + + repeat.x = max(repeat.x, max(repeat.y, repeat.z)); + + if (repeat.x > 1.0) + { + // `color` is not intersecting (nor inside) the AABB; it's clipped to the closest extent + return float4(center, p) + offset / repeat.x; + } + else + { + // `color` is intersecting (or inside) the AABB. + + // Note: for whatever reason moving this return statement from this else into a higher + // scope makes the NVIDIA drivers go beyond bonkers + return color; + } +} + +OutputSolver FragSolver(VaryingsSolver input) +{ +#if TAA_DILATE_MOTION_VECTOR_SAMPLE + float2 motion = tex2D(_CameraMotionVectorsTexture, GetClosestFragment(input.uv.zw)).xy; +#else + // Don't dilate in ortho ! + float2 motion = tex2D(_CameraMotionVectorsTexture, input.uv.zw).xy; +#endif + + const float2 k = _MainTex_TexelSize.xy; + float2 uv = input.uv.xy; + +#if UNITY_UV_STARTS_AT_TOP + uv -= _MainTex_TexelSize.y < 0 ? _Jitter * float2(1.0, -1.0) : _Jitter; +#else + uv -= _Jitter; +#endif + + float4 color = tex2D(_MainTex, uv); + + float4 topLeft = tex2D(_MainTex, uv - k * 0.5); + float4 bottomRight = tex2D(_MainTex, uv + k * 0.5); + + float4 corners = 4.0 * (topLeft + bottomRight) - 2.0 * color; + + // Sharpen output + color += (color - (corners * 0.166667)) * 2.718282 * _SharpenParameters.x; + color = max(0.0, color); + + // Tonemap color and history samples + float4 average = FastToneMap((corners + color) * 0.142857); + + topLeft = FastToneMap(topLeft); + bottomRight = FastToneMap(bottomRight); + + color = FastToneMap(color); + + float4 history = tex2D(_HistoryTex, input.uv.zw - motion); + +// Only use this variant for arch viz or scenes that don't have any animated objects (camera animation is fine) +#if TAA_USE_STABLE_BUT_GHOSTY_VARIANT + float4 luma = float4(Luminance(topLeft.rgb), Luminance(bottomRight.rgb), Luminance(average.rgb), Luminance(color.rgb)); + float nudge = lerp(6.28318530718, 0.5, saturate(2.0 * history.a)) * max(abs(luma.z - luma.w), abs(luma.x - luma.y)); + + float4 minimum = lerp(bottomRight, topLeft, step(luma.x, luma.y)) - nudge; + float4 maximum = lerp(topLeft, bottomRight, step(luma.x, luma.y)) + nudge; +#else + float2 luma = float2(Luminance(average.rgb), Luminance(color.rgb)); + float nudge = 4.0 * abs(luma.x - luma.y); + + float4 minimum = min(bottomRight, topLeft) - nudge; + float4 maximum = max(topLeft, bottomRight) + nudge; +#endif + + history = FastToneMap(history); + + // Clip history samples + history = ClipToAABB(history, history.a, minimum.xyz, maximum.xyz); + + // Store fragment motion history + color.a = saturate(smoothstep(0.002 * _MainTex_TexelSize.z, 0.0035 * _MainTex_TexelSize.z, length(motion))); + + // Blend method + float weight = clamp(lerp(TAA_FINAL_BLEND_STATIC_FACTOR, TAA_FINAL_BLEND_DYNAMIC_FACTOR, + length(motion) * TAA_MOTION_AMPLIFICATION), TAA_FINAL_BLEND_DYNAMIC_FACTOR, TAA_FINAL_BLEND_STATIC_FACTOR); + + color = FastToneUnmap(lerp(color, history, weight)); + + OutputSolver output; + + output.destination = color; + color.a *= TAA_FRAGMENT_MOTION_HISTORY_DECAY; + + output.history = color; + + return output; +} + +// ----------------------------------------------------------------------------- +// Alpha clearance + +float4 FragAlphaClear(VaryingsDefault input) : SV_Target +{ + return float4(tex2D(_MainTex, input.uv).rgb, 0.0); +} + +#endif // __TAA__ diff --git a/Assets/PostProcessing/Resources/Shaders/TAA.cginc.meta b/Assets/PostProcessing/Resources/Shaders/TAA.cginc.meta new file mode 100644 index 0000000..96e03f9 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/TAA.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 241b7a6a033e9dc4da9d2595cef7f477 +timeCreated: 1472807158 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/TAA.shader b/Assets/PostProcessing/Resources/Shaders/TAA.shader new file mode 100644 index 0000000..5d11264 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/TAA.shader @@ -0,0 +1,85 @@ +Shader "Hidden/Post FX/Temporal Anti-aliasing" +{ + Properties + { + _MainTex("", 2D) = "black" + } + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // Perspective + Pass + { + CGPROGRAM + #pragma target 5.0 + #pragma vertex VertSolver + #pragma fragment FragSolver + #include "TAA.cginc" + ENDCG + } + + // Ortho + Pass + { + CGPROGRAM + #pragma target 5.0 + #pragma vertex VertSolver + #pragma fragment FragSolver + #define TAA_DILATE_MOTION_VECTOR_SAMPLE 0 + #include "TAA.cginc" + ENDCG + } + + // Alpha Clear + Pass + { + CGPROGRAM + #pragma target 5.0 + #pragma vertex VertDefault + #pragma fragment FragAlphaClear + #include "TAA.cginc" + ENDCG + } + } + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // Perspective + Pass + { + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertSolver + #pragma fragment FragSolver + #include "TAA.cginc" + ENDCG + } + + // Ortho + Pass + { + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertSolver + #pragma fragment FragSolver + #define TAA_DILATE_MOTION_VECTOR_SAMPLE 0 + #include "TAA.cginc" + ENDCG + } + + // Alpha Clear + Pass + { + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertDefault + #pragma fragment FragAlphaClear + #include "TAA.cginc" + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/TAA.shader.meta b/Assets/PostProcessing/Resources/Shaders/TAA.shader.meta new file mode 100644 index 0000000..e5145ee --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/TAA.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ec6c5af987867f54aa08fba81ee279bd +timeCreated: 1472807140 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/Tonemapping.cginc b/Assets/PostProcessing/Resources/Shaders/Tonemapping.cginc new file mode 100644 index 0000000..d33f45f --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Tonemapping.cginc @@ -0,0 +1,120 @@ +#ifndef __TONEMAPPING__ +#define __TONEMAPPING__ + +#include "ACES.cginc" + +// Set to 1 to use the full reference ACES tonemapper. This should only be used for research +// purposes and it's quite heavy and generally overkill. +#define TONEMAPPING_USE_FULL_ACES 0 + +// +// Neutral tonemapping (Hable/Hejl/Frostbite) +// Input is linear RGB +// +half3 NeutralCurve(half3 x, half a, half b, half c, half d, half e, half f) +{ + return ((x * (a * x + c * b) + d * e) / (x * (a * x + b) + d * f)) - e / f; +} + +half3 NeutralTonemap(half3 x, half4 params1, half4 params2) +{ + // ACES supports negative color values and WILL output negative values when coming from ACES or ACEScg + // Make sure negative channels are clamped to 0.0 as this neutral tonemapper can't deal with them properly + x = max((0.0).xxx, x); + + // Tonemap + half a = params1.x; + half b = params1.y; + half c = params1.z; + half d = params1.w; + half e = params2.x; + half f = params2.y; + half whiteLevel = params2.z; + half whiteClip = params2.w; + + half3 whiteScale = (1.0).xxx / NeutralCurve(whiteLevel, a, b, c, d, e, f); + x = NeutralCurve(x * whiteScale, a, b, c, d, e, f); + x *= whiteScale; + + // Post-curve white point adjustment + x /= whiteClip.xxx; + + return x; +} + +// +// Filmic tonemapping (ACES fitting, unless TONEMAPPING_USE_FULL_ACES is set to 1) +// Input is ACES2065-1 (AP0 w/ linear encoding) +// +half3 FilmicTonemap(half3 aces) +{ +#if TONEMAPPING_USE_FULL_ACES + + half3 oces = RRT(aces); + half3 odt = ODT_RGBmonitor_100nits_dim(oces); + return odt; + +#else + + // --- Glow module --- // + half saturation = rgb_2_saturation(aces); + half ycIn = rgb_2_yc(aces); + half s = sigmoid_shaper((saturation - 0.4) / 0.2); + half addedGlow = 1.0 + glow_fwd(ycIn, RRT_GLOW_GAIN * s, RRT_GLOW_MID); + aces *= addedGlow; + + // --- Red modifier --- // + half hue = rgb_2_hue(aces); + half centeredHue = center_hue(hue, RRT_RED_HUE); + half hueWeight; + { + //hueWeight = cubic_basis_shaper(centeredHue, RRT_RED_WIDTH); + hueWeight = Pow2(smoothstep(0.0, 1.0, 1.0 - abs(2.0 * centeredHue / RRT_RED_WIDTH))); + } + + aces.r += hueWeight * saturation * (RRT_RED_PIVOT - aces.r) * (1.0 - RRT_RED_SCALE); + + // --- ACES to RGB rendering space --- // + half3 acescg = max(0.0, ACES_to_ACEScg(aces)); + + // --- Global desaturation --- // + //acescg = mul(RRT_SAT_MAT, acescg); + acescg = lerp(dot(acescg, AP1_RGB2Y).xxx, acescg, RRT_SAT_FACTOR.xxx); + + // Luminance fitting of *RRT.a1.0.3 + ODT.Academy.RGBmonitor_100nits_dim.a1.0.3*. + // https://github.com/colour-science/colour-unity/blob/master/Assets/Colour/Notebooks/CIECAM02_Unity.ipynb + // RMSE: 0.0012846272106 + const half a = 278.5085; + const half b = 10.7772; + const half c = 293.6045; + const half d = 88.7122; + const half e = 80.6889; + half3 x = acescg; + half3 rgbPost = (x * (a * x + b)) / (x * (c * x + d) + e); + + // Scale luminance to linear code value + // half3 linearCV = Y_2_linCV(rgbPost, CINEMA_WHITE, CINEMA_BLACK); + + // Apply gamma adjustment to compensate for dim surround + half3 linearCV = darkSurround_to_dimSurround(rgbPost); + + // Apply desaturation to compensate for luminance difference + //linearCV = mul(ODT_SAT_MAT, color); + linearCV = lerp(dot(linearCV, AP1_RGB2Y).xxx, linearCV, ODT_SAT_FACTOR.xxx); + + // Convert to display primary encoding + // Rendering space RGB to XYZ + half3 XYZ = mul(AP1_2_XYZ_MAT, linearCV); + + // Apply CAT from ACES white point to assumed observer adapted white point + XYZ = mul(D60_2_D65_CAT, XYZ); + + // CIE XYZ to display primaries + linearCV = mul(XYZ_2_REC709_MAT, XYZ); + + return linearCV; + +#endif +} + +#endif // __TONEMAPPING__ diff --git a/Assets/PostProcessing/Resources/Shaders/Tonemapping.cginc.meta b/Assets/PostProcessing/Resources/Shaders/Tonemapping.cginc.meta new file mode 100644 index 0000000..36aa036 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Tonemapping.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0a999e641c982a14d9c68dfd53a98afc +timeCreated: 1469104178 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/Uber.shader b/Assets/PostProcessing/Resources/Shaders/Uber.shader new file mode 100644 index 0000000..dbfee42 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Uber.shader @@ -0,0 +1,330 @@ +Shader "Hidden/Post FX/Uber Shader" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _AutoExposure ("", 2D) = "" {} + _BloomTex ("", 2D) = "" {} + _Bloom_DirtTex ("", 2D) = "" {} + _GrainTex ("", 2D) = "" {} + _LogLut ("", 2D) = "" {} + _UserLut ("", 2D) = "" {} + _Vignette_Mask ("", 2D) = "" {} + _ChromaticAberration_Spectrum ("", 2D) = "" {} + _DitheringTex ("", 2D) = "" {} + } + + CGINCLUDE + + #pragma target 3.0 + + #pragma multi_compile __ UNITY_COLORSPACE_GAMMA + #pragma multi_compile __ CHROMATIC_ABERRATION + #pragma multi_compile __ DEPTH_OF_FIELD DEPTH_OF_FIELD_COC_VIEW + #pragma multi_compile __ BLOOM BLOOM_LENS_DIRT + #pragma multi_compile __ COLOR_GRADING COLOR_GRADING_LOG_VIEW + #pragma multi_compile __ USER_LUT + #pragma multi_compile __ GRAIN + #pragma multi_compile __ VIGNETTE_CLASSIC VIGNETTE_MASKED + #pragma multi_compile __ DITHERING + + #include "UnityCG.cginc" + #include "Bloom.cginc" + #include "ColorGrading.cginc" + #include "UberSecondPass.cginc" + + // Auto exposure / eye adaptation + sampler2D _AutoExposure; + + // Chromatic aberration + half _ChromaticAberration_Amount; + sampler2D _ChromaticAberration_Spectrum; + + // Depth of field + sampler2D_float _CameraDepthTexture; + sampler2D _DepthOfFieldTex; + sampler2D _DepthOfFieldCoCTex; + float4 _DepthOfFieldTex_TexelSize; + float3 _DepthOfFieldParams; // x: distance, y: f^2 / (N * (S1 - f) * film_width * 2), z: max coc + + // Bloom + sampler2D _BloomTex; + float4 _BloomTex_TexelSize; + half2 _Bloom_Settings; // x: sampleScale, y: bloom.intensity + + sampler2D _Bloom_DirtTex; + half _Bloom_DirtIntensity; + + // Color grading & tonemapping + sampler2D _LogLut; + half3 _LogLut_Params; // x: 1 / lut_width, y: 1 / lut_height, z: lut_height - 1 + half _ExposureEV; // EV (exp2) + + // User lut + sampler2D _UserLut; + half4 _UserLut_Params; // @see _LogLut_Params + + // Vignette + half3 _Vignette_Color; + half2 _Vignette_Center; // UV space + half4 _Vignette_Settings; // x: intensity, y: smoothness, z: roundness, w: rounded + sampler2D _Vignette_Mask; + half _Vignette_Opacity; // [0;1] + + struct VaryingsFlipped + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uvSPR : TEXCOORD1; // Single Pass Stereo UVs + float2 uvFlipped : TEXCOORD2; // Flipped UVs (DX/MSAA/Forward) + float2 uvFlippedSPR : TEXCOORD3; // Single Pass Stereo flipped UVs + }; + + VaryingsFlipped VertUber(AttributesDefault v) + { + VaryingsFlipped o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.uvSPR = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uvFlipped = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0.0) + o.uvFlipped.y = 1.0 - o.uvFlipped.y; + #endif + + o.uvFlippedSPR = UnityStereoScreenSpaceUVAdjust(o.uvFlipped, _MainTex_ST); + + return o; + } + + half4 FragUber(VaryingsFlipped i) : SV_Target + { + float2 uv = i.uv; + half autoExposure = tex2D(_AutoExposure, uv).r; + + half3 color = (0.0).xxx; + #if DEPTH_OF_FIELD && CHROMATIC_ABERRATION + half4 dof = (0.0).xxxx; + half ffa = 0.0; // far field alpha + #endif + + // + // HDR effects + // --------------------------------------------------------- + + // Chromatic Aberration + // Inspired by the method described in "Rendering Inside" [Playdead 2016] + // https://twitter.com/pixelmager/status/717019757766123520 + #if CHROMATIC_ABERRATION + { + float2 coords = 2.0 * uv - 1.0; + float2 end = uv - coords * dot(coords, coords) * _ChromaticAberration_Amount; + + float2 diff = end - uv; + int samples = clamp(int(length(_MainTex_TexelSize.zw * diff / 2.0)), 3, 16); + float2 delta = diff / samples; + float2 pos = uv; + half3 sum = (0.0).xxx, filterSum = (0.0).xxx; + + #if DEPTH_OF_FIELD + float2 dofDelta = delta; + float2 dofPos = pos; + if (_MainTex_TexelSize.y < 0.0) + { + dofDelta.y = -dofDelta.y; + dofPos.y = 1.0 - dofPos.y; + } + half4 dofSum = (0.0).xxxx; + half ffaSum = 0.0; + #endif + + for (int i = 0; i < samples; i++) + { + half t = (i + 0.5) / samples; + half3 s = tex2Dlod(_MainTex, float4(UnityStereoScreenSpaceUVAdjust(pos, _MainTex_ST), 0, 0)).rgb; + half3 filter = tex2Dlod(_ChromaticAberration_Spectrum, float4(t, 0, 0, 0)).rgb; + + sum += s * filter; + filterSum += filter; + pos += delta; + + #if DEPTH_OF_FIELD + float4 uvDof = float4(UnityStereoScreenSpaceUVAdjust(dofPos, _MainTex_ST), 0, 0); + half4 sdof = tex2Dlod(_DepthOfFieldTex, uvDof).rgba; + half scoc = tex2Dlod(_DepthOfFieldCoCTex, uvDof).r; + scoc = (scoc - 0.5) * 2 * _DepthOfFieldParams.z; + dofSum += sdof * half4(filter, 1); + ffaSum += smoothstep(_MainTex_TexelSize.y * 2, _MainTex_TexelSize.y * 4, scoc); + dofPos += dofDelta; + #endif + } + + color = sum / filterSum; + #if DEPTH_OF_FIELD + dof = dofSum / half4(filterSum, samples); + ffa = ffaSum / samples; + #endif + } + #else + { + color = tex2D(_MainTex, i.uvSPR).rgb; + } + #endif + + // Apply auto exposure if any + color *= autoExposure; + + // Gamma space... Gah. + #if UNITY_COLORSPACE_GAMMA + { + color = GammaToLinearSpace(color); + } + #endif + + // Depth of field + #if DEPTH_OF_FIELD_COC_VIEW + { + // Calculate the radiuses of CoC. + half4 src = tex2D(_DepthOfFieldTex, uv); + float depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uvFlippedSPR)); + float coc = (depth - _DepthOfFieldParams.x) * _DepthOfFieldParams.y / depth; + coc *= 80; + + // Visualize CoC (white -> red -> gray) + half3 rgb = lerp(half3(1, 0, 0), half3(1.0, 1.0, 1.0), saturate(-coc)); + rgb = lerp(rgb, half3(0.4, 0.4, 0.4), saturate(coc)); + + // Black and white image overlay + rgb *= AcesLuminance(color) + 0.5; + + // Gamma correction + #if !UNITY_COLORSPACE_GAMMA + { + rgb = GammaToLinearSpace(rgb); + } + #endif + + color = rgb; + } + #elif DEPTH_OF_FIELD + { + #if !CHROMATIC_ABERRATION + half4 dof = tex2D(_DepthOfFieldTex, i.uvFlippedSPR); + half coc = tex2D(_DepthOfFieldCoCTex, i.uvFlippedSPR); + coc = (coc - 0.5) * 2 * _DepthOfFieldParams.z; + // Convert CoC to far field alpha value. + float ffa = smoothstep(_MainTex_TexelSize.y * 2, _MainTex_TexelSize.y * 4, coc); + #endif + // lerp(lerp(color, dof, ffa), dof, dof.a) + color = lerp(color, dof.rgb * autoExposure, ffa + dof.a - ffa * dof.a); + } + #endif + + // HDR Bloom + #if BLOOM || BLOOM_LENS_DIRT + { + half3 bloom = UpsampleFilter(_BloomTex, i.uvFlippedSPR, _BloomTex_TexelSize.xy, _Bloom_Settings.x) * _Bloom_Settings.y; + color += bloom; + + #if BLOOM_LENS_DIRT + { + half3 dirt = tex2D(_Bloom_DirtTex, i.uvFlipped).rgb * _Bloom_DirtIntensity; + color += bloom * dirt; + } + #endif + } + #endif + + // Procedural vignette + #if VIGNETTE_CLASSIC + { + half2 d = abs(uv - _Vignette_Center) * _Vignette_Settings.x; + d.x *= lerp(1.0, _ScreenParams.x / _ScreenParams.y, _Vignette_Settings.w); + d = pow(d, _Vignette_Settings.z); // Roundness + half vfactor = pow(saturate(1.0 - dot(d, d)), _Vignette_Settings.y); + color *= lerp(_Vignette_Color, (1.0).xxx, vfactor); + } + + // Masked vignette + #elif VIGNETTE_MASKED + { + half vfactor = tex2D(_Vignette_Mask, uv).a; + half3 new_color = color * lerp(_Vignette_Color, (1.0).xxx, vfactor); + color = lerp(color, new_color, _Vignette_Opacity); + } + #endif + + // HDR color grading & tonemapping + #if COLOR_GRADING_LOG_VIEW + { + color *= _ExposureEV; + color = saturate(LinearToLogC(color)); + } + #elif COLOR_GRADING + { + color *= _ExposureEV; // Exposure is in ev units (or 'stops') + + half3 colorLogC = saturate(LinearToLogC(color)); + color = ApplyLut2d(_LogLut, colorLogC, _LogLut_Params); + } + #endif + + // + // All the following effects happen in LDR + // --------------------------------------------------------- + + color = saturate(color); + + // Back to gamma space if needed + #if UNITY_COLORSPACE_GAMMA + { + color = LinearToGammaSpace(color); + } + #endif + + // LDR user lut + #if USER_LUT + { + color = saturate(color); + half3 colorGraded; + + #if !UNITY_COLORSPACE_GAMMA + { + colorGraded = ApplyLut2d(_UserLut, LinearToGammaSpace(color), _UserLut_Params.xyz); + colorGraded = GammaToLinearSpace(colorGraded); + } + #else + { + colorGraded = ApplyLut2d(_UserLut, color, _UserLut_Params.xyz); + } + #endif + + color = lerp(color, colorGraded, _UserLut_Params.w); + } + #endif + + color = UberSecondPass(color, uv); + + // Done ! + return half4(color, 1.0); + } + + ENDCG + + SubShader + { + Cull Off ZWrite Off ZTest Always + + // (0) + Pass + { + CGPROGRAM + + #pragma vertex VertUber + #pragma fragment FragUber + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Resources/Shaders/Uber.shader.meta b/Assets/PostProcessing/Resources/Shaders/Uber.shader.meta new file mode 100644 index 0000000..ee77cf5 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/Uber.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8ce0a6f4c8cae334d8a5617f302b6769 +timeCreated: 1459956426 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Resources/Shaders/UberSecondPass.cginc b/Assets/PostProcessing/Resources/Shaders/UberSecondPass.cginc new file mode 100644 index 0000000..4a53822 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/UberSecondPass.cginc @@ -0,0 +1,39 @@ +#include "ColorGrading.cginc" + +// Grain +half2 _Grain_Params1; // x: lum_contrib, y: intensity +half4 _Grain_Params2; // x: xscale, h: yscale, z: xoffset, w: yoffset +sampler2D _GrainTex; + +// Dithering +sampler2D _DitheringTex; +float4 _DitheringCoords; + +float3 UberSecondPass(half3 color, float2 uv) +{ + // Grain + #if GRAIN + { + float3 grain = tex2D(_GrainTex, uv * _Grain_Params2.xy + _Grain_Params2.zw).rgb; + + // Noisiness response curve based on scene luminance + float lum = 1.0 - sqrt(AcesLuminance(color)); + lum = lerp(1.0, lum, _Grain_Params1.x); + + color += color * grain * _Grain_Params1.y * lum; + } + #endif + + // Blue noise dithering + #if DITHERING + { + // Symmetric triangular distribution on [-1,1] with maximal density at 0 + float noise = tex2D(_DitheringTex, uv * _DitheringCoords.xy + _DitheringCoords.zw).a * 2.0 - 1.0; + noise = sign(noise) * (1.0 - sqrt(1.0 - abs(noise))) / 255.0; + + color += noise; + } + #endif + + return color; +} diff --git a/Assets/PostProcessing/Resources/Shaders/UberSecondPass.cginc.meta b/Assets/PostProcessing/Resources/Shaders/UberSecondPass.cginc.meta new file mode 100644 index 0000000..50c4d97 --- /dev/null +++ b/Assets/PostProcessing/Resources/Shaders/UberSecondPass.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b6e42614562a56445ba4b5d90301f06f +timeCreated: 1487080088 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime.meta b/Assets/PostProcessing/Runtime.meta new file mode 100644 index 0000000..1f6238f --- /dev/null +++ b/Assets/PostProcessing/Runtime.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4b79d54138d9d1a498085393504c7d02 +folderAsset: yes +timeCreated: 1466585248 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Attributes.meta b/Assets/PostProcessing/Runtime/Attributes.meta new file mode 100644 index 0000000..c8ecf57 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 68327f748e8ffd94889a47317b7d327b +folderAsset: yes +timeCreated: 1460383911 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Attributes/GetSetAttribute.cs b/Assets/PostProcessing/Runtime/Attributes/GetSetAttribute.cs new file mode 100644 index 0000000..cc1bf41 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/GetSetAttribute.cs @@ -0,0 +1,13 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class GetSetAttribute : PropertyAttribute + { + public readonly string name; + public bool dirty; + + public GetSetAttribute(string name) + { + this.name = name; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Attributes/GetSetAttribute.cs.meta b/Assets/PostProcessing/Runtime/Attributes/GetSetAttribute.cs.meta new file mode 100644 index 0000000..301aa33 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/GetSetAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f17e8602928ea02419dae051ec79c5a2 +timeCreated: 1460383955 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Attributes/MinAttribute.cs b/Assets/PostProcessing/Runtime/Attributes/MinAttribute.cs new file mode 100644 index 0000000..58fd5b7 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/MinAttribute.cs @@ -0,0 +1,14 @@ +#if !UNITY_2018_3_OR_NEWER +namespace UnityEngine.PostProcessing +{ + public sealed class MinAttribute : PropertyAttribute + { + public readonly float min; + + public MinAttribute(float min) + { + this.min = min; + } + } +} +#endif diff --git a/Assets/PostProcessing/Runtime/Attributes/MinAttribute.cs.meta b/Assets/PostProcessing/Runtime/Attributes/MinAttribute.cs.meta new file mode 100644 index 0000000..7086770 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/MinAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9af2f505033843c46a362e251937acb1 +timeCreated: 1462281908 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Attributes/TrackballAttribute.cs b/Assets/PostProcessing/Runtime/Attributes/TrackballAttribute.cs new file mode 100644 index 0000000..9acf912 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/TrackballAttribute.cs @@ -0,0 +1,12 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class TrackballAttribute : PropertyAttribute + { + public readonly string method; + + public TrackballAttribute(string method) + { + this.method = method; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Attributes/TrackballAttribute.cs.meta b/Assets/PostProcessing/Runtime/Attributes/TrackballAttribute.cs.meta new file mode 100644 index 0000000..5ae991e --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/TrackballAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 65e30143f4e114f45b84a1d9cba8f469 +timeCreated: 1463400829 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Attributes/TrackballGroupAttribute.cs b/Assets/PostProcessing/Runtime/Attributes/TrackballGroupAttribute.cs new file mode 100644 index 0000000..c29c03d --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/TrackballGroupAttribute.cs @@ -0,0 +1,6 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class TrackballGroupAttribute : PropertyAttribute + { + } +} diff --git a/Assets/PostProcessing/Runtime/Attributes/TrackballGroupAttribute.cs.meta b/Assets/PostProcessing/Runtime/Attributes/TrackballGroupAttribute.cs.meta new file mode 100644 index 0000000..f945ebb --- /dev/null +++ b/Assets/PostProcessing/Runtime/Attributes/TrackballGroupAttribute.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aa62a51ebe4821e4b89a64d267b30a27 +timeCreated: 1460563239 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components.meta b/Assets/PostProcessing/Runtime/Components.meta new file mode 100644 index 0000000..5ef3493 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c1f765b2bd3d2ad49b2677f6478a9ba3 +folderAsset: yes +timeCreated: 1466585494 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/AmbientOcclusionComponent.cs b/Assets/PostProcessing/Runtime/Components/AmbientOcclusionComponent.cs new file mode 100644 index 0000000..45ca0bb --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/AmbientOcclusionComponent.cs @@ -0,0 +1,185 @@ +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + using DebugMode = BuiltinDebugViewsModel.Mode; + + public sealed class AmbientOcclusionComponent : PostProcessingComponentCommandBuffer + { + static class Uniforms + { + internal static readonly int _Intensity = Shader.PropertyToID("_Intensity"); + internal static readonly int _Radius = Shader.PropertyToID("_Radius"); + internal static readonly int _FogParams = Shader.PropertyToID("_FogParams"); + internal static readonly int _Downsample = Shader.PropertyToID("_Downsample"); + internal static readonly int _SampleCount = Shader.PropertyToID("_SampleCount"); + internal static readonly int _OcclusionTexture1 = Shader.PropertyToID("_OcclusionTexture1"); + internal static readonly int _OcclusionTexture2 = Shader.PropertyToID("_OcclusionTexture2"); + internal static readonly int _OcclusionTexture = Shader.PropertyToID("_OcclusionTexture"); + internal static readonly int _MainTex = Shader.PropertyToID("_MainTex"); + internal static readonly int _TempRT = Shader.PropertyToID("_TempRT"); + } + + const string k_BlitShaderString = "Hidden/Post FX/Blit"; + const string k_ShaderString = "Hidden/Post FX/Ambient Occlusion"; + + readonly RenderTargetIdentifier[] m_MRT = + { + BuiltinRenderTextureType.GBuffer0, // Albedo, Occ + BuiltinRenderTextureType.CameraTarget // Ambient + }; + + enum OcclusionSource + { + DepthTexture, + DepthNormalsTexture, + GBuffer + } + + OcclusionSource occlusionSource + { + get + { + if (context.isGBufferAvailable && !model.settings.forceForwardCompatibility) + return OcclusionSource.GBuffer; + + if (model.settings.highPrecision && (!context.isGBufferAvailable || model.settings.forceForwardCompatibility)) + return OcclusionSource.DepthTexture; + + return OcclusionSource.DepthNormalsTexture; + } + } + + bool ambientOnlySupported + { + get { return context.isHdr && model.settings.ambientOnly && context.isGBufferAvailable && !model.settings.forceForwardCompatibility; } + } + + public override bool active + { + get + { + return model.enabled + && model.settings.intensity > 0f + && !context.interrupted; + } + } + + public override DepthTextureMode GetCameraFlags() + { + var flags = DepthTextureMode.None; + + if (occlusionSource == OcclusionSource.DepthTexture) + flags |= DepthTextureMode.Depth; + + if (occlusionSource != OcclusionSource.GBuffer) + flags |= DepthTextureMode.DepthNormals; + + return flags; + } + + public override string GetName() + { + return "Ambient Occlusion"; + } + + public override CameraEvent GetCameraEvent() + { + return ambientOnlySupported && !context.profile.debugViews.IsModeActive(DebugMode.AmbientOcclusion) + ? CameraEvent.BeforeReflections + : CameraEvent.BeforeImageEffectsOpaque; + } + + public override void PopulateCommandBuffer(CommandBuffer cb) + { + var settings = model.settings; + + // Material setup + var blitMaterial = context.materialFactory.Get(k_BlitShaderString); + + var material = context.materialFactory.Get(k_ShaderString); + material.shaderKeywords = null; + material.SetFloat(Uniforms._Intensity, settings.intensity); + material.SetFloat(Uniforms._Radius, settings.radius); + material.SetFloat(Uniforms._Downsample, settings.downsampling ? 0.5f : 1f); + material.SetInt(Uniforms._SampleCount, (int)settings.sampleCount); + + if (!context.isGBufferAvailable && RenderSettings.fog) + { + material.SetVector(Uniforms._FogParams, new Vector3(RenderSettings.fogDensity, RenderSettings.fogStartDistance, RenderSettings.fogEndDistance)); + + switch (RenderSettings.fogMode) + { + case FogMode.Linear: + material.EnableKeyword("FOG_LINEAR"); + break; + case FogMode.Exponential: + material.EnableKeyword("FOG_EXP"); + break; + case FogMode.ExponentialSquared: + material.EnableKeyword("FOG_EXP2"); + break; + } + } + else + { + material.EnableKeyword("FOG_OFF"); + } + + int tw = context.width; + int th = context.height; + int ts = settings.downsampling ? 2 : 1; + const RenderTextureFormat kFormat = RenderTextureFormat.ARGB32; + const RenderTextureReadWrite kRWMode = RenderTextureReadWrite.Linear; + const FilterMode kFilter = FilterMode.Bilinear; + + // AO buffer + var rtMask = Uniforms._OcclusionTexture1; + cb.GetTemporaryRT(rtMask, tw / ts, th / ts, 0, kFilter, kFormat, kRWMode); + + // AO estimation + cb.Blit((Texture)null, rtMask, material, (int)occlusionSource); + + // Blur buffer + var rtBlur = Uniforms._OcclusionTexture2; + + // Separable blur (horizontal pass) + cb.GetTemporaryRT(rtBlur, tw, th, 0, kFilter, kFormat, kRWMode); + cb.SetGlobalTexture(Uniforms._MainTex, rtMask); + cb.Blit(rtMask, rtBlur, material, occlusionSource == OcclusionSource.GBuffer ? 4 : 3); + cb.ReleaseTemporaryRT(rtMask); + + // Separable blur (vertical pass) + rtMask = Uniforms._OcclusionTexture; + cb.GetTemporaryRT(rtMask, tw, th, 0, kFilter, kFormat, kRWMode); + cb.SetGlobalTexture(Uniforms._MainTex, rtBlur); + cb.Blit(rtBlur, rtMask, material, 5); + cb.ReleaseTemporaryRT(rtBlur); + + if (context.profile.debugViews.IsModeActive(DebugMode.AmbientOcclusion)) + { + cb.SetGlobalTexture(Uniforms._MainTex, rtMask); + cb.Blit(rtMask, BuiltinRenderTextureType.CameraTarget, material, 8); + context.Interrupt(); + } + else if (ambientOnlySupported) + { + cb.SetRenderTarget(m_MRT, BuiltinRenderTextureType.CameraTarget); + cb.DrawMesh(GraphicsUtils.quad, Matrix4x4.identity, material, 0, 7); + } + else + { + var fbFormat = context.isHdr ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default; + + int tempRT = Uniforms._TempRT; + cb.GetTemporaryRT(tempRT, context.width, context.height, 0, FilterMode.Bilinear, fbFormat); + cb.Blit(BuiltinRenderTextureType.CameraTarget, tempRT, blitMaterial, 0); + cb.SetGlobalTexture(Uniforms._MainTex, tempRT); + cb.Blit(tempRT, BuiltinRenderTextureType.CameraTarget, material, 6); + cb.ReleaseTemporaryRT(tempRT); + } + + cb.ReleaseTemporaryRT(rtMask); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/AmbientOcclusionComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/AmbientOcclusionComponent.cs.meta new file mode 100644 index 0000000..79b4eb1 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/AmbientOcclusionComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c6e33ce72d3776b408121f946283403d +timeCreated: 1467275948 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/BloomComponent.cs b/Assets/PostProcessing/Runtime/Components/BloomComponent.cs new file mode 100644 index 0000000..4879447 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/BloomComponent.cs @@ -0,0 +1,144 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class BloomComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _AutoExposure = Shader.PropertyToID("_AutoExposure"); + internal static readonly int _Threshold = Shader.PropertyToID("_Threshold"); + internal static readonly int _Curve = Shader.PropertyToID("_Curve"); + internal static readonly int _PrefilterOffs = Shader.PropertyToID("_PrefilterOffs"); + internal static readonly int _SampleScale = Shader.PropertyToID("_SampleScale"); + internal static readonly int _BaseTex = Shader.PropertyToID("_BaseTex"); + internal static readonly int _BloomTex = Shader.PropertyToID("_BloomTex"); + internal static readonly int _Bloom_Settings = Shader.PropertyToID("_Bloom_Settings"); + internal static readonly int _Bloom_DirtTex = Shader.PropertyToID("_Bloom_DirtTex"); + internal static readonly int _Bloom_DirtIntensity = Shader.PropertyToID("_Bloom_DirtIntensity"); + } + + const int k_MaxPyramidBlurLevel = 16; + readonly RenderTexture[] m_BlurBuffer1 = new RenderTexture[k_MaxPyramidBlurLevel]; + readonly RenderTexture[] m_BlurBuffer2 = new RenderTexture[k_MaxPyramidBlurLevel]; + + public override bool active + { + get + { + return model.enabled + && model.settings.bloom.intensity > 0f + && !context.interrupted; + } + } + + public void Prepare(RenderTexture source, Material uberMaterial, Texture autoExposure) + { + var bloom = model.settings.bloom; + var lensDirt = model.settings.lensDirt; + var material = context.materialFactory.Get("Hidden/Post FX/Bloom"); + material.shaderKeywords = null; + + // Apply auto exposure before the prefiltering pass + material.SetTexture(Uniforms._AutoExposure, autoExposure); + + // Do bloom on a half-res buffer, full-res doesn't bring much and kills performances on + // fillrate limited platforms + var tw = context.width / 2; + var th = context.height / 2; + + // Blur buffer format + // TODO: Extend the use of RGBM to the whole chain for mobile platforms + var useRGBM = Application.isMobilePlatform; + var useRGB111110 = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RGB111110Float); + var rtFormat = useRGBM + ? RenderTextureFormat.Default + : useRGB111110 ? RenderTextureFormat.RGB111110Float : RenderTextureFormat.DefaultHDR; + + // Determine the iteration count + float logh = Mathf.Log(th, 2f) + bloom.radius - 8f; + int logh_i = (int)logh; + int iterations = Mathf.Clamp(logh_i, 1, k_MaxPyramidBlurLevel); + + // Uupdate the shader properties + float lthresh = bloom.thresholdLinear; + material.SetFloat(Uniforms._Threshold, lthresh); + + float knee = lthresh * bloom.softKnee + 1e-5f; + var curve = new Vector3(lthresh - knee, knee * 2f, 0.25f / knee); + material.SetVector(Uniforms._Curve, curve); + + material.SetFloat(Uniforms._PrefilterOffs, bloom.antiFlicker ? -0.5f : 0f); + + float sampleScale = 0.5f + logh - logh_i; + material.SetFloat(Uniforms._SampleScale, sampleScale); + + // TODO: Probably can disable antiFlicker if TAA is enabled - need to do some testing + if (bloom.antiFlicker) + material.EnableKeyword("ANTI_FLICKER"); + + // Prefilter pass + var prefiltered = context.renderTextureFactory.Get(tw, th, 0, rtFormat); + Graphics.Blit(source, prefiltered, material, 0); + + // Construct a mip pyramid + var last = prefiltered; + + for (int level = 0; level < iterations; level++) + { + m_BlurBuffer1[level] = context.renderTextureFactory.Get( + last.width / 2, last.height / 2, 0, rtFormat + ); + + int pass = (level == 0) ? 1 : 2; + Graphics.Blit(last, m_BlurBuffer1[level], material, pass); + + last = m_BlurBuffer1[level]; + } + + // Upsample and combine loop + for (int level = iterations - 2; level >= 0; level--) + { + var baseTex = m_BlurBuffer1[level]; + material.SetTexture(Uniforms._BaseTex, baseTex); + + m_BlurBuffer2[level] = context.renderTextureFactory.Get( + baseTex.width, baseTex.height, 0, rtFormat + ); + + Graphics.Blit(last, m_BlurBuffer2[level], material, 3); + last = m_BlurBuffer2[level]; + } + + var bloomTex = last; + + // Release the temporary buffers + for (int i = 0; i < k_MaxPyramidBlurLevel; i++) + { + if (m_BlurBuffer1[i] != null) + context.renderTextureFactory.Release(m_BlurBuffer1[i]); + + if (m_BlurBuffer2[i] != null && m_BlurBuffer2[i] != bloomTex) + context.renderTextureFactory.Release(m_BlurBuffer2[i]); + + m_BlurBuffer1[i] = null; + m_BlurBuffer2[i] = null; + } + + context.renderTextureFactory.Release(prefiltered); + + // Push everything to the uber material + uberMaterial.SetTexture(Uniforms._BloomTex, bloomTex); + uberMaterial.SetVector(Uniforms._Bloom_Settings, new Vector2(sampleScale, bloom.intensity)); + + if (lensDirt.intensity > 0f && lensDirt.texture != null) + { + uberMaterial.SetTexture(Uniforms._Bloom_DirtTex, lensDirt.texture); + uberMaterial.SetFloat(Uniforms._Bloom_DirtIntensity, lensDirt.intensity); + uberMaterial.EnableKeyword("BLOOM_LENS_DIRT"); + } + else + { + uberMaterial.EnableKeyword("BLOOM"); + } + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/BloomComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/BloomComponent.cs.meta new file mode 100644 index 0000000..63a6432 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/BloomComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: acd4204a794b09048b928b1e987500c5 +timeCreated: 1473089954 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/BuiltinDebugViewsComponent.cs b/Assets/PostProcessing/Runtime/Components/BuiltinDebugViewsComponent.cs new file mode 100644 index 0000000..269aeee --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/BuiltinDebugViewsComponent.cs @@ -0,0 +1,258 @@ +using System.Collections.Generic; +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + using Mode = BuiltinDebugViewsModel.Mode; + + public sealed class BuiltinDebugViewsComponent : PostProcessingComponentCommandBuffer + { + static class Uniforms + { + internal static readonly int _DepthScale = Shader.PropertyToID("_DepthScale"); + internal static readonly int _TempRT = Shader.PropertyToID("_TempRT"); + internal static readonly int _Opacity = Shader.PropertyToID("_Opacity"); + internal static readonly int _MainTex = Shader.PropertyToID("_MainTex"); + internal static readonly int _TempRT2 = Shader.PropertyToID("_TempRT2"); + internal static readonly int _Amplitude = Shader.PropertyToID("_Amplitude"); + internal static readonly int _Scale = Shader.PropertyToID("_Scale"); + } + + const string k_ShaderString = "Hidden/Post FX/Builtin Debug Views"; + + enum Pass + { + Depth, + Normals, + MovecOpacity, + MovecImaging, + MovecArrows + } + + ArrowArray m_Arrows; + + class ArrowArray + { + public Mesh mesh { get; private set; } + + public int columnCount { get; private set; } + public int rowCount { get; private set; } + + public void BuildMesh(int columns, int rows) + { + // Base shape + var arrow = new Vector3[6] + { + new Vector3(0f, 0f, 0f), + new Vector3(0f, 1f, 0f), + new Vector3(0f, 1f, 0f), + new Vector3(-1f, 1f, 0f), + new Vector3(0f, 1f, 0f), + new Vector3(1f, 1f, 0f) + }; + + // make the vertex array + int vcount = 6 * columns * rows; + var vertices = new List(vcount); + var uvs = new List(vcount); + + for (int iy = 0; iy < rows; iy++) + { + for (int ix = 0; ix < columns; ix++) + { + var uv = new Vector2( + (0.5f + ix) / columns, + (0.5f + iy) / rows + ); + + for (int i = 0; i < 6; i++) + { + vertices.Add(arrow[i]); + uvs.Add(uv); + } + } + } + + // make the index array + var indices = new int[vcount]; + + for (int i = 0; i < vcount; i++) + indices[i] = i; + + // initialize the mesh object + mesh = new Mesh { hideFlags = HideFlags.DontSave }; + mesh.SetVertices(vertices); + mesh.SetUVs(0, uvs); + mesh.SetIndices(indices, MeshTopology.Lines, 0); + mesh.UploadMeshData(true); + + // update the properties + columnCount = columns; + rowCount = rows; + } + + public void Release() + { + GraphicsUtils.Destroy(mesh); + mesh = null; + } + } + + public override bool active + { + get + { + return model.IsModeActive(Mode.Depth) + || model.IsModeActive(Mode.Normals) + || model.IsModeActive(Mode.MotionVectors); + } + } + + public override DepthTextureMode GetCameraFlags() + { + var mode = model.settings.mode; + var flags = DepthTextureMode.None; + + switch (mode) + { + case Mode.Normals: + flags |= DepthTextureMode.DepthNormals; + break; + case Mode.MotionVectors: + flags |= DepthTextureMode.MotionVectors | DepthTextureMode.Depth; + break; + case Mode.Depth: + flags |= DepthTextureMode.Depth; + break; + } + + return flags; + } + + public override CameraEvent GetCameraEvent() + { + return model.settings.mode == Mode.MotionVectors + ? CameraEvent.BeforeImageEffects + : CameraEvent.BeforeImageEffectsOpaque; + } + + public override string GetName() + { + return "Builtin Debug Views"; + } + + public override void PopulateCommandBuffer(CommandBuffer cb) + { + var settings = model.settings; + var material = context.materialFactory.Get(k_ShaderString); + material.shaderKeywords = null; + + if (context.isGBufferAvailable) + material.EnableKeyword("SOURCE_GBUFFER"); + + switch (settings.mode) + { + case Mode.Depth: + DepthPass(cb); + break; + case Mode.Normals: + DepthNormalsPass(cb); + break; + case Mode.MotionVectors: + MotionVectorsPass(cb); + break; + } + + context.Interrupt(); + } + + void DepthPass(CommandBuffer cb) + { + var material = context.materialFactory.Get(k_ShaderString); + var settings = model.settings.depth; + + cb.SetGlobalFloat(Uniforms._DepthScale, 1f / settings.scale); + cb.Blit((Texture)null, BuiltinRenderTextureType.CameraTarget, material, (int)Pass.Depth); + } + + void DepthNormalsPass(CommandBuffer cb) + { + var material = context.materialFactory.Get(k_ShaderString); + cb.Blit((Texture)null, BuiltinRenderTextureType.CameraTarget, material, (int)Pass.Normals); + } + + void MotionVectorsPass(CommandBuffer cb) + { +#if UNITY_EDITOR + // Don't render motion vectors preview when the editor is not playing as it can in some + // cases results in ugly artifacts (i.e. when resizing the game view). + if (!Application.isPlaying) + return; +#endif + + var material = context.materialFactory.Get(k_ShaderString); + var settings = model.settings.motionVectors; + + // Blit the original source image + int tempRT = Uniforms._TempRT; + cb.GetTemporaryRT(tempRT, context.width, context.height, 0, FilterMode.Bilinear); + cb.SetGlobalFloat(Uniforms._Opacity, settings.sourceOpacity); + cb.SetGlobalTexture(Uniforms._MainTex, BuiltinRenderTextureType.CameraTarget); + cb.Blit(BuiltinRenderTextureType.CameraTarget, tempRT, material, (int)Pass.MovecOpacity); + + // Motion vectors (imaging) + if (settings.motionImageOpacity > 0f && settings.motionImageAmplitude > 0f) + { + int tempRT2 = Uniforms._TempRT2; + cb.GetTemporaryRT(tempRT2, context.width, context.height, 0, FilterMode.Bilinear); + cb.SetGlobalFloat(Uniforms._Opacity, settings.motionImageOpacity); + cb.SetGlobalFloat(Uniforms._Amplitude, settings.motionImageAmplitude); + cb.SetGlobalTexture(Uniforms._MainTex, tempRT); + cb.Blit(tempRT, tempRT2, material, (int)Pass.MovecImaging); + cb.ReleaseTemporaryRT(tempRT); + tempRT = tempRT2; + } + + // Motion vectors (arrows) + if (settings.motionVectorsOpacity > 0f && settings.motionVectorsAmplitude > 0f) + { + PrepareArrows(); + + float sy = 1f / settings.motionVectorsResolution; + float sx = sy * context.height / context.width; + + cb.SetGlobalVector(Uniforms._Scale, new Vector2(sx, sy)); + cb.SetGlobalFloat(Uniforms._Opacity, settings.motionVectorsOpacity); + cb.SetGlobalFloat(Uniforms._Amplitude, settings.motionVectorsAmplitude); + cb.DrawMesh(m_Arrows.mesh, Matrix4x4.identity, material, 0, (int)Pass.MovecArrows); + } + + cb.SetGlobalTexture(Uniforms._MainTex, tempRT); + cb.Blit(tempRT, BuiltinRenderTextureType.CameraTarget); + cb.ReleaseTemporaryRT(tempRT); + } + + void PrepareArrows() + { + int row = model.settings.motionVectors.motionVectorsResolution; + int col = row * Screen.width / Screen.height; + + if (m_Arrows == null) + m_Arrows = new ArrowArray(); + + if (m_Arrows.columnCount != col || m_Arrows.rowCount != row) + { + m_Arrows.Release(); + m_Arrows.BuildMesh(col, row); + } + } + + public override void OnDisable() + { + if (m_Arrows != null) + m_Arrows.Release(); + + m_Arrows = null; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/BuiltinDebugViewsComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/BuiltinDebugViewsComponent.cs.meta new file mode 100644 index 0000000..518ec30 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/BuiltinDebugViewsComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fd834b6165e82e64f9da2d4ed9f4e236 +timeCreated: 1473163679 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/ChromaticAberrationComponent.cs b/Assets/PostProcessing/Runtime/Components/ChromaticAberrationComponent.cs new file mode 100644 index 0000000..821a29f --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/ChromaticAberrationComponent.cs @@ -0,0 +1,63 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class ChromaticAberrationComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _ChromaticAberration_Amount = Shader.PropertyToID("_ChromaticAberration_Amount"); + internal static readonly int _ChromaticAberration_Spectrum = Shader.PropertyToID("_ChromaticAberration_Spectrum"); + } + + Texture2D m_SpectrumLut; + + public override bool active + { + get + { + return model.enabled + && model.settings.intensity > 0f + && !context.interrupted; + } + } + + public override void OnDisable() + { + GraphicsUtils.Destroy(m_SpectrumLut); + m_SpectrumLut = null; + } + + public override void Prepare(Material uberMaterial) + { + var settings = model.settings; + var spectralLut = settings.spectralTexture; + + if (spectralLut == null) + { + if (m_SpectrumLut == null) + { + m_SpectrumLut = new Texture2D(3, 1, TextureFormat.RGB24, false) + { + name = "Chromatic Aberration Spectrum Lookup", + filterMode = FilterMode.Bilinear, + wrapMode = TextureWrapMode.Clamp, + anisoLevel = 0, + hideFlags = HideFlags.DontSave + }; + + var pixels = new Color[3]; + pixels[0] = new Color(1f, 0f, 0f); + pixels[1] = new Color(0f, 1f, 0f); + pixels[2] = new Color(0f, 0f, 1f); + m_SpectrumLut.SetPixels(pixels); + m_SpectrumLut.Apply(); + } + + spectralLut = m_SpectrumLut; + } + + uberMaterial.EnableKeyword("CHROMATIC_ABERRATION"); + uberMaterial.SetFloat(Uniforms._ChromaticAberration_Amount, settings.intensity * 0.03f); + uberMaterial.SetTexture(Uniforms._ChromaticAberration_Spectrum, spectralLut); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/ChromaticAberrationComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/ChromaticAberrationComponent.cs.meta new file mode 100644 index 0000000..9b1ae48 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/ChromaticAberrationComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b9c65642df654a84d84ded1b07448a4c +timeCreated: 1473085971 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/ColorGradingComponent.cs b/Assets/PostProcessing/Runtime/Components/ColorGradingComponent.cs new file mode 100644 index 0000000..3948e7b --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/ColorGradingComponent.cs @@ -0,0 +1,436 @@ +namespace UnityEngine.PostProcessing +{ + using DebugMode = BuiltinDebugViewsModel.Mode; + + public sealed class ColorGradingComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _LutParams = Shader.PropertyToID("_LutParams"); + internal static readonly int _NeutralTonemapperParams1 = Shader.PropertyToID("_NeutralTonemapperParams1"); + internal static readonly int _NeutralTonemapperParams2 = Shader.PropertyToID("_NeutralTonemapperParams2"); + internal static readonly int _HueShift = Shader.PropertyToID("_HueShift"); + internal static readonly int _Saturation = Shader.PropertyToID("_Saturation"); + internal static readonly int _Contrast = Shader.PropertyToID("_Contrast"); + internal static readonly int _Balance = Shader.PropertyToID("_Balance"); + internal static readonly int _Lift = Shader.PropertyToID("_Lift"); + internal static readonly int _InvGamma = Shader.PropertyToID("_InvGamma"); + internal static readonly int _Gain = Shader.PropertyToID("_Gain"); + internal static readonly int _Slope = Shader.PropertyToID("_Slope"); + internal static readonly int _Power = Shader.PropertyToID("_Power"); + internal static readonly int _Offset = Shader.PropertyToID("_Offset"); + internal static readonly int _ChannelMixerRed = Shader.PropertyToID("_ChannelMixerRed"); + internal static readonly int _ChannelMixerGreen = Shader.PropertyToID("_ChannelMixerGreen"); + internal static readonly int _ChannelMixerBlue = Shader.PropertyToID("_ChannelMixerBlue"); + internal static readonly int _Curves = Shader.PropertyToID("_Curves"); + internal static readonly int _LogLut = Shader.PropertyToID("_LogLut"); + internal static readonly int _LogLut_Params = Shader.PropertyToID("_LogLut_Params"); + internal static readonly int _ExposureEV = Shader.PropertyToID("_ExposureEV"); + } + + const int k_InternalLogLutSize = 32; + const int k_CurvePrecision = 128; + const float k_CurveStep = 1f / k_CurvePrecision; + + Texture2D m_GradingCurves; + Color[] m_pixels = new Color[k_CurvePrecision * 2]; + + public override bool active + { + get + { + return model.enabled + && !context.interrupted; + } + } + + // An analytical model of chromaticity of the standard illuminant, by Judd et al. + // http://en.wikipedia.org/wiki/Standard_illuminant#Illuminant_series_D + // Slightly modifed to adjust it with the D65 white point (x=0.31271, y=0.32902). + float StandardIlluminantY(float x) + { + return 2.87f * x - 3f * x * x - 0.27509507f; + } + + // CIE xy chromaticity to CAT02 LMS. + // http://en.wikipedia.org/wiki/LMS_color_space#CAT02 + Vector3 CIExyToLMS(float x, float y) + { + float Y = 1f; + float X = Y * x / y; + float Z = Y * (1f - x - y) / y; + + float L = 0.7328f * X + 0.4296f * Y - 0.1624f * Z; + float M = -0.7036f * X + 1.6975f * Y + 0.0061f * Z; + float S = 0.0030f * X + 0.0136f * Y + 0.9834f * Z; + + return new Vector3(L, M, S); + } + + Vector3 CalculateColorBalance(float temperature, float tint) + { + // Range ~[-1.8;1.8] ; using higher ranges is unsafe + float t1 = temperature / 55f; + float t2 = tint / 55f; + + // Get the CIE xy chromaticity of the reference white point. + // Note: 0.31271 = x value on the D65 white point + float x = 0.31271f - t1 * (t1 < 0f ? 0.1f : 0.05f); + float y = StandardIlluminantY(x) + t2 * 0.05f; + + // Calculate the coefficients in the LMS space. + var w1 = new Vector3(0.949237f, 1.03542f, 1.08728f); // D65 white point + var w2 = CIExyToLMS(x, y); + return new Vector3(w1.x / w2.x, w1.y / w2.y, w1.z / w2.z); + } + + static Color NormalizeColor(Color c) + { + float sum = (c.r + c.g + c.b) / 3f; + + if (Mathf.Approximately(sum, 0f)) + return new Color(1f, 1f, 1f, c.a); + + return new Color + { + r = c.r / sum, + g = c.g / sum, + b = c.b / sum, + a = c.a + }; + } + + static Vector3 ClampVector(Vector3 v, float min, float max) + { + return new Vector3( + Mathf.Clamp(v.x, min, max), + Mathf.Clamp(v.y, min, max), + Mathf.Clamp(v.z, min, max) + ); + } + + public static Vector3 GetLiftValue(Color lift) + { + const float kLiftScale = 0.1f; + + var nLift = NormalizeColor(lift); + float avgLift = (nLift.r + nLift.g + nLift.b) / 3f; + + // Getting some artifacts when going into the negatives using a very low offset (lift.a) with non ACES-tonemapping + float liftR = (nLift.r - avgLift) * kLiftScale + lift.a; + float liftG = (nLift.g - avgLift) * kLiftScale + lift.a; + float liftB = (nLift.b - avgLift) * kLiftScale + lift.a; + + return ClampVector(new Vector3(liftR, liftG, liftB), -1f, 1f); + } + + public static Vector3 GetGammaValue(Color gamma) + { + const float kGammaScale = 0.5f; + const float kMinGamma = 0.01f; + + var nGamma = NormalizeColor(gamma); + float avgGamma = (nGamma.r + nGamma.g + nGamma.b) / 3f; + + gamma.a *= gamma.a < 0f ? 0.8f : 5f; + float gammaR = Mathf.Pow(2f, (nGamma.r - avgGamma) * kGammaScale) + gamma.a; + float gammaG = Mathf.Pow(2f, (nGamma.g - avgGamma) * kGammaScale) + gamma.a; + float gammaB = Mathf.Pow(2f, (nGamma.b - avgGamma) * kGammaScale) + gamma.a; + + float invGammaR = 1f / Mathf.Max(kMinGamma, gammaR); + float invGammaG = 1f / Mathf.Max(kMinGamma, gammaG); + float invGammaB = 1f / Mathf.Max(kMinGamma, gammaB); + + return ClampVector(new Vector3(invGammaR, invGammaG, invGammaB), 0f, 5f); + } + + public static Vector3 GetGainValue(Color gain) + { + const float kGainScale = 0.5f; + + var nGain = NormalizeColor(gain); + float avgGain = (nGain.r + nGain.g + nGain.b) / 3f; + + gain.a *= gain.a > 0f ? 3f : 1f; + float gainR = Mathf.Pow(2f, (nGain.r - avgGain) * kGainScale) + gain.a; + float gainG = Mathf.Pow(2f, (nGain.g - avgGain) * kGainScale) + gain.a; + float gainB = Mathf.Pow(2f, (nGain.b - avgGain) * kGainScale) + gain.a; + + return ClampVector(new Vector3(gainR, gainG, gainB), 0f, 4f); + } + + public static void CalculateLiftGammaGain(Color lift, Color gamma, Color gain, out Vector3 outLift, out Vector3 outGamma, out Vector3 outGain) + { + outLift = GetLiftValue(lift); + outGamma = GetGammaValue(gamma); + outGain = GetGainValue(gain); + } + + public static Vector3 GetSlopeValue(Color slope) + { + const float kSlopeScale = 0.1f; + + var nSlope = NormalizeColor(slope); + float avgSlope = (nSlope.r + nSlope.g + nSlope.b) / 3f; + + slope.a *= 0.5f; + float slopeR = (nSlope.r - avgSlope) * kSlopeScale + slope.a + 1f; + float slopeG = (nSlope.g - avgSlope) * kSlopeScale + slope.a + 1f; + float slopeB = (nSlope.b - avgSlope) * kSlopeScale + slope.a + 1f; + + return ClampVector(new Vector3(slopeR, slopeG, slopeB), 0f, 2f); + } + + public static Vector3 GetPowerValue(Color power) + { + const float kPowerScale = 0.1f; + const float minPower = 0.01f; + + var nPower = NormalizeColor(power); + float avgPower = (nPower.r + nPower.g + nPower.b) / 3f; + + power.a *= 0.5f; + float powerR = (nPower.r - avgPower) * kPowerScale + power.a + 1f; + float powerG = (nPower.g - avgPower) * kPowerScale + power.a + 1f; + float powerB = (nPower.b - avgPower) * kPowerScale + power.a + 1f; + + float invPowerR = 1f / Mathf.Max(minPower, powerR); + float invPowerG = 1f / Mathf.Max(minPower, powerG); + float invPowerB = 1f / Mathf.Max(minPower, powerB); + + return ClampVector(new Vector3(invPowerR, invPowerG, invPowerB), 0.5f, 2.5f); + } + + public static Vector3 GetOffsetValue(Color offset) + { + const float kOffsetScale = 0.05f; + + var nOffset = NormalizeColor(offset); + float avgOffset = (nOffset.r + nOffset.g + nOffset.b) / 3f; + + offset.a *= 0.5f; + float offsetR = (nOffset.r - avgOffset) * kOffsetScale + offset.a; + float offsetG = (nOffset.g - avgOffset) * kOffsetScale + offset.a; + float offsetB = (nOffset.b - avgOffset) * kOffsetScale + offset.a; + + return ClampVector(new Vector3(offsetR, offsetG, offsetB), -0.8f, 0.8f); + } + + public static void CalculateSlopePowerOffset(Color slope, Color power, Color offset, out Vector3 outSlope, out Vector3 outPower, out Vector3 outOffset) + { + outSlope = GetSlopeValue(slope); + outPower = GetPowerValue(power); + outOffset = GetOffsetValue(offset); + } + + TextureFormat GetCurveFormat() + { + if (SystemInfo.SupportsTextureFormat(TextureFormat.RGBAHalf)) + return TextureFormat.RGBAHalf; + + return TextureFormat.RGBA32; + } + + Texture2D GetCurveTexture() + { + if (m_GradingCurves == null) + { + m_GradingCurves = new Texture2D(k_CurvePrecision, 2, GetCurveFormat(), false, true) + { + name = "Internal Curves Texture", + hideFlags = HideFlags.DontSave, + anisoLevel = 0, + wrapMode = TextureWrapMode.Clamp, + filterMode = FilterMode.Bilinear + }; + } + + var curves = model.settings.curves; + curves.hueVShue.Cache(); + curves.hueVSsat.Cache(); + + for (int i = 0; i < k_CurvePrecision; i++) + { + float t = i * k_CurveStep; + + // HSL + float x = curves.hueVShue.Evaluate(t); + float y = curves.hueVSsat.Evaluate(t); + float z = curves.satVSsat.Evaluate(t); + float w = curves.lumVSsat.Evaluate(t); + m_pixels[i] = new Color(x, y, z, w); + + // YRGB + float m = curves.master.Evaluate(t); + float r = curves.red.Evaluate(t); + float g = curves.green.Evaluate(t); + float b = curves.blue.Evaluate(t); + m_pixels[i + k_CurvePrecision] = new Color(r, g, b, m); + } + + m_GradingCurves.SetPixels(m_pixels); + m_GradingCurves.Apply(false, false); + + return m_GradingCurves; + } + + bool IsLogLutValid(RenderTexture lut) + { + return lut != null && lut.IsCreated() && lut.height == k_InternalLogLutSize; + } + + RenderTextureFormat GetLutFormat() + { + if (SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf)) + return RenderTextureFormat.ARGBHalf; + + return RenderTextureFormat.ARGB32; + } + + void GenerateLut() + { + var settings = model.settings; + + if (!IsLogLutValid(model.bakedLut)) + { + GraphicsUtils.Destroy(model.bakedLut); + + model.bakedLut = new RenderTexture(k_InternalLogLutSize * k_InternalLogLutSize, k_InternalLogLutSize, 0, GetLutFormat()) + { + name = "Color Grading Log LUT", + hideFlags = HideFlags.DontSave, + filterMode = FilterMode.Bilinear, + wrapMode = TextureWrapMode.Clamp, + anisoLevel = 0 + }; + } + + var lutMaterial = context.materialFactory.Get("Hidden/Post FX/Lut Generator"); + lutMaterial.SetVector(Uniforms._LutParams, new Vector4( + k_InternalLogLutSize, + 0.5f / (k_InternalLogLutSize * k_InternalLogLutSize), + 0.5f / k_InternalLogLutSize, + k_InternalLogLutSize / (k_InternalLogLutSize - 1f)) + ); + + // Tonemapping + lutMaterial.shaderKeywords = null; + + var tonemapping = settings.tonemapping; + switch (tonemapping.tonemapper) + { + case ColorGradingModel.Tonemapper.Neutral: + { + lutMaterial.EnableKeyword("TONEMAPPING_NEUTRAL"); + + const float scaleFactor = 20f; + const float scaleFactorHalf = scaleFactor * 0.5f; + + float inBlack = tonemapping.neutralBlackIn * scaleFactor + 1f; + float outBlack = tonemapping.neutralBlackOut * scaleFactorHalf + 1f; + float inWhite = tonemapping.neutralWhiteIn / scaleFactor; + float outWhite = 1f - tonemapping.neutralWhiteOut / scaleFactor; + float blackRatio = inBlack / outBlack; + float whiteRatio = inWhite / outWhite; + + const float a = 0.2f; + float b = Mathf.Max(0f, Mathf.LerpUnclamped(0.57f, 0.37f, blackRatio)); + float c = Mathf.LerpUnclamped(0.01f, 0.24f, whiteRatio); + float d = Mathf.Max(0f, Mathf.LerpUnclamped(0.02f, 0.20f, blackRatio)); + const float e = 0.02f; + const float f = 0.30f; + + lutMaterial.SetVector(Uniforms._NeutralTonemapperParams1, new Vector4(a, b, c, d)); + lutMaterial.SetVector(Uniforms._NeutralTonemapperParams2, new Vector4(e, f, tonemapping.neutralWhiteLevel, tonemapping.neutralWhiteClip / scaleFactorHalf)); + break; + } + + case ColorGradingModel.Tonemapper.ACES: + { + lutMaterial.EnableKeyword("TONEMAPPING_FILMIC"); + break; + } + } + + // Color balance & basic grading settings + lutMaterial.SetFloat(Uniforms._HueShift, settings.basic.hueShift / 360f); + lutMaterial.SetFloat(Uniforms._Saturation, settings.basic.saturation); + lutMaterial.SetFloat(Uniforms._Contrast, settings.basic.contrast); + lutMaterial.SetVector(Uniforms._Balance, CalculateColorBalance(settings.basic.temperature, settings.basic.tint)); + + // Lift / Gamma / Gain + Vector3 lift, gamma, gain; + CalculateLiftGammaGain( + settings.colorWheels.linear.lift, + settings.colorWheels.linear.gamma, + settings.colorWheels.linear.gain, + out lift, out gamma, out gain + ); + + lutMaterial.SetVector(Uniforms._Lift, lift); + lutMaterial.SetVector(Uniforms._InvGamma, gamma); + lutMaterial.SetVector(Uniforms._Gain, gain); + + // Slope / Power / Offset + Vector3 slope, power, offset; + CalculateSlopePowerOffset( + settings.colorWheels.log.slope, + settings.colorWheels.log.power, + settings.colorWheels.log.offset, + out slope, out power, out offset + ); + + lutMaterial.SetVector(Uniforms._Slope, slope); + lutMaterial.SetVector(Uniforms._Power, power); + lutMaterial.SetVector(Uniforms._Offset, offset); + + // Channel mixer + lutMaterial.SetVector(Uniforms._ChannelMixerRed, settings.channelMixer.red); + lutMaterial.SetVector(Uniforms._ChannelMixerGreen, settings.channelMixer.green); + lutMaterial.SetVector(Uniforms._ChannelMixerBlue, settings.channelMixer.blue); + + // Selective grading & YRGB curves + lutMaterial.SetTexture(Uniforms._Curves, GetCurveTexture()); + + // Generate the lut + Graphics.Blit(null, model.bakedLut, lutMaterial, 0); + } + + public override void Prepare(Material uberMaterial) + { + if (model.isDirty || !IsLogLutValid(model.bakedLut)) + { + GenerateLut(); + model.isDirty = false; + } + + uberMaterial.EnableKeyword( + context.profile.debugViews.IsModeActive(DebugMode.PreGradingLog) + ? "COLOR_GRADING_LOG_VIEW" + : "COLOR_GRADING" + ); + + var bakedLut = model.bakedLut; + uberMaterial.SetTexture(Uniforms._LogLut, bakedLut); + uberMaterial.SetVector(Uniforms._LogLut_Params, new Vector3(1f / bakedLut.width, 1f / bakedLut.height, bakedLut.height - 1f)); + + float ev = Mathf.Exp(model.settings.basic.postExposure * 0.69314718055994530941723212145818f); + uberMaterial.SetFloat(Uniforms._ExposureEV, ev); + } + + public void OnGUI() + { + var bakedLut = model.bakedLut; + var rect = new Rect(context.viewport.x * Screen.width + 8f, 8f, bakedLut.width, bakedLut.height); + GUI.DrawTexture(rect, bakedLut); + } + + public override void OnDisable() + { + GraphicsUtils.Destroy(m_GradingCurves); + GraphicsUtils.Destroy(model.bakedLut); + m_GradingCurves = null; + model.bakedLut = null; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/ColorGradingComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/ColorGradingComponent.cs.meta new file mode 100644 index 0000000..61eab40 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/ColorGradingComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9baf73db7c9fc1b478f4a0a1000c86f5 +timeCreated: 1473086520 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/DepthOfFieldComponent.cs b/Assets/PostProcessing/Runtime/Components/DepthOfFieldComponent.cs new file mode 100644 index 0000000..c79a333 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/DepthOfFieldComponent.cs @@ -0,0 +1,165 @@ +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + using DebugMode = BuiltinDebugViewsModel.Mode; + + public sealed class DepthOfFieldComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _DepthOfFieldTex = Shader.PropertyToID("_DepthOfFieldTex"); + internal static readonly int _DepthOfFieldCoCTex = Shader.PropertyToID("_DepthOfFieldCoCTex"); + internal static readonly int _Distance = Shader.PropertyToID("_Distance"); + internal static readonly int _LensCoeff = Shader.PropertyToID("_LensCoeff"); + internal static readonly int _MaxCoC = Shader.PropertyToID("_MaxCoC"); + internal static readonly int _RcpMaxCoC = Shader.PropertyToID("_RcpMaxCoC"); + internal static readonly int _RcpAspect = Shader.PropertyToID("_RcpAspect"); + internal static readonly int _MainTex = Shader.PropertyToID("_MainTex"); + internal static readonly int _CoCTex = Shader.PropertyToID("_CoCTex"); + internal static readonly int _TaaParams = Shader.PropertyToID("_TaaParams"); + internal static readonly int _DepthOfFieldParams = Shader.PropertyToID("_DepthOfFieldParams"); + } + + const string k_ShaderString = "Hidden/Post FX/Depth Of Field"; + + public override bool active + { + get + { + return model.enabled + && !context.interrupted; + } + } + + public override DepthTextureMode GetCameraFlags() + { + return DepthTextureMode.Depth; + } + + RenderTexture m_CoCHistory; + + // Height of the 35mm full-frame format (36mm x 24mm) + const float k_FilmHeight = 0.024f; + + float CalculateFocalLength() + { + var settings = model.settings; + + if (!settings.useCameraFov) + return settings.focalLength / 1000f; + + float fov = context.camera.fieldOfView * Mathf.Deg2Rad; + return 0.5f * k_FilmHeight / Mathf.Tan(0.5f * fov); + } + + float CalculateMaxCoCRadius(int screenHeight) + { + // Estimate the allowable maximum radius of CoC from the kernel + // size (the equation below was empirically derived). + float radiusInPixels = (float)model.settings.kernelSize * 4f + 6f; + + // Applying a 5% limit to the CoC radius to keep the size of + // TileMax/NeighborMax small enough. + return Mathf.Min(0.05f, radiusInPixels / screenHeight); + } + + bool CheckHistory(int width, int height) + { + return m_CoCHistory != null && m_CoCHistory.IsCreated() && + m_CoCHistory.width == width && m_CoCHistory.height == height; + } + + RenderTextureFormat SelectFormat(RenderTextureFormat primary, RenderTextureFormat secondary) + { + if (SystemInfo.SupportsRenderTextureFormat(primary)) return primary; + if (SystemInfo.SupportsRenderTextureFormat(secondary)) return secondary; + return RenderTextureFormat.Default; + } + + public void Prepare(RenderTexture source, Material uberMaterial, bool antialiasCoC, Vector2 taaJitter, float taaBlending) + { + var settings = model.settings; + var colorFormat = RenderTextureFormat.DefaultHDR; + var cocFormat = SelectFormat(RenderTextureFormat.R8, RenderTextureFormat.RHalf); + + // Avoid using R8 on OSX with Metal. #896121, https://goo.gl/MgKqu6 + #if (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX) && !UNITY_2017_1_OR_NEWER + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Metal) + cocFormat = SelectFormat(RenderTextureFormat.RHalf, RenderTextureFormat.Default); + #endif + + // Material setup + var f = CalculateFocalLength(); + var s1 = Mathf.Max(settings.focusDistance, f); + var aspect = (float)source.width / source.height; + var coeff = f * f / (settings.aperture * (s1 - f) * k_FilmHeight * 2); + var maxCoC = CalculateMaxCoCRadius(source.height); + + var material = context.materialFactory.Get(k_ShaderString); + material.SetFloat(Uniforms._Distance, s1); + material.SetFloat(Uniforms._LensCoeff, coeff); + material.SetFloat(Uniforms._MaxCoC, maxCoC); + material.SetFloat(Uniforms._RcpMaxCoC, 1f / maxCoC); + material.SetFloat(Uniforms._RcpAspect, 1f / aspect); + + // CoC calculation pass + var rtCoC = context.renderTextureFactory.Get(context.width, context.height, 0, cocFormat, RenderTextureReadWrite.Linear); + Graphics.Blit(null, rtCoC, material, 0); + + if (antialiasCoC) + { + // CoC temporal filter pass + material.SetTexture(Uniforms._CoCTex, rtCoC); + + var blend = CheckHistory(context.width, context.height) ? taaBlending : 0f; + material.SetVector(Uniforms._TaaParams, new Vector3(taaJitter.x, taaJitter.y, blend)); + + var rtFiltered = RenderTexture.GetTemporary(context.width, context.height, 0, cocFormat); + Graphics.Blit(m_CoCHistory, rtFiltered, material, 1); + + context.renderTextureFactory.Release(rtCoC); + if (m_CoCHistory != null) RenderTexture.ReleaseTemporary(m_CoCHistory); + + m_CoCHistory = rtCoC = rtFiltered; + } + + // Downsampling and prefiltering pass + var rt1 = context.renderTextureFactory.Get(context.width / 2, context.height / 2, 0, colorFormat); + material.SetTexture(Uniforms._CoCTex, rtCoC); + Graphics.Blit(source, rt1, material, 2); + + // Bokeh simulation pass + var rt2 = context.renderTextureFactory.Get(context.width / 2, context.height / 2, 0, colorFormat); + Graphics.Blit(rt1, rt2, material, 3 + (int)settings.kernelSize); + + // Postfilter pass + Graphics.Blit(rt2, rt1, material, 7); + + // Give the results to the uber shader. + uberMaterial.SetVector(Uniforms._DepthOfFieldParams, new Vector3(s1, coeff, maxCoC)); + + if (context.profile.debugViews.IsModeActive(DebugMode.FocusPlane)) + { + uberMaterial.EnableKeyword("DEPTH_OF_FIELD_COC_VIEW"); + context.Interrupt(); + } + else + { + uberMaterial.SetTexture(Uniforms._DepthOfFieldTex, rt1); + uberMaterial.SetTexture(Uniforms._DepthOfFieldCoCTex, rtCoC); + uberMaterial.EnableKeyword("DEPTH_OF_FIELD"); + } + + context.renderTextureFactory.Release(rt2); + } + + public override void OnDisable() + { + if (m_CoCHistory != null) + RenderTexture.ReleaseTemporary(m_CoCHistory); + + m_CoCHistory = null; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/DepthOfFieldComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/DepthOfFieldComponent.cs.meta new file mode 100644 index 0000000..0af0d38 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/DepthOfFieldComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d862c8701bf34c342b95cf9058d0b70c +timeCreated: 1468410915 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/DitheringComponent.cs b/Assets/PostProcessing/Runtime/Components/DitheringComponent.cs new file mode 100644 index 0000000..a0b594b --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/DitheringComponent.cs @@ -0,0 +1,71 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class DitheringComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _DitheringTex = Shader.PropertyToID("_DitheringTex"); + internal static readonly int _DitheringCoords = Shader.PropertyToID("_DitheringCoords"); + } + + public override bool active + { + get + { + return model.enabled + && !context.interrupted; + } + } + + // Holds 64 64x64 Alpha8 textures (256kb total) + Texture2D[] noiseTextures; + int textureIndex = 0; + + const int k_TextureCount = 64; + + public override void OnDisable() + { + noiseTextures = null; + } + + void LoadNoiseTextures() + { + noiseTextures = new Texture2D[k_TextureCount]; + + for (int i = 0; i < k_TextureCount; i++) + noiseTextures[i] = Resources.Load("Bluenoise64/LDR_LLL1_" + i); + } + + public override void Prepare(Material uberMaterial) + { + float rndOffsetX; + float rndOffsetY; + +#if POSTFX_DEBUG_STATIC_DITHERING + textureIndex = 0; + rndOffsetX = 0f; + rndOffsetY = 0f; +#else + if (++textureIndex >= k_TextureCount) + textureIndex = 0; + + rndOffsetX = Random.value; + rndOffsetY = Random.value; +#endif + + if (noiseTextures == null) + LoadNoiseTextures(); + + var noiseTex = noiseTextures[textureIndex]; + + uberMaterial.EnableKeyword("DITHERING"); + uberMaterial.SetTexture(Uniforms._DitheringTex, noiseTex); + uberMaterial.SetVector(Uniforms._DitheringCoords, new Vector4( + (float)context.width / (float)noiseTex.width, + (float)context.height / (float)noiseTex.height, + rndOffsetX, + rndOffsetY + )); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/DitheringComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/DitheringComponent.cs.meta new file mode 100644 index 0000000..5535c41 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/DitheringComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 35ceb4b3cfab56d43a3f0efeb9d68c43 +timeCreated: 1485179235 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/EyeAdaptationComponent.cs b/Assets/PostProcessing/Runtime/Components/EyeAdaptationComponent.cs new file mode 100644 index 0000000..c5e3197 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/EyeAdaptationComponent.cs @@ -0,0 +1,192 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class EyeAdaptationComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _Params = Shader.PropertyToID("_Params"); + internal static readonly int _Speed = Shader.PropertyToID("_Speed"); + internal static readonly int _ExposureCompensation = Shader.PropertyToID("_ExposureCompensation"); + internal static readonly int _AutoExposure = Shader.PropertyToID("_AutoExposure"); + internal static readonly int _DebugWidth = Shader.PropertyToID("_DebugWidth"); + + //The overloads for the PropertyID werent completely added until 5.5.1, so use int where possible but fallback to strings if required. +#if UNITY_5_6_OR_NEWER + internal static readonly int _Histogram = Shader.PropertyToID("_Histogram"); + internal static readonly int _Source = Shader.PropertyToID("_Source"); + internal static readonly int _ScaleOffsetRes = Shader.PropertyToID("_ScaleOffsetRes"); +#else + internal static readonly string _Histogram = "_Histogram"; + internal static readonly string _Source = "_Source"; + internal static readonly string _ScaleOffsetRes = "_ScaleOffsetRes"; +#endif + } + + ComputeShader m_EyeCompute; + ComputeBuffer m_HistogramBuffer; + + readonly RenderTexture[] m_AutoExposurePool = new RenderTexture[2]; + int m_AutoExposurePingPing; + RenderTexture m_CurrentAutoExposure; + + RenderTexture m_DebugHistogram; + + int m_FrameCount = 0; + + // Don't forget to update 'EyeAdaptation.cginc' if you change these values ! + const int k_HistogramBins = 64; + const int k_HistogramThreadX = 16; + const int k_HistogramThreadY = 16; + + public override bool active + { + get + { + return model.enabled + && SystemInfo.supportsComputeShaders + && !context.interrupted; + } + } + + public void ResetHistory() + { + m_FrameCount = 0; + } + + public override void OnEnable() + { + m_FrameCount = 0; + } + + public override void OnDisable() + { + foreach (var rt in m_AutoExposurePool) + GraphicsUtils.Destroy(rt); + + if (m_HistogramBuffer != null) + m_HistogramBuffer.Release(); + + m_HistogramBuffer = null; + + if (m_DebugHistogram != null) + m_DebugHistogram.Release(); + + m_DebugHistogram = null; + } + + Vector4 GetHistogramScaleOffsetRes() + { + var settings = model.settings; + float diff = settings.logMax - settings.logMin; + float scale = 1f / diff; + float offset = -settings.logMin * scale; + return new Vector4(scale, offset, Mathf.Floor(context.width / 2f), Mathf.Floor(context.height / 2f)); + } + + public Texture Prepare(RenderTexture source, Material uberMaterial) + { + var settings = model.settings; + + // Setup compute + if (m_EyeCompute == null) + m_EyeCompute = Resources.Load("Shaders/EyeHistogram"); + + var material = context.materialFactory.Get("Hidden/Post FX/Eye Adaptation"); + material.shaderKeywords = null; + + if (m_HistogramBuffer == null) + m_HistogramBuffer = new ComputeBuffer(k_HistogramBins, sizeof(uint)); + + // Downscale the framebuffer, we don't need an absolute precision for auto exposure and it + // helps making it more stable + var scaleOffsetRes = GetHistogramScaleOffsetRes(); + + var rt = context.renderTextureFactory.Get((int)scaleOffsetRes.z, (int)scaleOffsetRes.w, 0, source.format); + Graphics.Blit(source, rt); + + if (m_AutoExposurePool[0] == null || !m_AutoExposurePool[0].IsCreated()) + m_AutoExposurePool[0] = new RenderTexture(1, 1, 0, RenderTextureFormat.RFloat); + + if (m_AutoExposurePool[1] == null || !m_AutoExposurePool[1].IsCreated()) + m_AutoExposurePool[1] = new RenderTexture(1, 1, 0, RenderTextureFormat.RFloat); + + // Clear the buffer on every frame as we use it to accumulate luminance values on each frame + int kernel = m_EyeCompute.FindKernel("KEyeHistogramClear"); + m_EyeCompute.SetBuffer(kernel, Uniforms._Histogram, m_HistogramBuffer); + m_EyeCompute.Dispatch(kernel, Mathf.CeilToInt(k_HistogramBins / (float)k_HistogramThreadX), 1, 1); + + // Gets a log histogram + kernel = m_EyeCompute.FindKernel("KEyeHistogram"); + m_EyeCompute.SetBuffer(kernel, Uniforms._Histogram, m_HistogramBuffer); + m_EyeCompute.SetTexture(kernel, Uniforms._Source, rt); + m_EyeCompute.SetVector(Uniforms._ScaleOffsetRes, scaleOffsetRes); + m_EyeCompute.Dispatch(kernel, Mathf.CeilToInt(rt.width / (float)k_HistogramThreadX), Mathf.CeilToInt(rt.height / (float)k_HistogramThreadY), 1); + + // Cleanup + context.renderTextureFactory.Release(rt); + + // Make sure filtering values are correct to avoid apocalyptic consequences + const float minDelta = 1e-2f; + settings.highPercent = Mathf.Clamp(settings.highPercent, 1f + minDelta, 99f); + settings.lowPercent = Mathf.Clamp(settings.lowPercent, 1f, settings.highPercent - minDelta); + + // Compute auto exposure + material.SetBuffer(Uniforms._Histogram, m_HistogramBuffer); + material.SetVector(Uniforms._Params, new Vector4(settings.lowPercent * 0.01f, settings.highPercent * 0.01f, Mathf.Exp(settings.minLuminance * 0.69314718055994530941723212145818f), Mathf.Exp(settings.maxLuminance * 0.69314718055994530941723212145818f))); + material.SetVector(Uniforms._Speed, new Vector2(settings.speedDown, settings.speedUp)); + material.SetVector(Uniforms._ScaleOffsetRes, scaleOffsetRes); + material.SetFloat(Uniforms._ExposureCompensation, settings.keyValue); + + if (settings.dynamicKeyValue) + material.EnableKeyword("AUTO_KEY_VALUE"); + + if (m_FrameCount < 2 || !Application.isPlaying) + { + // We don't want eye adaptation when not in play mode because the GameView isn't + // animated, thus making it harder to tweak. Just use the final audo exposure value. + m_CurrentAutoExposure = m_AutoExposurePool[0]; + Graphics.Blit(null, m_CurrentAutoExposure, material, (int)EyeAdaptationModel.EyeAdaptationType.Fixed); + + // Copy current exposure to the other pingpong target to avoid adapting from black + Graphics.Blit(m_AutoExposurePool[0], m_AutoExposurePool[1]); + } + else + { + int pp = m_AutoExposurePingPing; + var src = m_AutoExposurePool[++pp % 2]; + var dst = m_AutoExposurePool[++pp % 2]; + Graphics.Blit(src, dst, material, (int)settings.adaptationType); + m_AutoExposurePingPing = ++pp % 2; + m_CurrentAutoExposure = dst; + } + + // Generate debug histogram + if (context.profile.debugViews.IsModeActive(BuiltinDebugViewsModel.Mode.EyeAdaptation)) + { + if (m_DebugHistogram == null || !m_DebugHistogram.IsCreated()) + { + m_DebugHistogram = new RenderTexture(256, 128, 0, RenderTextureFormat.ARGB32) + { + filterMode = FilterMode.Point, + wrapMode = TextureWrapMode.Clamp + }; + } + + material.SetFloat(Uniforms._DebugWidth, m_DebugHistogram.width); + Graphics.Blit(null, m_DebugHistogram, material, 2); + } + + m_FrameCount++; + return m_CurrentAutoExposure; + } + + public void OnGUI() + { + if (m_DebugHistogram == null || !m_DebugHistogram.IsCreated()) + return; + + var rect = new Rect(context.viewport.x * Screen.width + 8f, 8f, m_DebugHistogram.width, m_DebugHistogram.height); + GUI.DrawTexture(rect, m_DebugHistogram); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/EyeAdaptationComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/EyeAdaptationComponent.cs.meta new file mode 100644 index 0000000..994b6da --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/EyeAdaptationComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c227d71a4040d304c943c26e0914bdeb +timeCreated: 1473088756 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/FogComponent.cs b/Assets/PostProcessing/Runtime/Components/FogComponent.cs new file mode 100644 index 0000000..f04691e --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/FogComponent.cs @@ -0,0 +1,79 @@ +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + public sealed class FogComponent : PostProcessingComponentCommandBuffer + { + static class Uniforms + { + internal static readonly int _FogColor = Shader.PropertyToID("_FogColor"); + internal static readonly int _Density = Shader.PropertyToID("_Density"); + internal static readonly int _Start = Shader.PropertyToID("_Start"); + internal static readonly int _End = Shader.PropertyToID("_End"); + internal static readonly int _TempRT = Shader.PropertyToID("_TempRT"); + } + + const string k_ShaderString = "Hidden/Post FX/Fog"; + + public override bool active + { + get + { + return model.enabled + && context.isGBufferAvailable // In forward fog is already done at shader level + && RenderSettings.fog + && !context.interrupted; + } + } + + public override string GetName() + { + return "Fog"; + } + + public override DepthTextureMode GetCameraFlags() + { + return DepthTextureMode.Depth; + } + + public override CameraEvent GetCameraEvent() + { + return CameraEvent.AfterImageEffectsOpaque; + } + + public override void PopulateCommandBuffer(CommandBuffer cb) + { + var settings = model.settings; + + var material = context.materialFactory.Get(k_ShaderString); + material.shaderKeywords = null; + var fogColor = GraphicsUtils.isLinearColorSpace ? RenderSettings.fogColor.linear : RenderSettings.fogColor; + material.SetColor(Uniforms._FogColor, fogColor); + material.SetFloat(Uniforms._Density, RenderSettings.fogDensity); + material.SetFloat(Uniforms._Start, RenderSettings.fogStartDistance); + material.SetFloat(Uniforms._End, RenderSettings.fogEndDistance); + + switch (RenderSettings.fogMode) + { + case FogMode.Linear: + material.EnableKeyword("FOG_LINEAR"); + break; + case FogMode.Exponential: + material.EnableKeyword("FOG_EXP"); + break; + case FogMode.ExponentialSquared: + material.EnableKeyword("FOG_EXP2"); + break; + } + + var fbFormat = context.isHdr + ? RenderTextureFormat.DefaultHDR + : RenderTextureFormat.Default; + + cb.GetTemporaryRT(Uniforms._TempRT, context.width, context.height, 24, FilterMode.Bilinear, fbFormat); + cb.Blit(BuiltinRenderTextureType.CameraTarget, Uniforms._TempRT); + cb.Blit(Uniforms._TempRT, BuiltinRenderTextureType.CameraTarget, material, settings.excludeSkybox ? 1 : 0); + cb.ReleaseTemporaryRT(Uniforms._TempRT); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/FogComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/FogComponent.cs.meta new file mode 100644 index 0000000..20fccf5 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/FogComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d0363c1cc7de62b4989190994103f5e2 +timeCreated: 1487334918 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/FxaaComponent.cs b/Assets/PostProcessing/Runtime/Components/FxaaComponent.cs new file mode 100644 index 0000000..d3b03dd --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/FxaaComponent.cs @@ -0,0 +1,48 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class FxaaComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _QualitySettings = Shader.PropertyToID("_QualitySettings"); + internal static readonly int _ConsoleSettings = Shader.PropertyToID("_ConsoleSettings"); + } + + public override bool active + { + get + { + return model.enabled + && model.settings.method == AntialiasingModel.Method.Fxaa + && !context.interrupted; + } + } + + public void Render(RenderTexture source, RenderTexture destination) + { + var settings = model.settings.fxaaSettings; + var material = context.materialFactory.Get("Hidden/Post FX/FXAA"); + var qualitySettings = AntialiasingModel.FxaaQualitySettings.presets[(int)settings.preset]; + var consoleSettings = AntialiasingModel.FxaaConsoleSettings.presets[(int)settings.preset]; + + material.SetVector(Uniforms._QualitySettings, + new Vector3( + qualitySettings.subpixelAliasingRemovalAmount, + qualitySettings.edgeDetectionThreshold, + qualitySettings.minimumRequiredLuminance + ) + ); + + material.SetVector(Uniforms._ConsoleSettings, + new Vector4( + consoleSettings.subpixelSpreadAmount, + consoleSettings.edgeSharpnessAmount, + consoleSettings.edgeDetectionThreshold, + consoleSettings.minimumRequiredLuminance + ) + ); + + Graphics.Blit(source, destination, material, 0); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/FxaaComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/FxaaComponent.cs.meta new file mode 100644 index 0000000..c7669fa --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/FxaaComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d4e1109c5030ca04e9a28243a35155ff +timeCreated: 1473088423 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/GrainComponent.cs b/Assets/PostProcessing/Runtime/Components/GrainComponent.cs new file mode 100644 index 0000000..10c2a47 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/GrainComponent.cs @@ -0,0 +1,79 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class GrainComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _Grain_Params1 = Shader.PropertyToID("_Grain_Params1"); + internal static readonly int _Grain_Params2 = Shader.PropertyToID("_Grain_Params2"); + internal static readonly int _GrainTex = Shader.PropertyToID("_GrainTex"); + internal static readonly int _Phase = Shader.PropertyToID("_Phase"); + } + + public override bool active + { + get + { + return model.enabled + && model.settings.intensity > 0f + && SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf) + && !context.interrupted; + } + } + + RenderTexture m_GrainLookupRT; + + public override void OnDisable() + { + GraphicsUtils.Destroy(m_GrainLookupRT); + m_GrainLookupRT = null; + } + + public override void Prepare(Material uberMaterial) + { + var settings = model.settings; + + uberMaterial.EnableKeyword("GRAIN"); + + float rndOffsetX; + float rndOffsetY; + +#if POSTFX_DEBUG_STATIC_GRAIN + // Chosen by a fair dice roll + float time = 4f; + rndOffsetX = 0f; + rndOffsetY = 0f; +#else + float time = Time.realtimeSinceStartup; + rndOffsetX = Random.value; + rndOffsetY = Random.value; +#endif + + // Generate the grain lut for the current frame first + if (m_GrainLookupRT == null || !m_GrainLookupRT.IsCreated()) + { + GraphicsUtils.Destroy(m_GrainLookupRT); + + m_GrainLookupRT = new RenderTexture(192, 192, 0, RenderTextureFormat.ARGBHalf) + { + filterMode = FilterMode.Bilinear, + wrapMode = TextureWrapMode.Repeat, + anisoLevel = 0, + name = "Grain Lookup Texture" + }; + + m_GrainLookupRT.Create(); + } + + var grainMaterial = context.materialFactory.Get("Hidden/Post FX/Grain Generator"); + grainMaterial.SetFloat(Uniforms._Phase, time / 20f); + + Graphics.Blit((Texture)null, m_GrainLookupRT, grainMaterial, settings.colored ? 1 : 0); + + // Send everything to the uber shader + uberMaterial.SetTexture(Uniforms._GrainTex, m_GrainLookupRT); + uberMaterial.SetVector(Uniforms._Grain_Params1, new Vector2(settings.luminanceContribution, settings.intensity * 20f)); + uberMaterial.SetVector(Uniforms._Grain_Params2, new Vector4((float)context.width / (float)m_GrainLookupRT.width / settings.size, (float)context.height / (float)m_GrainLookupRT.height / settings.size, rndOffsetX, rndOffsetY)); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/GrainComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/GrainComponent.cs.meta new file mode 100644 index 0000000..98e4e28 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/GrainComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6ff793ec42153c34799eed059982bac3 +timeCreated: 1473084716 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/MotionBlurComponent.cs b/Assets/PostProcessing/Runtime/Components/MotionBlurComponent.cs new file mode 100644 index 0000000..a747f7b --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/MotionBlurComponent.cs @@ -0,0 +1,444 @@ +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + using Settings = MotionBlurModel.Settings; + + public sealed class MotionBlurComponent : PostProcessingComponentCommandBuffer + { + static class Uniforms + { + internal static readonly int _VelocityScale = Shader.PropertyToID("_VelocityScale"); + internal static readonly int _MaxBlurRadius = Shader.PropertyToID("_MaxBlurRadius"); + internal static readonly int _RcpMaxBlurRadius = Shader.PropertyToID("_RcpMaxBlurRadius"); + internal static readonly int _VelocityTex = Shader.PropertyToID("_VelocityTex"); + internal static readonly int _MainTex = Shader.PropertyToID("_MainTex"); + internal static readonly int _Tile2RT = Shader.PropertyToID("_Tile2RT"); + internal static readonly int _Tile4RT = Shader.PropertyToID("_Tile4RT"); + internal static readonly int _Tile8RT = Shader.PropertyToID("_Tile8RT"); + internal static readonly int _TileMaxOffs = Shader.PropertyToID("_TileMaxOffs"); + internal static readonly int _TileMaxLoop = Shader.PropertyToID("_TileMaxLoop"); + internal static readonly int _TileVRT = Shader.PropertyToID("_TileVRT"); + internal static readonly int _NeighborMaxTex = Shader.PropertyToID("_NeighborMaxTex"); + internal static readonly int _LoopCount = Shader.PropertyToID("_LoopCount"); + internal static readonly int _TempRT = Shader.PropertyToID("_TempRT"); + + internal static readonly int _History1LumaTex = Shader.PropertyToID("_History1LumaTex"); + internal static readonly int _History2LumaTex = Shader.PropertyToID("_History2LumaTex"); + internal static readonly int _History3LumaTex = Shader.PropertyToID("_History3LumaTex"); + internal static readonly int _History4LumaTex = Shader.PropertyToID("_History4LumaTex"); + + internal static readonly int _History1ChromaTex = Shader.PropertyToID("_History1ChromaTex"); + internal static readonly int _History2ChromaTex = Shader.PropertyToID("_History2ChromaTex"); + internal static readonly int _History3ChromaTex = Shader.PropertyToID("_History3ChromaTex"); + internal static readonly int _History4ChromaTex = Shader.PropertyToID("_History4ChromaTex"); + + internal static readonly int _History1Weight = Shader.PropertyToID("_History1Weight"); + internal static readonly int _History2Weight = Shader.PropertyToID("_History2Weight"); + internal static readonly int _History3Weight = Shader.PropertyToID("_History3Weight"); + internal static readonly int _History4Weight = Shader.PropertyToID("_History4Weight"); + } + + enum Pass + { + VelocitySetup, + TileMax1, + TileMax2, + TileMaxV, + NeighborMax, + Reconstruction, + FrameCompression, + FrameBlendingChroma, + FrameBlendingRaw + } + + public class ReconstructionFilter + { + // Texture format for storing 2D vectors. + RenderTextureFormat m_VectorRTFormat = RenderTextureFormat.RGHalf; + + // Texture format for storing packed velocity/depth. + RenderTextureFormat m_PackedRTFormat = RenderTextureFormat.ARGB2101010; + + public ReconstructionFilter() + { + CheckTextureFormatSupport(); + } + + void CheckTextureFormatSupport() + { + // If 2:10:10:10 isn't supported, use ARGB32 instead. + if (!SystemInfo.SupportsRenderTextureFormat(m_PackedRTFormat)) + m_PackedRTFormat = RenderTextureFormat.ARGB32; + } + + public bool IsSupported() + { + return SystemInfo.supportsMotionVectors; + } + + public void ProcessImage(PostProcessingContext context, CommandBuffer cb, ref Settings settings, RenderTargetIdentifier source, RenderTargetIdentifier destination, Material material) + { + const float kMaxBlurRadius = 5f; + + // Calculate the maximum blur radius in pixels. + int maxBlurPixels = (int)(kMaxBlurRadius * context.height / 100); + + // Calculate the TileMax size. + // It should be a multiple of 8 and larger than maxBlur. + int tileSize = ((maxBlurPixels - 1) / 8 + 1) * 8; + + // Pass 1 - Velocity/depth packing + var velocityScale = settings.shutterAngle / 360f; + cb.SetGlobalFloat(Uniforms._VelocityScale, velocityScale); + cb.SetGlobalFloat(Uniforms._MaxBlurRadius, maxBlurPixels); + cb.SetGlobalFloat(Uniforms._RcpMaxBlurRadius, 1f / maxBlurPixels); + + int vbuffer = Uniforms._VelocityTex; + cb.GetTemporaryRT(vbuffer, context.width, context.height, 0, FilterMode.Point, m_PackedRTFormat, RenderTextureReadWrite.Linear); + cb.Blit((Texture)null, vbuffer, material, (int)Pass.VelocitySetup); + + // Pass 2 - First TileMax filter (1/2 downsize) + int tile2 = Uniforms._Tile2RT; + cb.GetTemporaryRT(tile2, context.width / 2, context.height / 2, 0, FilterMode.Point, m_VectorRTFormat, RenderTextureReadWrite.Linear); + cb.SetGlobalTexture(Uniforms._MainTex, vbuffer); + cb.Blit(vbuffer, tile2, material, (int)Pass.TileMax1); + + // Pass 3 - Second TileMax filter (1/2 downsize) + int tile4 = Uniforms._Tile4RT; + cb.GetTemporaryRT(tile4, context.width / 4, context.height / 4, 0, FilterMode.Point, m_VectorRTFormat, RenderTextureReadWrite.Linear); + cb.SetGlobalTexture(Uniforms._MainTex, tile2); + cb.Blit(tile2, tile4, material, (int)Pass.TileMax2); + cb.ReleaseTemporaryRT(tile2); + + // Pass 4 - Third TileMax filter (1/2 downsize) + int tile8 = Uniforms._Tile8RT; + cb.GetTemporaryRT(tile8, context.width / 8, context.height / 8, 0, FilterMode.Point, m_VectorRTFormat, RenderTextureReadWrite.Linear); + cb.SetGlobalTexture(Uniforms._MainTex, tile4); + cb.Blit(tile4, tile8, material, (int)Pass.TileMax2); + cb.ReleaseTemporaryRT(tile4); + + // Pass 5 - Fourth TileMax filter (reduce to tileSize) + var tileMaxOffs = Vector2.one * (tileSize / 8f - 1f) * -0.5f; + cb.SetGlobalVector(Uniforms._TileMaxOffs, tileMaxOffs); + cb.SetGlobalFloat(Uniforms._TileMaxLoop, (int)(tileSize / 8f)); + + int tile = Uniforms._TileVRT; + cb.GetTemporaryRT(tile, context.width / tileSize, context.height / tileSize, 0, FilterMode.Point, m_VectorRTFormat, RenderTextureReadWrite.Linear); + cb.SetGlobalTexture(Uniforms._MainTex, tile8); + cb.Blit(tile8, tile, material, (int)Pass.TileMaxV); + cb.ReleaseTemporaryRT(tile8); + + // Pass 6 - NeighborMax filter + int neighborMax = Uniforms._NeighborMaxTex; + int neighborMaxWidth = context.width / tileSize; + int neighborMaxHeight = context.height / tileSize; + cb.GetTemporaryRT(neighborMax, neighborMaxWidth, neighborMaxHeight, 0, FilterMode.Point, m_VectorRTFormat, RenderTextureReadWrite.Linear); + cb.SetGlobalTexture(Uniforms._MainTex, tile); + cb.Blit(tile, neighborMax, material, (int)Pass.NeighborMax); + cb.ReleaseTemporaryRT(tile); + + // Pass 7 - Reconstruction pass + cb.SetGlobalFloat(Uniforms._LoopCount, Mathf.Clamp(settings.sampleCount / 2, 1, 64)); + cb.SetGlobalTexture(Uniforms._MainTex, source); + + cb.Blit(source, destination, material, (int)Pass.Reconstruction); + + cb.ReleaseTemporaryRT(vbuffer); + cb.ReleaseTemporaryRT(neighborMax); + } + } + + public class FrameBlendingFilter + { + struct Frame + { + public RenderTexture lumaTexture; + public RenderTexture chromaTexture; + + float m_Time; + RenderTargetIdentifier[] m_MRT; + + public float CalculateWeight(float strength, float currentTime) + { + if (Mathf.Approximately(m_Time, 0f)) + return 0f; + + var coeff = Mathf.Lerp(80f, 16f, strength); + return Mathf.Exp((m_Time - currentTime) * coeff); + } + + public void Release() + { + if (lumaTexture != null) + RenderTexture.ReleaseTemporary(lumaTexture); + + if (chromaTexture != null) + RenderTexture.ReleaseTemporary(chromaTexture); + + lumaTexture = null; + chromaTexture = null; + } + + public void MakeRecord(CommandBuffer cb, RenderTargetIdentifier source, int width, int height, Material material) + { + Release(); + + lumaTexture = RenderTexture.GetTemporary(width, height, 0, RenderTextureFormat.R8, RenderTextureReadWrite.Linear); + chromaTexture = RenderTexture.GetTemporary(width, height, 0, RenderTextureFormat.R8, RenderTextureReadWrite.Linear); + + lumaTexture.filterMode = FilterMode.Point; + chromaTexture.filterMode = FilterMode.Point; + + if (m_MRT == null) + m_MRT = new RenderTargetIdentifier[2]; + + m_MRT[0] = lumaTexture; + m_MRT[1] = chromaTexture; + + cb.SetGlobalTexture(Uniforms._MainTex, source); + cb.SetRenderTarget(m_MRT, lumaTexture); + cb.DrawMesh(GraphicsUtils.quad, Matrix4x4.identity, material, 0, (int)Pass.FrameCompression); + + m_Time = Time.time; + } + + public void MakeRecordRaw(CommandBuffer cb, RenderTargetIdentifier source, int width, int height, RenderTextureFormat format) + { + Release(); + + lumaTexture = RenderTexture.GetTemporary(width, height, 0, format); + lumaTexture.filterMode = FilterMode.Point; + + cb.SetGlobalTexture(Uniforms._MainTex, source); + cb.Blit(source, lumaTexture); + + m_Time = Time.time; + } + } + + bool m_UseCompression; + RenderTextureFormat m_RawTextureFormat; + + Frame[] m_FrameList; + int m_LastFrameCount; + + public FrameBlendingFilter() + { + m_UseCompression = CheckSupportCompression(); + m_RawTextureFormat = GetPreferredRenderTextureFormat(); + m_FrameList = new Frame[4]; + } + + public void Dispose() + { + foreach (var frame in m_FrameList) + frame.Release(); + } + + public void PushFrame(CommandBuffer cb, RenderTargetIdentifier source, int width, int height, Material material) + { + // Push only when actual update (do nothing while pausing) + var frameCount = Time.frameCount; + if (frameCount == m_LastFrameCount) return; + + // Update the frame record. + var index = frameCount % m_FrameList.Length; + + if (m_UseCompression) + m_FrameList[index].MakeRecord(cb, source, width, height, material); + else + m_FrameList[index].MakeRecordRaw(cb, source, width, height, m_RawTextureFormat); + + m_LastFrameCount = frameCount; + } + + public void BlendFrames(CommandBuffer cb, float strength, RenderTargetIdentifier source, RenderTargetIdentifier destination, Material material) + { + var t = Time.time; + + var f1 = GetFrameRelative(-1); + var f2 = GetFrameRelative(-2); + var f3 = GetFrameRelative(-3); + var f4 = GetFrameRelative(-4); + + cb.SetGlobalTexture(Uniforms._History1LumaTex, f1.lumaTexture); + cb.SetGlobalTexture(Uniforms._History2LumaTex, f2.lumaTexture); + cb.SetGlobalTexture(Uniforms._History3LumaTex, f3.lumaTexture); + cb.SetGlobalTexture(Uniforms._History4LumaTex, f4.lumaTexture); + + cb.SetGlobalTexture(Uniforms._History1ChromaTex, f1.chromaTexture); + cb.SetGlobalTexture(Uniforms._History2ChromaTex, f2.chromaTexture); + cb.SetGlobalTexture(Uniforms._History3ChromaTex, f3.chromaTexture); + cb.SetGlobalTexture(Uniforms._History4ChromaTex, f4.chromaTexture); + + cb.SetGlobalFloat(Uniforms._History1Weight, f1.CalculateWeight(strength, t)); + cb.SetGlobalFloat(Uniforms._History2Weight, f2.CalculateWeight(strength, t)); + cb.SetGlobalFloat(Uniforms._History3Weight, f3.CalculateWeight(strength, t)); + cb.SetGlobalFloat(Uniforms._History4Weight, f4.CalculateWeight(strength, t)); + + cb.SetGlobalTexture(Uniforms._MainTex, source); + cb.Blit(source, destination, material, m_UseCompression ? (int)Pass.FrameBlendingChroma : (int)Pass.FrameBlendingRaw); + } + + // Check if the platform has the capability of compression. + static bool CheckSupportCompression() + { + return + SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.R8) && + SystemInfo.supportedRenderTargetCount > 1; + } + + // Determine which 16-bit render texture format is available. + static RenderTextureFormat GetPreferredRenderTextureFormat() + { + RenderTextureFormat[] formats = + { + RenderTextureFormat.RGB565, + RenderTextureFormat.ARGB1555, + RenderTextureFormat.ARGB4444 + }; + + foreach (var f in formats) + if (SystemInfo.SupportsRenderTextureFormat(f)) return f; + + return RenderTextureFormat.Default; + } + + // Retrieve a frame record with relative indexing. + // Use a negative index to refer to previous frames. + Frame GetFrameRelative(int offset) + { + var index = (Time.frameCount + m_FrameList.Length + offset) % m_FrameList.Length; + return m_FrameList[index]; + } + } + + ReconstructionFilter m_ReconstructionFilter; + public ReconstructionFilter reconstructionFilter + { + get + { + if (m_ReconstructionFilter == null) + m_ReconstructionFilter = new ReconstructionFilter(); + + return m_ReconstructionFilter; + } + } + + FrameBlendingFilter m_FrameBlendingFilter; + public FrameBlendingFilter frameBlendingFilter + { + get + { + if (m_FrameBlendingFilter == null) + m_FrameBlendingFilter = new FrameBlendingFilter(); + + return m_FrameBlendingFilter; + } + } + + int m_FrameCount = 0; + + public override bool active + { + get + { + var settings = model.settings; + return model.enabled + && ((settings.shutterAngle > 0f && reconstructionFilter.IsSupported()) || settings.frameBlending > 0f) + && SystemInfo.graphicsDeviceType != GraphicsDeviceType.OpenGLES2 // No movecs on GLES2 platforms + && !context.interrupted; + } + } + + public override string GetName() + { + return "Motion Blur"; + } + + public void ResetHistory() + { + if (m_FrameBlendingFilter != null) + m_FrameBlendingFilter.Dispose(); + + m_FrameBlendingFilter = null; + m_FrameCount = 0; + } + + public override DepthTextureMode GetCameraFlags() + { + return DepthTextureMode.Depth | DepthTextureMode.MotionVectors; + } + + public override CameraEvent GetCameraEvent() + { + return CameraEvent.BeforeImageEffects; + } + + public override void OnEnable() + { + m_FrameCount = 0; + } + + public override void PopulateCommandBuffer(CommandBuffer cb) + { +#if UNITY_EDITOR + // Don't render motion blur preview when the editor is not playing as it can in some + // cases results in ugly artifacts (i.e. when resizing the game view). + if (!Application.isPlaying) + return; +#endif + + // Skip rendering in the first 2 frames - workaround for a weird repaint issue in editor + if (m_FrameCount < 2) + { + m_FrameCount++; + return; + } + + var material = context.materialFactory.Get("Hidden/Post FX/Motion Blur"); + var blitMaterial = context.materialFactory.Get("Hidden/Post FX/Blit"); + var settings = model.settings; + + var fbFormat = context.isHdr + ? RenderTextureFormat.DefaultHDR + : RenderTextureFormat.Default; + + int tempRT = Uniforms._TempRT; + cb.GetTemporaryRT(tempRT, context.width, context.height, 0, FilterMode.Point, fbFormat); + + if (settings.shutterAngle > 0f && settings.frameBlending > 0f) + { + // Motion blur + frame blending + reconstructionFilter.ProcessImage(context, cb, ref settings, BuiltinRenderTextureType.CameraTarget, tempRT, material); + frameBlendingFilter.BlendFrames(cb, settings.frameBlending, tempRT, BuiltinRenderTextureType.CameraTarget, material); + frameBlendingFilter.PushFrame(cb, tempRT, context.width, context.height, material); + } + else if (settings.shutterAngle > 0f) + { + // No frame blending + cb.SetGlobalTexture(Uniforms._MainTex, BuiltinRenderTextureType.CameraTarget); + cb.Blit(BuiltinRenderTextureType.CameraTarget, tempRT, blitMaterial, 0); + reconstructionFilter.ProcessImage(context, cb, ref settings, tempRT, BuiltinRenderTextureType.CameraTarget, material); + } + else if (settings.frameBlending > 0f) + { + // Frame blending only + cb.SetGlobalTexture(Uniforms._MainTex, BuiltinRenderTextureType.CameraTarget); + cb.Blit(BuiltinRenderTextureType.CameraTarget, tempRT, blitMaterial, 0); + frameBlendingFilter.BlendFrames(cb, settings.frameBlending, tempRT, BuiltinRenderTextureType.CameraTarget, material); + frameBlendingFilter.PushFrame(cb, tempRT, context.width, context.height, material); + } + + // Cleaning up + cb.ReleaseTemporaryRT(tempRT); + } + + public override void OnDisable() + { + if (m_FrameBlendingFilter != null) + m_FrameBlendingFilter.Dispose(); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/MotionBlurComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/MotionBlurComponent.cs.meta new file mode 100644 index 0000000..91f17ce --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/MotionBlurComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9a9ae59cbb7c53e40851df7f32805098 +timeCreated: 1468325905 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/ScreenSpaceReflectionComponent.cs b/Assets/PostProcessing/Runtime/Components/ScreenSpaceReflectionComponent.cs new file mode 100644 index 0000000..7411f85 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/ScreenSpaceReflectionComponent.cs @@ -0,0 +1,239 @@ +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + using SSRResolution = ScreenSpaceReflectionModel.SSRResolution; + using SSRReflectionBlendType = ScreenSpaceReflectionModel.SSRReflectionBlendType; + + public sealed class ScreenSpaceReflectionComponent : PostProcessingComponentCommandBuffer + { + static class Uniforms + { + internal static readonly int _RayStepSize = Shader.PropertyToID("_RayStepSize"); + internal static readonly int _AdditiveReflection = Shader.PropertyToID("_AdditiveReflection"); + internal static readonly int _BilateralUpsampling = Shader.PropertyToID("_BilateralUpsampling"); + internal static readonly int _TreatBackfaceHitAsMiss = Shader.PropertyToID("_TreatBackfaceHitAsMiss"); + internal static readonly int _AllowBackwardsRays = Shader.PropertyToID("_AllowBackwardsRays"); + internal static readonly int _TraceBehindObjects = Shader.PropertyToID("_TraceBehindObjects"); + internal static readonly int _MaxSteps = Shader.PropertyToID("_MaxSteps"); + internal static readonly int _FullResolutionFiltering = Shader.PropertyToID("_FullResolutionFiltering"); + internal static readonly int _HalfResolution = Shader.PropertyToID("_HalfResolution"); + internal static readonly int _HighlightSuppression = Shader.PropertyToID("_HighlightSuppression"); + internal static readonly int _PixelsPerMeterAtOneMeter = Shader.PropertyToID("_PixelsPerMeterAtOneMeter"); + internal static readonly int _ScreenEdgeFading = Shader.PropertyToID("_ScreenEdgeFading"); + internal static readonly int _ReflectionBlur = Shader.PropertyToID("_ReflectionBlur"); + internal static readonly int _MaxRayTraceDistance = Shader.PropertyToID("_MaxRayTraceDistance"); + internal static readonly int _FadeDistance = Shader.PropertyToID("_FadeDistance"); + internal static readonly int _LayerThickness = Shader.PropertyToID("_LayerThickness"); + internal static readonly int _SSRMultiplier = Shader.PropertyToID("_SSRMultiplier"); + internal static readonly int _FresnelFade = Shader.PropertyToID("_FresnelFade"); + internal static readonly int _FresnelFadePower = Shader.PropertyToID("_FresnelFadePower"); + internal static readonly int _ReflectionBufferSize = Shader.PropertyToID("_ReflectionBufferSize"); + internal static readonly int _ScreenSize = Shader.PropertyToID("_ScreenSize"); + internal static readonly int _InvScreenSize = Shader.PropertyToID("_InvScreenSize"); + internal static readonly int _ProjInfo = Shader.PropertyToID("_ProjInfo"); + internal static readonly int _CameraClipInfo = Shader.PropertyToID("_CameraClipInfo"); + internal static readonly int _ProjectToPixelMatrix = Shader.PropertyToID("_ProjectToPixelMatrix"); + internal static readonly int _WorldToCameraMatrix = Shader.PropertyToID("_WorldToCameraMatrix"); + internal static readonly int _CameraToWorldMatrix = Shader.PropertyToID("_CameraToWorldMatrix"); + internal static readonly int _Axis = Shader.PropertyToID("_Axis"); + internal static readonly int _CurrentMipLevel = Shader.PropertyToID("_CurrentMipLevel"); + internal static readonly int _NormalAndRoughnessTexture = Shader.PropertyToID("_NormalAndRoughnessTexture"); + internal static readonly int _HitPointTexture = Shader.PropertyToID("_HitPointTexture"); + internal static readonly int _BlurTexture = Shader.PropertyToID("_BlurTexture"); + internal static readonly int _FilteredReflections = Shader.PropertyToID("_FilteredReflections"); + internal static readonly int _FinalReflectionTexture = Shader.PropertyToID("_FinalReflectionTexture"); + internal static readonly int _TempTexture = Shader.PropertyToID("_TempTexture"); + } + + // Unexposed variables + bool k_HighlightSuppression = false; + bool k_TraceBehindObjects = true; + bool k_TreatBackfaceHitAsMiss = false; + bool k_BilateralUpsample = true; + + enum PassIndex + { + RayTraceStep = 0, + CompositeFinal = 1, + Blur = 2, + CompositeSSR = 3, + MinMipGeneration = 4, + HitPointToReflections = 5, + BilateralKeyPack = 6, + BlitDepthAsCSZ = 7, + PoissonBlur = 8, + } + + readonly int[] m_ReflectionTextures = new int[5]; + + // Not really needed as SSR only works in deferred right now + public override DepthTextureMode GetCameraFlags() + { + return DepthTextureMode.Depth; + } + + public override bool active + { + get + { + return model.enabled + && context.isGBufferAvailable + && !context.interrupted; + } + } + + public override void OnEnable() + { + m_ReflectionTextures[0] = Shader.PropertyToID("_ReflectionTexture0"); + m_ReflectionTextures[1] = Shader.PropertyToID("_ReflectionTexture1"); + m_ReflectionTextures[2] = Shader.PropertyToID("_ReflectionTexture2"); + m_ReflectionTextures[3] = Shader.PropertyToID("_ReflectionTexture3"); + m_ReflectionTextures[4] = Shader.PropertyToID("_ReflectionTexture4"); + } + + public override string GetName() + { + return "Screen Space Reflection"; + } + + public override CameraEvent GetCameraEvent() + { + return CameraEvent.AfterFinalPass; + } + + public override void PopulateCommandBuffer(CommandBuffer cb) + { + var settings = model.settings; + var camera = context.camera; + + // Material setup + int downsampleAmount = (settings.reflection.reflectionQuality == SSRResolution.High) ? 1 : 2; + + var rtW = context.width / downsampleAmount; + var rtH = context.height / downsampleAmount; + + float sWidth = context.width; + float sHeight = context.height; + + float sx = sWidth / 2f; + float sy = sHeight / 2f; + + var material = context.materialFactory.Get("Hidden/Post FX/Screen Space Reflection"); + + material.SetInt(Uniforms._RayStepSize, settings.reflection.stepSize); + material.SetInt(Uniforms._AdditiveReflection, settings.reflection.blendType == SSRReflectionBlendType.Additive ? 1 : 0); + material.SetInt(Uniforms._BilateralUpsampling, k_BilateralUpsample ? 1 : 0); + material.SetInt(Uniforms._TreatBackfaceHitAsMiss, k_TreatBackfaceHitAsMiss ? 1 : 0); + material.SetInt(Uniforms._AllowBackwardsRays, settings.reflection.reflectBackfaces ? 1 : 0); + material.SetInt(Uniforms._TraceBehindObjects, k_TraceBehindObjects ? 1 : 0); + material.SetInt(Uniforms._MaxSteps, settings.reflection.iterationCount); + material.SetInt(Uniforms._FullResolutionFiltering, 0); + material.SetInt(Uniforms._HalfResolution, (settings.reflection.reflectionQuality != SSRResolution.High) ? 1 : 0); + material.SetInt(Uniforms._HighlightSuppression, k_HighlightSuppression ? 1 : 0); + + // The height in pixels of a 1m object if viewed from 1m away. + float pixelsPerMeterAtOneMeter = sWidth / (-2f * Mathf.Tan(camera.fieldOfView / 180f * Mathf.PI * 0.5f)); + + material.SetFloat(Uniforms._PixelsPerMeterAtOneMeter, pixelsPerMeterAtOneMeter); + material.SetFloat(Uniforms._ScreenEdgeFading, settings.screenEdgeMask.intensity); + material.SetFloat(Uniforms._ReflectionBlur, settings.reflection.reflectionBlur); + material.SetFloat(Uniforms._MaxRayTraceDistance, settings.reflection.maxDistance); + material.SetFloat(Uniforms._FadeDistance, settings.intensity.fadeDistance); + material.SetFloat(Uniforms._LayerThickness, settings.reflection.widthModifier); + material.SetFloat(Uniforms._SSRMultiplier, settings.intensity.reflectionMultiplier); + material.SetFloat(Uniforms._FresnelFade, settings.intensity.fresnelFade); + material.SetFloat(Uniforms._FresnelFadePower, settings.intensity.fresnelFadePower); + + var P = camera.projectionMatrix; + var projInfo = new Vector4( + -2f / (sWidth * P[0]), + -2f / (sHeight * P[5]), + (1f - P[2]) / P[0], + (1f + P[6]) / P[5] + ); + + var cameraClipInfo = float.IsPositiveInfinity(camera.farClipPlane) ? + new Vector3(camera.nearClipPlane, -1f, 1f) : + new Vector3(camera.nearClipPlane * camera.farClipPlane, camera.nearClipPlane - camera.farClipPlane, camera.farClipPlane); + + material.SetVector(Uniforms._ReflectionBufferSize, new Vector2(rtW, rtH)); + material.SetVector(Uniforms._ScreenSize, new Vector2(sWidth, sHeight)); + material.SetVector(Uniforms._InvScreenSize, new Vector2(1f / sWidth, 1f / sHeight)); + material.SetVector(Uniforms._ProjInfo, projInfo); // used for unprojection + + material.SetVector(Uniforms._CameraClipInfo, cameraClipInfo); + + var warpToScreenSpaceMatrix = new Matrix4x4(); + warpToScreenSpaceMatrix.SetRow(0, new Vector4(sx, 0f, 0f, sx)); + warpToScreenSpaceMatrix.SetRow(1, new Vector4(0f, sy, 0f, sy)); + warpToScreenSpaceMatrix.SetRow(2, new Vector4(0f, 0f, 1f, 0f)); + warpToScreenSpaceMatrix.SetRow(3, new Vector4(0f, 0f, 0f, 1f)); + + var projectToPixelMatrix = warpToScreenSpaceMatrix * P; + + material.SetMatrix(Uniforms._ProjectToPixelMatrix, projectToPixelMatrix); + material.SetMatrix(Uniforms._WorldToCameraMatrix, camera.worldToCameraMatrix); + material.SetMatrix(Uniforms._CameraToWorldMatrix, camera.worldToCameraMatrix.inverse); + + // Command buffer setup + var intermediateFormat = context.isHdr ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.ARGB32; + const int maxMip = 5; + + var kNormalAndRoughnessTexture = Uniforms._NormalAndRoughnessTexture; + var kHitPointTexture = Uniforms._HitPointTexture; + var kBlurTexture = Uniforms._BlurTexture; + var kFilteredReflections = Uniforms._FilteredReflections; + var kFinalReflectionTexture = Uniforms._FinalReflectionTexture; + var kTempTexture = Uniforms._TempTexture; + + // RGB: Normals, A: Roughness. + // Has the nice benefit of allowing us to control the filtering mode as well. + cb.GetTemporaryRT(kNormalAndRoughnessTexture, -1, -1, 0, FilterMode.Point, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); + + cb.GetTemporaryRT(kHitPointTexture, rtW, rtH, 0, FilterMode.Bilinear, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); + + for (int i = 0; i < maxMip; ++i) + { + // We explicitly interpolate during bilateral upsampling. + cb.GetTemporaryRT(m_ReflectionTextures[i], rtW >> i, rtH >> i, 0, FilterMode.Bilinear, intermediateFormat); + } + + cb.GetTemporaryRT(kFilteredReflections, rtW, rtH, 0, k_BilateralUpsample ? FilterMode.Point : FilterMode.Bilinear, intermediateFormat); + cb.GetTemporaryRT(kFinalReflectionTexture, rtW, rtH, 0, FilterMode.Point, intermediateFormat); + + cb.Blit(BuiltinRenderTextureType.CameraTarget, kNormalAndRoughnessTexture, material, (int)PassIndex.BilateralKeyPack); + cb.Blit(BuiltinRenderTextureType.CameraTarget, kHitPointTexture, material, (int)PassIndex.RayTraceStep); + cb.Blit(BuiltinRenderTextureType.CameraTarget, kFilteredReflections, material, (int)PassIndex.HitPointToReflections); + cb.Blit(kFilteredReflections, m_ReflectionTextures[0], material, (int)PassIndex.PoissonBlur); + + for (int i = 1; i < maxMip; ++i) + { + int inputTex = m_ReflectionTextures[i - 1]; + + int lowMip = i; + + cb.GetTemporaryRT(kBlurTexture, rtW >> lowMip, rtH >> lowMip, 0, FilterMode.Bilinear, intermediateFormat); + cb.SetGlobalVector(Uniforms._Axis, new Vector4(1.0f, 0.0f, 0.0f, 0.0f)); + cb.SetGlobalFloat(Uniforms._CurrentMipLevel, i - 1.0f); + + cb.Blit(inputTex, kBlurTexture, material, (int)PassIndex.Blur); + + cb.SetGlobalVector(Uniforms._Axis, new Vector4(0.0f, 1.0f, 0.0f, 0.0f)); + + inputTex = m_ReflectionTextures[i]; + cb.Blit(kBlurTexture, inputTex, material, (int)PassIndex.Blur); + cb.ReleaseTemporaryRT(kBlurTexture); + } + + cb.Blit(m_ReflectionTextures[0], kFinalReflectionTexture, material, (int)PassIndex.CompositeSSR); + + cb.GetTemporaryRT(kTempTexture, camera.pixelWidth, camera.pixelHeight, 0, FilterMode.Bilinear, intermediateFormat); + + cb.Blit(BuiltinRenderTextureType.CameraTarget, kTempTexture, material, (int)PassIndex.CompositeFinal); + cb.Blit(kTempTexture, BuiltinRenderTextureType.CameraTarget); + + cb.ReleaseTemporaryRT(kTempTexture); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/ScreenSpaceReflectionComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/ScreenSpaceReflectionComponent.cs.meta new file mode 100644 index 0000000..56ce9b4 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/ScreenSpaceReflectionComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dd75f795d6a798f44a7801082f6a703f +timeCreated: 1467626205 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/TaaComponent.cs b/Assets/PostProcessing/Runtime/Components/TaaComponent.cs new file mode 100644 index 0000000..c5e58d5 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/TaaComponent.cs @@ -0,0 +1,219 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + public sealed class TaaComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static int _Jitter = Shader.PropertyToID("_Jitter"); + internal static int _SharpenParameters = Shader.PropertyToID("_SharpenParameters"); + internal static int _FinalBlendParameters = Shader.PropertyToID("_FinalBlendParameters"); + internal static int _HistoryTex = Shader.PropertyToID("_HistoryTex"); + internal static int _MainTex = Shader.PropertyToID("_MainTex"); + } + + const string k_ShaderString = "Hidden/Post FX/Temporal Anti-aliasing"; + const int k_SampleCount = 8; + + readonly RenderBuffer[] m_MRT = new RenderBuffer[2]; + + int m_SampleIndex = 0; + bool m_ResetHistory = true; + + RenderTexture m_HistoryTexture; + + public override bool active + { + get + { + return model.enabled + && model.settings.method == AntialiasingModel.Method.Taa + && SystemInfo.supportsMotionVectors + && SystemInfo.supportedRenderTargetCount >= 2 + && !context.interrupted; + } + } + + public override DepthTextureMode GetCameraFlags() + { + return DepthTextureMode.Depth | DepthTextureMode.MotionVectors; + } + + public Vector2 jitterVector { get; private set; } + + public void ResetHistory() + { + m_ResetHistory = true; + } + + public void SetProjectionMatrix(Func jitteredFunc) + { + var settings = model.settings.taaSettings; + + var jitter = GenerateRandomOffset(); + jitter *= settings.jitterSpread; + + context.camera.nonJitteredProjectionMatrix = context.camera.projectionMatrix; + + if (jitteredFunc != null) + { + context.camera.projectionMatrix = jitteredFunc(jitter); + } + else + { + context.camera.projectionMatrix = context.camera.orthographic + ? GetOrthographicProjectionMatrix(jitter) + : GetPerspectiveProjectionMatrix(jitter); + } + +#if UNITY_5_5_OR_NEWER + context.camera.useJitteredProjectionMatrixForTransparentRendering = false; +#endif + + jitter.x /= context.width; + jitter.y /= context.height; + + var material = context.materialFactory.Get(k_ShaderString); + material.SetVector(Uniforms._Jitter, jitter); + + jitterVector = jitter; + } + + public void Render(RenderTexture source, RenderTexture destination) + { + var material = context.materialFactory.Get(k_ShaderString); + material.shaderKeywords = null; + + var settings = model.settings.taaSettings; + + if (m_ResetHistory || m_HistoryTexture == null || m_HistoryTexture.width != source.width || m_HistoryTexture.height != source.height) + { + if (m_HistoryTexture) + RenderTexture.ReleaseTemporary(m_HistoryTexture); + + m_HistoryTexture = RenderTexture.GetTemporary(source.width, source.height, 0, source.format); + m_HistoryTexture.name = "TAA History"; + + Graphics.Blit(source, m_HistoryTexture, material, 2); + } + + const float kMotionAmplification = 100f * 60f; + material.SetVector(Uniforms._SharpenParameters, new Vector4(settings.sharpen, 0f, 0f, 0f)); + material.SetVector(Uniforms._FinalBlendParameters, new Vector4(settings.stationaryBlending, settings.motionBlending, kMotionAmplification, 0f)); + material.SetTexture(Uniforms._MainTex, source); + material.SetTexture(Uniforms._HistoryTex, m_HistoryTexture); + + var tempHistory = RenderTexture.GetTemporary(source.width, source.height, 0, source.format); + tempHistory.name = "TAA History"; + + m_MRT[0] = destination.colorBuffer; + m_MRT[1] = tempHistory.colorBuffer; + + Graphics.SetRenderTarget(m_MRT, source.depthBuffer); + GraphicsUtils.Blit(material, context.camera.orthographic ? 1 : 0); + + RenderTexture.ReleaseTemporary(m_HistoryTexture); + m_HistoryTexture = tempHistory; + + m_ResetHistory = false; + } + + float GetHaltonValue(int index, int radix) + { + float result = 0f; + float fraction = 1f / (float)radix; + + while (index > 0) + { + result += (float)(index % radix) * fraction; + + index /= radix; + fraction /= (float)radix; + } + + return result; + } + + Vector2 GenerateRandomOffset() + { + var offset = new Vector2( + GetHaltonValue(m_SampleIndex & 1023, 2), + GetHaltonValue(m_SampleIndex & 1023, 3)); + + if (++m_SampleIndex >= k_SampleCount) + m_SampleIndex = 0; + + return offset; + } + + // Adapted heavily from PlayDead's TAA code + // https://github.com/playdeadgames/temporal/blob/master/Assets/Scripts/Extensions.cs + Matrix4x4 GetPerspectiveProjectionMatrix(Vector2 offset) + { + float vertical = Mathf.Tan(0.5f * Mathf.Deg2Rad * context.camera.fieldOfView); + float horizontal = vertical * context.camera.aspect; + + offset.x *= horizontal / (0.5f * context.width); + offset.y *= vertical / (0.5f * context.height); + + float left = (offset.x - horizontal) * context.camera.nearClipPlane; + float right = (offset.x + horizontal) * context.camera.nearClipPlane; + float top = (offset.y + vertical) * context.camera.nearClipPlane; + float bottom = (offset.y - vertical) * context.camera.nearClipPlane; + + var matrix = new Matrix4x4(); + + matrix[0, 0] = (2f * context.camera.nearClipPlane) / (right - left); + matrix[0, 1] = 0f; + matrix[0, 2] = (right + left) / (right - left); + matrix[0, 3] = 0f; + + matrix[1, 0] = 0f; + matrix[1, 1] = (2f * context.camera.nearClipPlane) / (top - bottom); + matrix[1, 2] = (top + bottom) / (top - bottom); + matrix[1, 3] = 0f; + + matrix[2, 0] = 0f; + matrix[2, 1] = 0f; + matrix[2, 2] = -(context.camera.farClipPlane + context.camera.nearClipPlane) / (context.camera.farClipPlane - context.camera.nearClipPlane); + matrix[2, 3] = -(2f * context.camera.farClipPlane * context.camera.nearClipPlane) / (context.camera.farClipPlane - context.camera.nearClipPlane); + + matrix[3, 0] = 0f; + matrix[3, 1] = 0f; + matrix[3, 2] = -1f; + matrix[3, 3] = 0f; + + return matrix; + } + + Matrix4x4 GetOrthographicProjectionMatrix(Vector2 offset) + { + float vertical = context.camera.orthographicSize; + float horizontal = vertical * context.camera.aspect; + + offset.x *= horizontal / (0.5f * context.width); + offset.y *= vertical / (0.5f * context.height); + + float left = offset.x - horizontal; + float right = offset.x + horizontal; + float top = offset.y + vertical; + float bottom = offset.y - vertical; + + return Matrix4x4.Ortho(left, right, bottom, top, context.camera.nearClipPlane, context.camera.farClipPlane); + } + + public override void OnDisable() + { + if (m_HistoryTexture != null) + RenderTexture.ReleaseTemporary(m_HistoryTexture); + +#if UNITY_5_5_OR_NEWER + context.camera.useJitteredProjectionMatrixForTransparentRendering = true; +#endif + m_HistoryTexture = null; + m_SampleIndex = 0; + ResetHistory(); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/TaaComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/TaaComponent.cs.meta new file mode 100644 index 0000000..750d417 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/TaaComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f28703283e17be54180fd04a7c70e1d5 +timeCreated: 1472806965 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/UserLutComponent.cs b/Assets/PostProcessing/Runtime/Components/UserLutComponent.cs new file mode 100644 index 0000000..0dd05de --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/UserLutComponent.cs @@ -0,0 +1,39 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class UserLutComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _UserLut = Shader.PropertyToID("_UserLut"); + internal static readonly int _UserLut_Params = Shader.PropertyToID("_UserLut_Params"); + } + + public override bool active + { + get + { + var settings = model.settings; + return model.enabled + && settings.lut != null + && settings.contribution > 0f + && settings.lut.height == (int)Mathf.Sqrt(settings.lut.width) + && !context.interrupted; + } + } + + public override void Prepare(Material uberMaterial) + { + var settings = model.settings; + uberMaterial.EnableKeyword("USER_LUT"); + uberMaterial.SetTexture(Uniforms._UserLut, settings.lut); + uberMaterial.SetVector(Uniforms._UserLut_Params, new Vector4(1f / settings.lut.width, 1f / settings.lut.height, settings.lut.height - 1f, settings.contribution)); + } + + public void OnGUI() + { + var settings = model.settings; + var rect = new Rect(context.viewport.x * Screen.width + 8f, 8f, settings.lut.width, settings.lut.height); + GUI.DrawTexture(rect, settings.lut); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/UserLutComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/UserLutComponent.cs.meta new file mode 100644 index 0000000..1683d29 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/UserLutComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 63cb071fb8442a14f85c02e6ddba9b72 +timeCreated: 1473086193 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Components/VignetteComponent.cs b/Assets/PostProcessing/Runtime/Components/VignetteComponent.cs new file mode 100644 index 0000000..58148dd --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/VignetteComponent.cs @@ -0,0 +1,46 @@ +namespace UnityEngine.PostProcessing +{ + public sealed class VignetteComponent : PostProcessingComponentRenderTexture + { + static class Uniforms + { + internal static readonly int _Vignette_Color = Shader.PropertyToID("_Vignette_Color"); + internal static readonly int _Vignette_Center = Shader.PropertyToID("_Vignette_Center"); + internal static readonly int _Vignette_Settings = Shader.PropertyToID("_Vignette_Settings"); + internal static readonly int _Vignette_Mask = Shader.PropertyToID("_Vignette_Mask"); + internal static readonly int _Vignette_Opacity = Shader.PropertyToID("_Vignette_Opacity"); + } + + public override bool active + { + get + { + return model.enabled + && !context.interrupted; + } + } + + public override void Prepare(Material uberMaterial) + { + var settings = model.settings; + uberMaterial.SetColor(Uniforms._Vignette_Color, settings.color); + + if (settings.mode == VignetteModel.Mode.Classic) + { + uberMaterial.SetVector(Uniforms._Vignette_Center, settings.center); + uberMaterial.EnableKeyword("VIGNETTE_CLASSIC"); + float roundness = (1f - settings.roundness) * 6f + settings.roundness; + uberMaterial.SetVector(Uniforms._Vignette_Settings, new Vector4(settings.intensity * 3f, settings.smoothness * 5f, roundness, settings.rounded ? 1f : 0f)); + } + else if (settings.mode == VignetteModel.Mode.Masked) + { + if (settings.mask != null && settings.opacity > 0f) + { + uberMaterial.EnableKeyword("VIGNETTE_MASKED"); + uberMaterial.SetTexture(Uniforms._Vignette_Mask, settings.mask); + uberMaterial.SetFloat(Uniforms._Vignette_Opacity, settings.opacity); + } + } + } + } +} diff --git a/Assets/PostProcessing/Runtime/Components/VignetteComponent.cs.meta b/Assets/PostProcessing/Runtime/Components/VignetteComponent.cs.meta new file mode 100644 index 0000000..17b1d3e --- /dev/null +++ b/Assets/PostProcessing/Runtime/Components/VignetteComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 39074aa97f4be23438147346f081c7f3 +timeCreated: 1473083872 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models.meta b/Assets/PostProcessing/Runtime/Models.meta new file mode 100644 index 0000000..f6d84e3 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8d5a699332eb8a9499077fa4bcd4e0a0 +folderAsset: yes +timeCreated: 1459757852 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/AmbientOcclusionModel.cs b/Assets/PostProcessing/Runtime/Models/AmbientOcclusionModel.cs new file mode 100644 index 0000000..189d447 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/AmbientOcclusionModel.cs @@ -0,0 +1,71 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class AmbientOcclusionModel : PostProcessingModel + { + public enum SampleCount + { + Lowest = 3, + Low = 6, + Medium = 10, + High = 16 + } + + [Serializable] + public struct Settings + { + [Range(0, 4), Tooltip("Degree of darkness produced by the effect.")] + public float intensity; + + [Min(1e-4f), Tooltip("Radius of sample points, which affects extent of darkened areas.")] + public float radius; + + [Tooltip("Number of sample points, which affects quality and performance.")] + public SampleCount sampleCount; + + [Tooltip("Halves the resolution of the effect to increase performance at the cost of visual quality.")] + public bool downsampling; + + [Tooltip("Forces compatibility with Forward rendered objects when working with the Deferred rendering path.")] + public bool forceForwardCompatibility; + + [Tooltip("Enables the ambient-only mode in that the effect only affects ambient lighting. This mode is only available with the Deferred rendering path and HDR rendering.")] + public bool ambientOnly; + + [Tooltip("Toggles the use of a higher precision depth texture with the forward rendering path (may impact performances). Has no effect with the deferred rendering path.")] + public bool highPrecision; + + public static Settings defaultSettings + { + get + { + return new Settings + { + intensity = 1f, + radius = 0.3f, + sampleCount = SampleCount.Medium, + downsampling = true, + forceForwardCompatibility = false, + ambientOnly = false, + highPrecision = false + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/AmbientOcclusionModel.cs.meta b/Assets/PostProcessing/Runtime/Models/AmbientOcclusionModel.cs.meta new file mode 100644 index 0000000..919641a --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/AmbientOcclusionModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 564228afc5cbd5f49beb80038b4b7af2 +timeCreated: 1462280796 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/AntialiasingModel.cs b/Assets/PostProcessing/Runtime/Models/AntialiasingModel.cs new file mode 100644 index 0000000..05e73a7 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/AntialiasingModel.cs @@ -0,0 +1,242 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class AntialiasingModel : PostProcessingModel + { + public enum Method + { + Fxaa, + Taa + } + + // Most settings aren't exposed to the user anymore, presets are enough. Still, I'm leaving + // the tooltip attributes in case an user wants to customize each preset. + + #region FXAA Settings + public enum FxaaPreset + { + ExtremePerformance, + Performance, + Default, + Quality, + ExtremeQuality + } + + [Serializable] + public struct FxaaQualitySettings + { + [Tooltip("The amount of desired sub-pixel aliasing removal. Effects the sharpeness of the output.")] + [Range(0f, 1f)] + public float subpixelAliasingRemovalAmount; + + [Tooltip("The minimum amount of local contrast required to qualify a region as containing an edge.")] + [Range(0.063f, 0.333f)] + public float edgeDetectionThreshold; + + [Tooltip("Local contrast adaptation value to disallow the algorithm from executing on the darker regions.")] + [Range(0f, 0.0833f)] + public float minimumRequiredLuminance; + + public static FxaaQualitySettings[] presets = + { + // ExtremePerformance + new FxaaQualitySettings + { + subpixelAliasingRemovalAmount = 0f, + edgeDetectionThreshold = 0.333f, + minimumRequiredLuminance = 0.0833f + }, + + // Performance + new FxaaQualitySettings + { + subpixelAliasingRemovalAmount = 0.25f, + edgeDetectionThreshold = 0.25f, + minimumRequiredLuminance = 0.0833f + }, + + // Default + new FxaaQualitySettings + { + subpixelAliasingRemovalAmount = 0.75f, + edgeDetectionThreshold = 0.166f, + minimumRequiredLuminance = 0.0833f + }, + + // Quality + new FxaaQualitySettings + { + subpixelAliasingRemovalAmount = 1f, + edgeDetectionThreshold = 0.125f, + minimumRequiredLuminance = 0.0625f + }, + + // ExtremeQuality + new FxaaQualitySettings + { + subpixelAliasingRemovalAmount = 1f, + edgeDetectionThreshold = 0.063f, + minimumRequiredLuminance = 0.0312f + } + }; + } + + [Serializable] + public struct FxaaConsoleSettings + { + [Tooltip("The amount of spread applied to the sampling coordinates while sampling for subpixel information.")] + [Range(0.33f, 0.5f)] + public float subpixelSpreadAmount; + + [Tooltip("This value dictates how sharp the edges in the image are kept; a higher value implies sharper edges.")] + [Range(2f, 8f)] + public float edgeSharpnessAmount; + + [Tooltip("The minimum amount of local contrast required to qualify a region as containing an edge.")] + [Range(0.125f, 0.25f)] + public float edgeDetectionThreshold; + + [Tooltip("Local contrast adaptation value to disallow the algorithm from executing on the darker regions.")] + [Range(0.04f, 0.06f)] + public float minimumRequiredLuminance; + + public static FxaaConsoleSettings[] presets = + { + // ExtremePerformance + new FxaaConsoleSettings + { + subpixelSpreadAmount = 0.33f, + edgeSharpnessAmount = 8f, + edgeDetectionThreshold = 0.25f, + minimumRequiredLuminance = 0.06f + }, + + // Performance + new FxaaConsoleSettings + { + subpixelSpreadAmount = 0.33f, + edgeSharpnessAmount = 8f, + edgeDetectionThreshold = 0.125f, + minimumRequiredLuminance = 0.06f + }, + + // Default + new FxaaConsoleSettings + { + subpixelSpreadAmount = 0.5f, + edgeSharpnessAmount = 8f, + edgeDetectionThreshold = 0.125f, + minimumRequiredLuminance = 0.05f + }, + + // Quality + new FxaaConsoleSettings + { + subpixelSpreadAmount = 0.5f, + edgeSharpnessAmount = 4f, + edgeDetectionThreshold = 0.125f, + minimumRequiredLuminance = 0.04f + }, + + // ExtremeQuality + new FxaaConsoleSettings + { + subpixelSpreadAmount = 0.5f, + edgeSharpnessAmount = 2f, + edgeDetectionThreshold = 0.125f, + minimumRequiredLuminance = 0.04f + } + }; + } + + [Serializable] + public struct FxaaSettings + { + public FxaaPreset preset; + + public static FxaaSettings defaultSettings + { + get + { + return new FxaaSettings + { + preset = FxaaPreset.Default + }; + } + } + } + #endregion + + #region TAA Settings + [Serializable] + public struct TaaSettings + { + [Tooltip("The diameter (in texels) inside which jitter samples are spread. Smaller values result in crisper but more aliased output, while larger values result in more stable but blurrier output.")] + [Range(0.1f, 1f)] + public float jitterSpread; + + [Tooltip("Controls the amount of sharpening applied to the color buffer.")] + [Range(0f, 3f)] + public float sharpen; + + [Tooltip("The blend coefficient for a stationary fragment. Controls the percentage of history sample blended into the final color.")] + [Range(0f, 0.99f)] + public float stationaryBlending; + + [Tooltip("The blend coefficient for a fragment with significant motion. Controls the percentage of history sample blended into the final color.")] + [Range(0f, 0.99f)] + public float motionBlending; + + public static TaaSettings defaultSettings + { + get + { + return new TaaSettings + { + jitterSpread = 0.75f, + sharpen = 0.3f, + stationaryBlending = 0.95f, + motionBlending = 0.85f + }; + } + } + } + #endregion + + [Serializable] + public struct Settings + { + public Method method; + public FxaaSettings fxaaSettings; + public TaaSettings taaSettings; + + public static Settings defaultSettings + { + get + { + return new Settings + { + method = Method.Fxaa, + fxaaSettings = FxaaSettings.defaultSettings, + taaSettings = TaaSettings.defaultSettings + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/AntialiasingModel.cs.meta b/Assets/PostProcessing/Runtime/Models/AntialiasingModel.cs.meta new file mode 100644 index 0000000..ed363fc --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/AntialiasingModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cb9a239ec5f20ca4cb5d0391441588de +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/BloomModel.cs b/Assets/PostProcessing/Runtime/Models/BloomModel.cs new file mode 100644 index 0000000..bddae5e --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/BloomModel.cs @@ -0,0 +1,102 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class BloomModel : PostProcessingModel + { + [Serializable] + public struct BloomSettings + { + [Min(0f), Tooltip("Strength of the bloom filter.")] + public float intensity; + + [Min(0f), Tooltip("Filters out pixels under this level of brightness.")] + public float threshold; + + public float thresholdLinear + { + set { threshold = Mathf.LinearToGammaSpace(value); } + get { return Mathf.GammaToLinearSpace(threshold); } + } + + [Range(0f, 1f), Tooltip("Makes transition between under/over-threshold gradual (0 = hard threshold, 1 = soft threshold).")] + public float softKnee; + + [Range(1f, 7f), Tooltip("Changes extent of veiling effects in a screen resolution-independent fashion.")] + public float radius; + + [Tooltip("Reduces flashing noise with an additional filter.")] + public bool antiFlicker; + + public static BloomSettings defaultSettings + { + get + { + return new BloomSettings + { + intensity = 0.5f, + threshold = 1.1f, + softKnee = 0.5f, + radius = 4f, + antiFlicker = false, + }; + } + } + } + + [Serializable] + public struct LensDirtSettings + { + [Tooltip("Dirtiness texture to add smudges or dust to the lens.")] + public Texture texture; + + [Min(0f), Tooltip("Amount of lens dirtiness.")] + public float intensity; + + public static LensDirtSettings defaultSettings + { + get + { + return new LensDirtSettings + { + texture = null, + intensity = 3f + }; + } + } + } + + [Serializable] + public struct Settings + { + public BloomSettings bloom; + public LensDirtSettings lensDirt; + + public static Settings defaultSettings + { + get + { + return new Settings + { + bloom = BloomSettings.defaultSettings, + lensDirt = LensDirtSettings.defaultSettings + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/BloomModel.cs.meta b/Assets/PostProcessing/Runtime/Models/BloomModel.cs.meta new file mode 100644 index 0000000..e674d5f --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/BloomModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e215a6ec29d100f489c186f289526f06 +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/BuiltinDebugViewsModel.cs b/Assets/PostProcessing/Runtime/Models/BuiltinDebugViewsModel.cs new file mode 100644 index 0000000..473fdb8 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/BuiltinDebugViewsModel.cs @@ -0,0 +1,133 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class BuiltinDebugViewsModel : PostProcessingModel + { + [Serializable] + public struct DepthSettings + { + [Range(0f, 1f), Tooltip("Scales the camera far plane before displaying the depth map.")] + public float scale; + + public static DepthSettings defaultSettings + { + get + { + return new DepthSettings + { + scale = 1f + }; + } + } + } + + [Serializable] + public struct MotionVectorsSettings + { + [Range(0f, 1f), Tooltip("Opacity of the source render.")] + public float sourceOpacity; + + [Range(0f, 1f), Tooltip("Opacity of the per-pixel motion vector colors.")] + public float motionImageOpacity; + + [Min(0f), Tooltip("Because motion vectors are mainly very small vectors, you can use this setting to make them more visible.")] + public float motionImageAmplitude; + + [Range(0f, 1f), Tooltip("Opacity for the motion vector arrows.")] + public float motionVectorsOpacity; + + [Range(8, 64), Tooltip("The arrow density on screen.")] + public int motionVectorsResolution; + + [Min(0f), Tooltip("Tweaks the arrows length.")] + public float motionVectorsAmplitude; + + public static MotionVectorsSettings defaultSettings + { + get + { + return new MotionVectorsSettings + { + sourceOpacity = 1f, + + motionImageOpacity = 0f, + motionImageAmplitude = 16f, + + motionVectorsOpacity = 1f, + motionVectorsResolution = 24, + motionVectorsAmplitude = 64f + }; + } + } + } + + public enum Mode + { + None, + + Depth, + Normals, + MotionVectors, + + AmbientOcclusion, + EyeAdaptation, + FocusPlane, + PreGradingLog, + LogLut, + UserLut + } + + [Serializable] + public struct Settings + { + public Mode mode; + public DepthSettings depth; + public MotionVectorsSettings motionVectors; + + public static Settings defaultSettings + { + get + { + return new Settings + { + mode = Mode.None, + depth = DepthSettings.defaultSettings, + motionVectors = MotionVectorsSettings.defaultSettings + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public bool willInterrupt + { + get + { + return !IsModeActive(Mode.None) + && !IsModeActive(Mode.EyeAdaptation) + && !IsModeActive(Mode.PreGradingLog) + && !IsModeActive(Mode.LogLut) + && !IsModeActive(Mode.UserLut); + } + } + + public override void Reset() + { + settings = Settings.defaultSettings; + } + + public bool IsModeActive(Mode mode) + { + return m_Settings.mode == mode; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/BuiltinDebugViewsModel.cs.meta b/Assets/PostProcessing/Runtime/Models/BuiltinDebugViewsModel.cs.meta new file mode 100644 index 0000000..422ad3c --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/BuiltinDebugViewsModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 33d6d1a4b7b3dec40819019a25605191 +timeCreated: 1467970684 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/ChromaticAberrationModel.cs b/Assets/PostProcessing/Runtime/Models/ChromaticAberrationModel.cs new file mode 100644 index 0000000..2788167 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/ChromaticAberrationModel.cs @@ -0,0 +1,43 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class ChromaticAberrationModel : PostProcessingModel + { + [Serializable] + public struct Settings + { + [Tooltip("Shift the hue of chromatic aberrations.")] + public Texture2D spectralTexture; + + [Range(0f, 1f), Tooltip("Amount of tangential distortion.")] + public float intensity; + + public static Settings defaultSettings + { + get + { + return new Settings + { + spectralTexture = null, + intensity = 0.1f + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/ChromaticAberrationModel.cs.meta b/Assets/PostProcessing/Runtime/Models/ChromaticAberrationModel.cs.meta new file mode 100644 index 0000000..f0ef3c8 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/ChromaticAberrationModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8da01668697617e43879715e835a2367 +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/ColorGradingModel.cs b/Assets/PostProcessing/Runtime/Models/ColorGradingModel.cs new file mode 100644 index 0000000..7933f9f --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/ColorGradingModel.cs @@ -0,0 +1,311 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class ColorGradingModel : PostProcessingModel + { + public enum Tonemapper + { + None, + + /// + /// ACES Filmic reference tonemapper. + /// + ACES, + + /// + /// Neutral tonemapper (based off John Hable's & Jim Hejl's work). + /// + Neutral + } + + [Serializable] + public struct TonemappingSettings + { + [Tooltip("Tonemapping algorithm to use at the end of the color grading process. Use \"Neutral\" if you need a customizable tonemapper or \"Filmic\" to give a standard filmic look to your scenes.")] + public Tonemapper tonemapper; + + // Neutral settings + [Range(-0.1f, 0.1f)] + public float neutralBlackIn; + + [Range(1f, 20f)] + public float neutralWhiteIn; + + [Range(-0.09f, 0.1f)] + public float neutralBlackOut; + + [Range(1f, 19f)] + public float neutralWhiteOut; + + [Range(0.1f, 20f)] + public float neutralWhiteLevel; + + [Range(1f, 10f)] + public float neutralWhiteClip; + + public static TonemappingSettings defaultSettings + { + get + { + return new TonemappingSettings + { + tonemapper = Tonemapper.Neutral, + + neutralBlackIn = 0.02f, + neutralWhiteIn = 10f, + neutralBlackOut = 0f, + neutralWhiteOut = 10f, + neutralWhiteLevel = 5.3f, + neutralWhiteClip = 10f + }; + } + } + } + + [Serializable] + public struct BasicSettings + { + [Tooltip("Adjusts the overall exposure of the scene in EV units. This is applied after HDR effect and right before tonemapping so it won't affect previous effects in the chain.")] + public float postExposure; + + [Range(-100f, 100f), Tooltip("Sets the white balance to a custom color temperature.")] + public float temperature; + + [Range(-100f, 100f), Tooltip("Sets the white balance to compensate for a green or magenta tint.")] + public float tint; + + [Range(-180f, 180f), Tooltip("Shift the hue of all colors.")] + public float hueShift; + + [Range(0f, 2f), Tooltip("Pushes the intensity of all colors.")] + public float saturation; + + [Range(0f, 2f), Tooltip("Expands or shrinks the overall range of tonal values.")] + public float contrast; + + public static BasicSettings defaultSettings + { + get + { + return new BasicSettings + { + postExposure = 0f, + + temperature = 0f, + tint = 0f, + + hueShift = 0f, + saturation = 1f, + contrast = 1f, + }; + } + } + } + + [Serializable] + public struct ChannelMixerSettings + { + public Vector3 red; + public Vector3 green; + public Vector3 blue; + + [HideInInspector] + public int currentEditingChannel; // Used only in the editor + + public static ChannelMixerSettings defaultSettings + { + get + { + return new ChannelMixerSettings + { + red = new Vector3(1f, 0f, 0f), + green = new Vector3(0f, 1f, 0f), + blue = new Vector3(0f, 0f, 1f), + currentEditingChannel = 0 + }; + } + } + } + + [Serializable] + public struct LogWheelsSettings + { + [Trackball("GetSlopeValue")] + public Color slope; + + [Trackball("GetPowerValue")] + public Color power; + + [Trackball("GetOffsetValue")] + public Color offset; + + public static LogWheelsSettings defaultSettings + { + get + { + return new LogWheelsSettings + { + slope = Color.clear, + power = Color.clear, + offset = Color.clear + }; + } + } + } + + [Serializable] + public struct LinearWheelsSettings + { + [Trackball("GetLiftValue")] + public Color lift; + + [Trackball("GetGammaValue")] + public Color gamma; + + [Trackball("GetGainValue")] + public Color gain; + + public static LinearWheelsSettings defaultSettings + { + get + { + return new LinearWheelsSettings + { + lift = Color.clear, + gamma = Color.clear, + gain = Color.clear + }; + } + } + } + + public enum ColorWheelMode + { + Linear, + Log + } + + [Serializable] + public struct ColorWheelsSettings + { + public ColorWheelMode mode; + + [TrackballGroup] + public LogWheelsSettings log; + + [TrackballGroup] + public LinearWheelsSettings linear; + + public static ColorWheelsSettings defaultSettings + { + get + { + return new ColorWheelsSettings + { + mode = ColorWheelMode.Log, + log = LogWheelsSettings.defaultSettings, + linear = LinearWheelsSettings.defaultSettings + }; + } + } + } + + [Serializable] + public struct CurvesSettings + { + public ColorGradingCurve master; + public ColorGradingCurve red; + public ColorGradingCurve green; + public ColorGradingCurve blue; + public ColorGradingCurve hueVShue; + public ColorGradingCurve hueVSsat; + public ColorGradingCurve satVSsat; + public ColorGradingCurve lumVSsat; + + // Used only in the editor + [HideInInspector] public int e_CurrentEditingCurve; + [HideInInspector] public bool e_CurveY; + [HideInInspector] public bool e_CurveR; + [HideInInspector] public bool e_CurveG; + [HideInInspector] public bool e_CurveB; + + public static CurvesSettings defaultSettings + { + get + { + return new CurvesSettings + { + master = new ColorGradingCurve(new AnimationCurve(new Keyframe(0f, 0f, 1f, 1f), new Keyframe(1f, 1f, 1f, 1f)), 0f, false, new Vector2(0f, 1f)), + red = new ColorGradingCurve(new AnimationCurve(new Keyframe(0f, 0f, 1f, 1f), new Keyframe(1f, 1f, 1f, 1f)), 0f, false, new Vector2(0f, 1f)), + green = new ColorGradingCurve(new AnimationCurve(new Keyframe(0f, 0f, 1f, 1f), new Keyframe(1f, 1f, 1f, 1f)), 0f, false, new Vector2(0f, 1f)), + blue = new ColorGradingCurve(new AnimationCurve(new Keyframe(0f, 0f, 1f, 1f), new Keyframe(1f, 1f, 1f, 1f)), 0f, false, new Vector2(0f, 1f)), + + hueVShue = new ColorGradingCurve(new AnimationCurve(), 0.5f, true, new Vector2(0f, 1f)), + hueVSsat = new ColorGradingCurve(new AnimationCurve(), 0.5f, true, new Vector2(0f, 1f)), + satVSsat = new ColorGradingCurve(new AnimationCurve(), 0.5f, false, new Vector2(0f, 1f)), + lumVSsat = new ColorGradingCurve(new AnimationCurve(), 0.5f, false, new Vector2(0f, 1f)), + + e_CurrentEditingCurve = 0, + e_CurveY = true, + e_CurveR = false, + e_CurveG = false, + e_CurveB = false + }; + } + } + } + + [Serializable] + public struct Settings + { + public TonemappingSettings tonemapping; + public BasicSettings basic; + public ChannelMixerSettings channelMixer; + public ColorWheelsSettings colorWheels; + public CurvesSettings curves; + + public static Settings defaultSettings + { + get + { + return new Settings + { + tonemapping = TonemappingSettings.defaultSettings, + basic = BasicSettings.defaultSettings, + channelMixer = ChannelMixerSettings.defaultSettings, + colorWheels = ColorWheelsSettings.defaultSettings, + curves = CurvesSettings.defaultSettings + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set + { + m_Settings = value; + OnValidate(); + } + } + + public bool isDirty { get; internal set; } + public RenderTexture bakedLut { get; internal set; } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + OnValidate(); + } + + public override void OnValidate() + { + isDirty = true; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/ColorGradingModel.cs.meta b/Assets/PostProcessing/Runtime/Models/ColorGradingModel.cs.meta new file mode 100644 index 0000000..f6d4041 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/ColorGradingModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fe146bcdc1fb8ae4ab7dd803982d3489 +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/DepthOfFieldModel.cs b/Assets/PostProcessing/Runtime/Models/DepthOfFieldModel.cs new file mode 100644 index 0000000..bde86cb --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/DepthOfFieldModel.cs @@ -0,0 +1,63 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class DepthOfFieldModel : PostProcessingModel + { + public enum KernelSize + { + Small, + Medium, + Large, + VeryLarge + } + + [Serializable] + public struct Settings + { + [Min(0.1f), Tooltip("Distance to the point of focus.")] + public float focusDistance; + + [Range(0.05f, 32f), Tooltip("Ratio of aperture (known as f-stop or f-number). The smaller the value is, the shallower the depth of field is.")] + public float aperture; + + [Range(1f, 300f), Tooltip("Distance between the lens and the film. The larger the value is, the shallower the depth of field is.")] + public float focalLength; + + [Tooltip("Calculate the focal length automatically from the field-of-view value set on the camera. Using this setting isn't recommended.")] + public bool useCameraFov; + + [Tooltip("Convolution kernel size of the bokeh filter, which determines the maximum radius of bokeh. It also affects the performance (the larger the kernel is, the longer the GPU time is required).")] + public KernelSize kernelSize; + + public static Settings defaultSettings + { + get + { + return new Settings + { + focusDistance = 10f, + aperture = 5.6f, + focalLength = 50f, + useCameraFov = false, + kernelSize = KernelSize.Medium + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/DepthOfFieldModel.cs.meta b/Assets/PostProcessing/Runtime/Models/DepthOfFieldModel.cs.meta new file mode 100644 index 0000000..7b3e9d2 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/DepthOfFieldModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2626b17c595c71e43811d654eb28d30d +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/DitheringModel.cs b/Assets/PostProcessing/Runtime/Models/DitheringModel.cs new file mode 100644 index 0000000..7fd6afb --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/DitheringModel.cs @@ -0,0 +1,30 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class DitheringModel : PostProcessingModel + { + [Serializable] + public struct Settings + { + public static Settings defaultSettings + { + get { return new Settings(); } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/DitheringModel.cs.meta b/Assets/PostProcessing/Runtime/Models/DitheringModel.cs.meta new file mode 100644 index 0000000..400b00a --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/DitheringModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 41209882cdbcf31429d2a457a2164801 +timeCreated: 1485179235 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/EyeAdaptationModel.cs b/Assets/PostProcessing/Runtime/Models/EyeAdaptationModel.cs new file mode 100644 index 0000000..aa2020b --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/EyeAdaptationModel.cs @@ -0,0 +1,88 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class EyeAdaptationModel : PostProcessingModel + { + public enum EyeAdaptationType + { + Progressive, + Fixed + } + + [Serializable] + public struct Settings + { + [Range(1f, 99f), Tooltip("Filters the dark part of the histogram when computing the average luminance to avoid very dark pixels from contributing to the auto exposure. Unit is in percent.")] + public float lowPercent; + + [Range(1f, 99f), Tooltip("Filters the bright part of the histogram when computing the average luminance to avoid very dark pixels from contributing to the auto exposure. Unit is in percent.")] + public float highPercent; + + [Tooltip("Minimum average luminance to consider for auto exposure (in EV).")] + public float minLuminance; + + [Tooltip("Maximum average luminance to consider for auto exposure (in EV).")] + public float maxLuminance; + + [Min(0f), Tooltip("Exposure bias. Use this to offset the global exposure of the scene.")] + public float keyValue; + + [Tooltip("Set this to true to let Unity handle the key value automatically based on average luminance.")] + public bool dynamicKeyValue; + + [Tooltip("Use \"Progressive\" if you want the auto exposure to be animated. Use \"Fixed\" otherwise.")] + public EyeAdaptationType adaptationType; + + [Min(0f), Tooltip("Adaptation speed from a dark to a light environment.")] + public float speedUp; + + [Min(0f), Tooltip("Adaptation speed from a light to a dark environment.")] + public float speedDown; + + [Range(-16, -1), Tooltip("Lower bound for the brightness range of the generated histogram (in EV). The bigger the spread between min & max, the lower the precision will be.")] + public int logMin; + + [Range(1, 16), Tooltip("Upper bound for the brightness range of the generated histogram (in EV). The bigger the spread between min & max, the lower the precision will be.")] + public int logMax; + + public static Settings defaultSettings + { + get + { + return new Settings + { + lowPercent = 45f, + highPercent = 95f, + + minLuminance = -5f, + maxLuminance = 1f, + keyValue = 0.25f, + dynamicKeyValue = true, + + adaptationType = EyeAdaptationType.Progressive, + speedUp = 2f, + speedDown = 1f, + + logMin = -8, + logMax = 4 + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/EyeAdaptationModel.cs.meta b/Assets/PostProcessing/Runtime/Models/EyeAdaptationModel.cs.meta new file mode 100644 index 0000000..e6db162 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/EyeAdaptationModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: edf6d216ca4b60942a0c533c14f26d53 +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/FogModel.cs b/Assets/PostProcessing/Runtime/Models/FogModel.cs new file mode 100644 index 0000000..81effcb --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/FogModel.cs @@ -0,0 +1,39 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class FogModel : PostProcessingModel + { + [Serializable] + public struct Settings + { + [Tooltip("Should the fog affect the skybox?")] + public bool excludeSkybox; + + public static Settings defaultSettings + { + get + { + return new Settings + { + excludeSkybox = true + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/FogModel.cs.meta b/Assets/PostProcessing/Runtime/Models/FogModel.cs.meta new file mode 100644 index 0000000..7e174ea --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/FogModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1e20e66aa2deb7943993c444137d9acd +timeCreated: 1487328709 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/GrainModel.cs b/Assets/PostProcessing/Runtime/Models/GrainModel.cs new file mode 100644 index 0000000..f2d1b56 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/GrainModel.cs @@ -0,0 +1,51 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class GrainModel : PostProcessingModel + { + [Serializable] + public struct Settings + { + [Tooltip("Enable the use of colored grain.")] + public bool colored; + + [Range(0f, 1f), Tooltip("Grain strength. Higher means more visible grain.")] + public float intensity; + + [Range(0.3f, 3f), Tooltip("Grain particle size.")] + public float size; + + [Range(0f, 1f), Tooltip("Controls the noisiness response curve based on scene luminance. Lower values mean less noise in dark areas.")] + public float luminanceContribution; + + public static Settings defaultSettings + { + get + { + return new Settings + { + colored = true, + intensity = 0.5f, + size = 1f, + luminanceContribution = 0.8f + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/GrainModel.cs.meta b/Assets/PostProcessing/Runtime/Models/GrainModel.cs.meta new file mode 100644 index 0000000..77422ed --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/GrainModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f4fbcdb7f7a3c76489f32ffea74e6bb3 +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/MotionBlurModel.cs b/Assets/PostProcessing/Runtime/Models/MotionBlurModel.cs new file mode 100644 index 0000000..4fd3171 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/MotionBlurModel.cs @@ -0,0 +1,47 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class MotionBlurModel : PostProcessingModel + { + [Serializable] + public struct Settings + { + [Range(0f, 360f), Tooltip("The angle of rotary shutter. Larger values give longer exposure.")] + public float shutterAngle; + + [Range(4, 32), Tooltip("The amount of sample points, which affects quality and performances.")] + public int sampleCount; + + [Range(0f, 1f), Tooltip("The strength of multiple frame blending. The opacity of preceding frames are determined from this coefficient and time differences.")] + public float frameBlending; + + public static Settings defaultSettings + { + get + { + return new Settings + { + shutterAngle = 270f, + sampleCount = 10, + frameBlending = 0f + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/MotionBlurModel.cs.meta b/Assets/PostProcessing/Runtime/Models/MotionBlurModel.cs.meta new file mode 100644 index 0000000..54709e2 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/MotionBlurModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bb4df227c906dd342bd34767914d292c +timeCreated: 1468325392 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/ScreenSpaceReflectionModel.cs b/Assets/PostProcessing/Runtime/Models/ScreenSpaceReflectionModel.cs new file mode 100644 index 0000000..b697cd2 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/ScreenSpaceReflectionModel.cs @@ -0,0 +1,140 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class ScreenSpaceReflectionModel : PostProcessingModel + { + public enum SSRResolution + { + High = 0, + Low = 2 + } + + public enum SSRReflectionBlendType + { + PhysicallyBased, + Additive + } + + [Serializable] + public struct IntensitySettings + { + [Tooltip("Nonphysical multiplier for the SSR reflections. 1.0 is physically based.")] + [Range(0.0f, 2.0f)] + public float reflectionMultiplier; + + [Tooltip("How far away from the maxDistance to begin fading SSR.")] + [Range(0.0f, 1000.0f)] + public float fadeDistance; + + [Tooltip("Amplify Fresnel fade out. Increase if floor reflections look good close to the surface and bad farther 'under' the floor.")] + [Range(0.0f, 1.0f)] + public float fresnelFade; + + [Tooltip("Higher values correspond to a faster Fresnel fade as the reflection changes from the grazing angle.")] + [Range(0.1f, 10.0f)] + public float fresnelFadePower; + } + + [Serializable] + public struct ReflectionSettings + { + // When enabled, we just add our reflections on top of the existing ones. This is physically incorrect, but several + // popular demos and games have taken this approach, and it does hide some artifacts. + [Tooltip("How the reflections are blended into the render.")] + public SSRReflectionBlendType blendType; + + [Tooltip("Half resolution SSRR is much faster, but less accurate.")] + public SSRResolution reflectionQuality; + + [Tooltip("Maximum reflection distance in world units.")] + [Range(0.1f, 300.0f)] + public float maxDistance; + + /// REFLECTIONS + [Tooltip("Max raytracing length.")] + [Range(16, 1024)] + public int iterationCount; + + [Tooltip("Log base 2 of ray tracing coarse step size. Higher traces farther, lower gives better quality silhouettes.")] + [Range(1, 16)] + public int stepSize; + + [Tooltip("Typical thickness of columns, walls, furniture, and other objects that reflection rays might pass behind.")] + [Range(0.01f, 10.0f)] + public float widthModifier; + + [Tooltip("Blurriness of reflections.")] + [Range(0.1f, 8.0f)] + public float reflectionBlur; + + [Tooltip("Disable for a performance gain in scenes where most glossy objects are horizontal, like floors, water, and tables. Leave on for scenes with glossy vertical objects.")] + public bool reflectBackfaces; + } + + [Serializable] + public struct ScreenEdgeMask + { + [Tooltip("Higher = fade out SSRR near the edge of the screen so that reflections don't pop under camera motion.")] + [Range(0.0f, 1.0f)] + public float intensity; + } + + [Serializable] + public struct Settings + { + public ReflectionSettings reflection; + public IntensitySettings intensity; + public ScreenEdgeMask screenEdgeMask; + + public static Settings defaultSettings + { + get + { + return new Settings + { + reflection = new ReflectionSettings + { + blendType = SSRReflectionBlendType.PhysicallyBased, + reflectionQuality = SSRResolution.Low, + maxDistance = 100f, + iterationCount = 256, + stepSize = 3, + widthModifier = 0.5f, + reflectionBlur = 1f, + reflectBackfaces = false + }, + + intensity = new IntensitySettings + { + reflectionMultiplier = 1f, + fadeDistance = 100f, + + fresnelFade = 1f, + fresnelFadePower = 1f, + }, + + screenEdgeMask = new ScreenEdgeMask + { + intensity = 0.03f + } + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/ScreenSpaceReflectionModel.cs.meta b/Assets/PostProcessing/Runtime/Models/ScreenSpaceReflectionModel.cs.meta new file mode 100644 index 0000000..6b23544 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/ScreenSpaceReflectionModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e841012229e57cd408a146561435e90d +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/UserLutModel.cs b/Assets/PostProcessing/Runtime/Models/UserLutModel.cs new file mode 100644 index 0000000..d0efc2d --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/UserLutModel.cs @@ -0,0 +1,43 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class UserLutModel : PostProcessingModel + { + [Serializable] + public struct Settings + { + [Tooltip("Custom lookup texture (strip format, e.g. 256x16).")] + public Texture2D lut; + + [Range(0f, 1f), Tooltip("Blending factor.")] + public float contribution; + + public static Settings defaultSettings + { + get + { + return new Settings + { + lut = null, + contribution = 1f + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/UserLutModel.cs.meta b/Assets/PostProcessing/Runtime/Models/UserLutModel.cs.meta new file mode 100644 index 0000000..a693278 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/UserLutModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3a7afd753a89c4140b80c855e15f69d6 +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Models/VignetteModel.cs b/Assets/PostProcessing/Runtime/Models/VignetteModel.cs new file mode 100644 index 0000000..33b082e --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/VignetteModel.cs @@ -0,0 +1,78 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public class VignetteModel : PostProcessingModel + { + public enum Mode + { + Classic, + Masked + } + + [Serializable] + public struct Settings + { + [Tooltip("Use the \"Classic\" mode for parametric controls. Use the \"Masked\" mode to use your own texture mask.")] + public Mode mode; + + [ColorUsage(false)] + [Tooltip("Vignette color. Use the alpha channel for transparency.")] + public Color color; + + [Tooltip("Sets the vignette center point (screen center is [0.5,0.5]).")] + public Vector2 center; + + [Range(0f, 1f), Tooltip("Amount of vignetting on screen.")] + public float intensity; + + [Range(0.01f, 1f), Tooltip("Smoothness of the vignette borders.")] + public float smoothness; + + [Range(0f, 1f), Tooltip("Lower values will make a square-ish vignette.")] + public float roundness; + + [Tooltip("A black and white mask to use as a vignette.")] + public Texture mask; + + [Range(0f, 1f), Tooltip("Mask opacity.")] + public float opacity; + + [Tooltip("Should the vignette be perfectly round or be dependent on the current aspect ratio?")] + public bool rounded; + + public static Settings defaultSettings + { + get + { + return new Settings + { + mode = Mode.Classic, + color = new Color(0f, 0f, 0f, 1f), + center = new Vector2(0.5f, 0.5f), + intensity = 0.45f, + smoothness = 0.2f, + roundness = 1f, + mask = null, + opacity = 1f, + rounded = false + }; + } + } + } + + [SerializeField] + Settings m_Settings = Settings.defaultSettings; + public Settings settings + { + get { return m_Settings; } + set { m_Settings = value; } + } + + public override void Reset() + { + m_Settings = Settings.defaultSettings; + } + } +} diff --git a/Assets/PostProcessing/Runtime/Models/VignetteModel.cs.meta b/Assets/PostProcessing/Runtime/Models/VignetteModel.cs.meta new file mode 100644 index 0000000..c72ed5e --- /dev/null +++ b/Assets/PostProcessing/Runtime/Models/VignetteModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d7aa967ba692363448f1b25d0728b9bd +timeCreated: 1467126855 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/PostProcessingBehaviour.cs b/Assets/PostProcessing/Runtime/PostProcessingBehaviour.cs new file mode 100644 index 0000000..6f292d2 --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingBehaviour.cs @@ -0,0 +1,470 @@ +using System; +using System.Collections.Generic; +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + using DebugMode = BuiltinDebugViewsModel.Mode; + +#if UNITY_5_4_OR_NEWER + [ImageEffectAllowedInSceneView] +#endif + [RequireComponent(typeof(Camera)), DisallowMultipleComponent, ExecuteInEditMode] + [AddComponentMenu("Effects/Post-Processing Behaviour", -1)] + public class PostProcessingBehaviour : MonoBehaviour + { + // Inspector fields + public PostProcessingProfile profile; + + public Func jitteredMatrixFunc; + + // Internal helpers + Dictionary> m_CommandBuffers; + List m_Components; + Dictionary m_ComponentStates; + + MaterialFactory m_MaterialFactory; + RenderTextureFactory m_RenderTextureFactory; + PostProcessingContext m_Context; + Camera m_Camera; + PostProcessingProfile m_PreviousProfile; + + bool m_RenderingInSceneView = false; + + // Effect components + BuiltinDebugViewsComponent m_DebugViews; + AmbientOcclusionComponent m_AmbientOcclusion; + ScreenSpaceReflectionComponent m_ScreenSpaceReflection; + FogComponent m_FogComponent; + MotionBlurComponent m_MotionBlur; + TaaComponent m_Taa; + EyeAdaptationComponent m_EyeAdaptation; + DepthOfFieldComponent m_DepthOfField; + BloomComponent m_Bloom; + ChromaticAberrationComponent m_ChromaticAberration; + ColorGradingComponent m_ColorGrading; + UserLutComponent m_UserLut; + GrainComponent m_Grain; + VignetteComponent m_Vignette; + DitheringComponent m_Dithering; + FxaaComponent m_Fxaa; + + void OnEnable() + { + m_CommandBuffers = new Dictionary>(); + m_MaterialFactory = new MaterialFactory(); + m_RenderTextureFactory = new RenderTextureFactory(); + m_Context = new PostProcessingContext(); + + // Keep a list of all post-fx for automation purposes + m_Components = new List(); + + // Component list + m_DebugViews = AddComponent(new BuiltinDebugViewsComponent()); + m_AmbientOcclusion = AddComponent(new AmbientOcclusionComponent()); + m_ScreenSpaceReflection = AddComponent(new ScreenSpaceReflectionComponent()); + m_FogComponent = AddComponent(new FogComponent()); + m_MotionBlur = AddComponent(new MotionBlurComponent()); + m_Taa = AddComponent(new TaaComponent()); + m_EyeAdaptation = AddComponent(new EyeAdaptationComponent()); + m_DepthOfField = AddComponent(new DepthOfFieldComponent()); + m_Bloom = AddComponent(new BloomComponent()); + m_ChromaticAberration = AddComponent(new ChromaticAberrationComponent()); + m_ColorGrading = AddComponent(new ColorGradingComponent()); + m_UserLut = AddComponent(new UserLutComponent()); + m_Grain = AddComponent(new GrainComponent()); + m_Vignette = AddComponent(new VignetteComponent()); + m_Dithering = AddComponent(new DitheringComponent()); + m_Fxaa = AddComponent(new FxaaComponent()); + + // Prepare state observers + m_ComponentStates = new Dictionary(); + + foreach (var component in m_Components) + m_ComponentStates.Add(component, false); + + useGUILayout = false; + } + + void OnPreCull() + { + // All the per-frame initialization logic has to be done in OnPreCull instead of Update + // because [ImageEffectAllowedInSceneView] doesn't trigger Update events... + + m_Camera = GetComponent(); + + if (profile == null || m_Camera == null) + return; + +#if UNITY_EDITOR + // Track the scene view camera to disable some effects we don't want to see in the + // scene view + // Currently disabled effects : + // - Temporal Antialiasing + // - Depth of Field + // - Motion blur + m_RenderingInSceneView = UnityEditor.SceneView.currentDrawingSceneView != null + && UnityEditor.SceneView.currentDrawingSceneView.camera == m_Camera; +#endif + + // Prepare context + var context = m_Context.Reset(); + context.profile = profile; + context.renderTextureFactory = m_RenderTextureFactory; + context.materialFactory = m_MaterialFactory; + context.camera = m_Camera; + + // Prepare components + m_DebugViews.Init(context, profile.debugViews); + m_AmbientOcclusion.Init(context, profile.ambientOcclusion); + m_ScreenSpaceReflection.Init(context, profile.screenSpaceReflection); + m_FogComponent.Init(context, profile.fog); + m_MotionBlur.Init(context, profile.motionBlur); + m_Taa.Init(context, profile.antialiasing); + m_EyeAdaptation.Init(context, profile.eyeAdaptation); + m_DepthOfField.Init(context, profile.depthOfField); + m_Bloom.Init(context, profile.bloom); + m_ChromaticAberration.Init(context, profile.chromaticAberration); + m_ColorGrading.Init(context, profile.colorGrading); + m_UserLut.Init(context, profile.userLut); + m_Grain.Init(context, profile.grain); + m_Vignette.Init(context, profile.vignette); + m_Dithering.Init(context, profile.dithering); + m_Fxaa.Init(context, profile.antialiasing); + + // Handles profile change and 'enable' state observers + if (m_PreviousProfile != profile) + { + DisableComponents(); + m_PreviousProfile = profile; + } + + CheckObservers(); + + // Find out which camera flags are needed before rendering begins + // Note that motion vectors will only be available one frame after being enabled + var flags = context.camera.depthTextureMode; + foreach (var component in m_Components) + { + if (component.active) + flags |= component.GetCameraFlags(); + } + + context.camera.depthTextureMode = flags; + + // Temporal antialiasing jittering, needs to happen before culling + if (!m_RenderingInSceneView && m_Taa.active && !profile.debugViews.willInterrupt) + m_Taa.SetProjectionMatrix(jitteredMatrixFunc); + } + + void OnPreRender() + { + if (profile == null) + return; + + // Command buffer-based effects should be set-up here + TryExecuteCommandBuffer(m_DebugViews); + TryExecuteCommandBuffer(m_AmbientOcclusion); + TryExecuteCommandBuffer(m_ScreenSpaceReflection); + TryExecuteCommandBuffer(m_FogComponent); + + if (!m_RenderingInSceneView) + TryExecuteCommandBuffer(m_MotionBlur); + } + + void OnPostRender() + { + if (profile == null || m_Camera == null) + return; + + if (!m_RenderingInSceneView && m_Taa.active && !profile.debugViews.willInterrupt) + m_Context.camera.ResetProjectionMatrix(); + } + + // Classic render target pipeline for RT-based effects + void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (profile == null || m_Camera == null) + { + Graphics.Blit(source, destination); + return; + } + + // Uber shader setup + bool uberActive = false; + bool fxaaActive = m_Fxaa.active; + bool taaActive = m_Taa.active && !m_RenderingInSceneView; + bool dofActive = m_DepthOfField.active && !m_RenderingInSceneView; + + var uberMaterial = m_MaterialFactory.Get("Hidden/Post FX/Uber Shader"); + uberMaterial.shaderKeywords = null; + + var src = source; + var dst = destination; + + if (taaActive) + { + var tempRT = m_RenderTextureFactory.Get(src); + m_Taa.Render(src, tempRT); + src = tempRT; + } + +#if UNITY_EDITOR + // Render to a dedicated target when monitors are enabled so they can show information + // about the final render. + // At runtime the output will always be the backbuffer or whatever render target is + // currently set on the camera. + if (profile.monitors.onFrameEndEditorOnly != null) + dst = m_RenderTextureFactory.Get(src); +#endif + + Texture autoExposure = GraphicsUtils.whiteTexture; + if (m_EyeAdaptation.active) + { + uberActive = true; + autoExposure = m_EyeAdaptation.Prepare(src, uberMaterial); + } + + uberMaterial.SetTexture("_AutoExposure", autoExposure); + + if (dofActive) + { + uberActive = true; + m_DepthOfField.Prepare(src, uberMaterial, taaActive, m_Taa.jitterVector, m_Taa.model.settings.taaSettings.motionBlending); + } + + if (m_Bloom.active) + { + uberActive = true; + m_Bloom.Prepare(src, uberMaterial, autoExposure); + } + + uberActive |= TryPrepareUberImageEffect(m_ChromaticAberration, uberMaterial); + uberActive |= TryPrepareUberImageEffect(m_ColorGrading, uberMaterial); + uberActive |= TryPrepareUberImageEffect(m_Vignette, uberMaterial); + uberActive |= TryPrepareUberImageEffect(m_UserLut, uberMaterial); + + var fxaaMaterial = fxaaActive + ? m_MaterialFactory.Get("Hidden/Post FX/FXAA") + : null; + + if (fxaaActive) + { + fxaaMaterial.shaderKeywords = null; + TryPrepareUberImageEffect(m_Grain, fxaaMaterial); + TryPrepareUberImageEffect(m_Dithering, fxaaMaterial); + + if (uberActive) + { + var output = m_RenderTextureFactory.Get(src); + Graphics.Blit(src, output, uberMaterial, 0); + src = output; + } + + m_Fxaa.Render(src, dst); + } + else + { + uberActive |= TryPrepareUberImageEffect(m_Grain, uberMaterial); + uberActive |= TryPrepareUberImageEffect(m_Dithering, uberMaterial); + + if (uberActive) + { + if (!GraphicsUtils.isLinearColorSpace) + uberMaterial.EnableKeyword("UNITY_COLORSPACE_GAMMA"); + + Graphics.Blit(src, dst, uberMaterial, 0); + } + } + + if (!uberActive && !fxaaActive) + Graphics.Blit(src, dst); + +#if UNITY_EDITOR + if (profile.monitors.onFrameEndEditorOnly != null) + { + Graphics.Blit(dst, destination); + + var oldRt = RenderTexture.active; + profile.monitors.onFrameEndEditorOnly(dst); + RenderTexture.active = oldRt; + } +#endif + + m_RenderTextureFactory.ReleaseAll(); + } + + void OnGUI() + { + if (Event.current.type != EventType.Repaint) + return; + + if (profile == null || m_Camera == null) + return; + + if (m_EyeAdaptation.active && profile.debugViews.IsModeActive(DebugMode.EyeAdaptation)) + m_EyeAdaptation.OnGUI(); + else if (m_ColorGrading.active && profile.debugViews.IsModeActive(DebugMode.LogLut)) + m_ColorGrading.OnGUI(); + else if (m_UserLut.active && profile.debugViews.IsModeActive(DebugMode.UserLut)) + m_UserLut.OnGUI(); + } + + void OnDisable() + { + // Clear command buffers + foreach (var cb in m_CommandBuffers.Values) + { + m_Camera.RemoveCommandBuffer(cb.Key, cb.Value); + cb.Value.Dispose(); + } + + m_CommandBuffers.Clear(); + + // Clear components + if (profile != null) + DisableComponents(); + + m_Components.Clear(); + + // Factories + m_MaterialFactory.Dispose(); + m_RenderTextureFactory.Dispose(); + GraphicsUtils.Dispose(); + } + + public void ResetTemporalEffects() + { + m_Taa.ResetHistory(); + m_MotionBlur.ResetHistory(); + m_EyeAdaptation.ResetHistory(); + } + + #region State management + + List m_ComponentsToEnable = new List(); + List m_ComponentsToDisable = new List(); + + void CheckObservers() + { + foreach (var cs in m_ComponentStates) + { + var component = cs.Key; + var state = component.GetModel().enabled; + + if (state != cs.Value) + { + if (state) m_ComponentsToEnable.Add(component); + else m_ComponentsToDisable.Add(component); + } + } + + for (int i = 0; i < m_ComponentsToDisable.Count; i++) + { + var c = m_ComponentsToDisable[i]; + m_ComponentStates[c] = false; + c.OnDisable(); + } + + for (int i = 0; i < m_ComponentsToEnable.Count; i++) + { + var c = m_ComponentsToEnable[i]; + m_ComponentStates[c] = true; + c.OnEnable(); + } + + m_ComponentsToDisable.Clear(); + m_ComponentsToEnable.Clear(); + } + + void DisableComponents() + { + foreach (var component in m_Components) + { + var model = component.GetModel(); + if (model != null && model.enabled) + component.OnDisable(); + } + } + + #endregion + + #region Command buffer handling & rendering helpers + // Placeholders before the upcoming Scriptable Render Loop as command buffers will be + // executed on the go so we won't need of all that stuff + CommandBuffer AddCommandBuffer(CameraEvent evt, string name) + where T : PostProcessingModel + { + var cb = new CommandBuffer { name = name }; + var kvp = new KeyValuePair(evt, cb); + m_CommandBuffers.Add(typeof(T), kvp); + m_Camera.AddCommandBuffer(evt, kvp.Value); + return kvp.Value; + } + + void RemoveCommandBuffer() + where T : PostProcessingModel + { + KeyValuePair kvp; + var type = typeof(T); + + if (!m_CommandBuffers.TryGetValue(type, out kvp)) + return; + + m_Camera.RemoveCommandBuffer(kvp.Key, kvp.Value); + m_CommandBuffers.Remove(type); + kvp.Value.Dispose(); + } + + CommandBuffer GetCommandBuffer(CameraEvent evt, string name) + where T : PostProcessingModel + { + CommandBuffer cb; + KeyValuePair kvp; + + if (!m_CommandBuffers.TryGetValue(typeof(T), out kvp)) + { + cb = AddCommandBuffer(evt, name); + } + else if (kvp.Key != evt) + { + RemoveCommandBuffer(); + cb = AddCommandBuffer(evt, name); + } + else cb = kvp.Value; + + return cb; + } + + void TryExecuteCommandBuffer(PostProcessingComponentCommandBuffer component) + where T : PostProcessingModel + { + if (component.active) + { + var cb = GetCommandBuffer(component.GetCameraEvent(), component.GetName()); + cb.Clear(); + component.PopulateCommandBuffer(cb); + } + else RemoveCommandBuffer(); + } + + bool TryPrepareUberImageEffect(PostProcessingComponentRenderTexture component, Material material) + where T : PostProcessingModel + { + if (!component.active) + return false; + + component.Prepare(material); + return true; + } + + T AddComponent(T component) + where T : PostProcessingComponentBase + { + m_Components.Add(component); + return component; + } + + #endregion + } +} diff --git a/Assets/PostProcessing/Runtime/PostProcessingBehaviour.cs.meta b/Assets/PostProcessing/Runtime/PostProcessingBehaviour.cs.meta new file mode 100644 index 0000000..83a2728 --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingBehaviour.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ff26db721962cdf4a8edcdfa9a767d2a +timeCreated: 1459757354 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/PostProcessingComponent.cs b/Assets/PostProcessing/Runtime/PostProcessingComponent.cs new file mode 100644 index 0000000..c3c0d7d --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingComponent.cs @@ -0,0 +1,58 @@ +using UnityEngine.Rendering; + +namespace UnityEngine.PostProcessing +{ + public abstract class PostProcessingComponentBase + { + public PostProcessingContext context; + + public virtual DepthTextureMode GetCameraFlags() + { + return DepthTextureMode.None; + } + + public abstract bool active { get; } + + public virtual void OnEnable() + {} + + public virtual void OnDisable() + {} + + public abstract PostProcessingModel GetModel(); + } + + public abstract class PostProcessingComponent : PostProcessingComponentBase + where T : PostProcessingModel + { + public T model { get; internal set; } + + public virtual void Init(PostProcessingContext pcontext, T pmodel) + { + context = pcontext; + model = pmodel; + } + + public override PostProcessingModel GetModel() + { + return model; + } + } + + public abstract class PostProcessingComponentCommandBuffer : PostProcessingComponent + where T : PostProcessingModel + { + public abstract CameraEvent GetCameraEvent(); + + public abstract string GetName(); + + public abstract void PopulateCommandBuffer(CommandBuffer cb); + } + + public abstract class PostProcessingComponentRenderTexture : PostProcessingComponent + where T : PostProcessingModel + { + public virtual void Prepare(Material material) + {} + } +} diff --git a/Assets/PostProcessing/Runtime/PostProcessingComponent.cs.meta b/Assets/PostProcessing/Runtime/PostProcessingComponent.cs.meta new file mode 100644 index 0000000..5f5b760 --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ef3277e9c14f78546a1ecaab0d293b77 +timeCreated: 1473009349 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/PostProcessingContext.cs b/Assets/PostProcessing/Runtime/PostProcessingContext.cs new file mode 100644 index 0000000..dba51ed --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingContext.cs @@ -0,0 +1,60 @@ +namespace UnityEngine.PostProcessing +{ + public class PostProcessingContext + { + public PostProcessingProfile profile; + public Camera camera; + + public MaterialFactory materialFactory; + public RenderTextureFactory renderTextureFactory; + + public bool interrupted { get; private set; } + + public void Interrupt() + { + interrupted = true; + } + + public PostProcessingContext Reset() + { + profile = null; + camera = null; + materialFactory = null; + renderTextureFactory = null; + interrupted = false; + return this; + } + + #region Helpers + public bool isGBufferAvailable + { + get { return camera.actualRenderingPath == RenderingPath.DeferredShading; } + } + + public bool isHdr + { + // No UNITY_5_6_OR_NEWER defined in early betas of 5.6 +#if UNITY_5_6 || UNITY_5_6_OR_NEWER + get { return camera.allowHDR; } +#else + get { return camera.hdr; } +#endif + } + + public int width + { + get { return camera.pixelWidth; } + } + + public int height + { + get { return camera.pixelHeight; } + } + + public Rect viewport + { + get { return camera.rect; } // Normalized coordinates + } + #endregion + } +} diff --git a/Assets/PostProcessing/Runtime/PostProcessingContext.cs.meta b/Assets/PostProcessing/Runtime/PostProcessingContext.cs.meta new file mode 100644 index 0000000..c9260be --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingContext.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 63da4b6536f11834fa026e327087bd7b +timeCreated: 1467630780 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/PostProcessingModel.cs b/Assets/PostProcessing/Runtime/PostProcessingModel.cs new file mode 100644 index 0000000..69f5095 --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingModel.cs @@ -0,0 +1,27 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + [Serializable] + public abstract class PostProcessingModel + { + [SerializeField, GetSet("enabled")] + bool m_Enabled; + public bool enabled + { + get { return m_Enabled; } + set + { + m_Enabled = value; + + if (value) + OnValidate(); + } + } + + public abstract void Reset(); + + public virtual void OnValidate() + {} + } +} diff --git a/Assets/PostProcessing/Runtime/PostProcessingModel.cs.meta b/Assets/PostProcessing/Runtime/PostProcessingModel.cs.meta new file mode 100644 index 0000000..8c69aa8 --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingModel.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 28413153a26e53342baf1a7b2c3711c3 +timeCreated: 1466586474 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/PostProcessingProfile.cs b/Assets/PostProcessing/Runtime/PostProcessingProfile.cs new file mode 100644 index 0000000..2628a58 --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingProfile.cs @@ -0,0 +1,68 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + public class PostProcessingProfile : ScriptableObject + { + #pragma warning disable 0169 // "field x is never used" + + public BuiltinDebugViewsModel debugViews = new BuiltinDebugViewsModel(); + public FogModel fog = new FogModel(); + public AntialiasingModel antialiasing = new AntialiasingModel(); + public AmbientOcclusionModel ambientOcclusion = new AmbientOcclusionModel(); + public ScreenSpaceReflectionModel screenSpaceReflection = new ScreenSpaceReflectionModel(); + public DepthOfFieldModel depthOfField = new DepthOfFieldModel(); + public MotionBlurModel motionBlur = new MotionBlurModel(); + public EyeAdaptationModel eyeAdaptation = new EyeAdaptationModel(); + public BloomModel bloom = new BloomModel(); + public ColorGradingModel colorGrading = new ColorGradingModel(); + public UserLutModel userLut = new UserLutModel(); + public ChromaticAberrationModel chromaticAberration = new ChromaticAberrationModel(); + public GrainModel grain = new GrainModel(); + public VignetteModel vignette = new VignetteModel(); + public DitheringModel dithering = new DitheringModel(); + +#if UNITY_EDITOR + // Monitor settings + [Serializable] + public class MonitorSettings + { + // Callback used in the editor to grab the rendered frame and sent it to monitors + public Action onFrameEndEditorOnly; + + // Global + public int currentMonitorID = 0; + public bool refreshOnPlay = false; + + // Histogram + public enum HistogramMode + { + Red = 0, + Green = 1, + Blue = 2, + Luminance = 3, + RGBMerged, + RGBSplit + } + + public HistogramMode histogramMode = HistogramMode.Luminance; + + // Waveform + public float waveformExposure = 0.12f; + public bool waveformY = false; + public bool waveformR = true; + public bool waveformG = true; + public bool waveformB = true; + + // Parade + public float paradeExposure = 0.12f; + + // Vectorscope + public float vectorscopeExposure = 0.12f; + public bool vectorscopeShowBackground = true; + } + + public MonitorSettings monitors = new MonitorSettings(); +#endif + } +} diff --git a/Assets/PostProcessing/Runtime/PostProcessingProfile.cs.meta b/Assets/PostProcessing/Runtime/PostProcessingProfile.cs.meta new file mode 100644 index 0000000..0f12db7 --- /dev/null +++ b/Assets/PostProcessing/Runtime/PostProcessingProfile.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8a3bdb2cd68f901469e7cc149151eb49 +timeCreated: 1459756301 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Utils.meta b/Assets/PostProcessing/Runtime/Utils.meta new file mode 100644 index 0000000..9913315 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 18fb6a6b698945843a16c2d0111a7af2 +folderAsset: yes +timeCreated: 1459945070 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Utils/ColorGradingCurve.cs b/Assets/PostProcessing/Runtime/Utils/ColorGradingCurve.cs new file mode 100644 index 0000000..da75978 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/ColorGradingCurve.cs @@ -0,0 +1,64 @@ +using System; + +namespace UnityEngine.PostProcessing +{ + // Small wrapper on top of AnimationCurve to handle zero-key curves and keyframe looping + + [Serializable] + public sealed class ColorGradingCurve + { + public AnimationCurve curve; + + [SerializeField] + bool m_Loop; + + [SerializeField] + float m_ZeroValue; + + [SerializeField] + float m_Range; + + AnimationCurve m_InternalLoopingCurve; + + public ColorGradingCurve(AnimationCurve curve, float zeroValue, bool loop, Vector2 bounds) + { + this.curve = curve; + m_ZeroValue = zeroValue; + m_Loop = loop; + m_Range = bounds.magnitude; + } + + public void Cache() + { + if (!m_Loop) + return; + + var length = curve.length; + + if (length < 2) + return; + + if (m_InternalLoopingCurve == null) + m_InternalLoopingCurve = new AnimationCurve(); + + var prev = curve[length - 1]; + prev.time -= m_Range; + var next = curve[0]; + next.time += m_Range; + m_InternalLoopingCurve.keys = curve.keys; + m_InternalLoopingCurve.AddKey(prev); + m_InternalLoopingCurve.AddKey(next); + } + + public float Evaluate(float t) + { + if (curve.length == 0) + return m_ZeroValue; + + if (!m_Loop || curve.length == 1) + return curve.Evaluate(t); + + return m_InternalLoopingCurve.Evaluate(t); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Utils/ColorGradingCurve.cs.meta b/Assets/PostProcessing/Runtime/Utils/ColorGradingCurve.cs.meta new file mode 100644 index 0000000..78b6b6f --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/ColorGradingCurve.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1bb6f2275f7eff940b6f0d72681e7877 +timeCreated: 1473847739 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Utils/GraphicsUtils.cs b/Assets/PostProcessing/Runtime/Utils/GraphicsUtils.cs new file mode 100644 index 0000000..5e428c0 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/GraphicsUtils.cs @@ -0,0 +1,144 @@ +namespace UnityEngine.PostProcessing +{ + using UnityObject = Object; + + public static class GraphicsUtils + { + public static bool isLinearColorSpace + { + get { return QualitySettings.activeColorSpace == ColorSpace.Linear; } + } + + public static bool supportsDX11 + { +#if UNITY_WEBGL + get { return false; } +#else + get { return SystemInfo.graphicsShaderLevel >= 50 && SystemInfo.supportsComputeShaders; } +#endif + } + + static Texture2D s_WhiteTexture; + public static Texture2D whiteTexture + { + get + { + if (s_WhiteTexture != null) + return s_WhiteTexture; + + s_WhiteTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false); + s_WhiteTexture.SetPixel(0, 0, new Color(1f, 1f, 1f, 1f)); + s_WhiteTexture.Apply(); + + return s_WhiteTexture; + } + } + + static Mesh s_Quad; + public static Mesh quad + { + get + { + if (s_Quad != null) + return s_Quad; + + var vertices = new[] + { + new Vector3(-1f, -1f, 0f), + new Vector3( 1f, 1f, 0f), + new Vector3( 1f, -1f, 0f), + new Vector3(-1f, 1f, 0f) + }; + + var uvs = new[] + { + new Vector2(0f, 0f), + new Vector2(1f, 1f), + new Vector2(1f, 0f), + new Vector2(0f, 1f) + }; + + var indices = new[] { 0, 1, 2, 1, 0, 3 }; + + s_Quad = new Mesh + { + vertices = vertices, + uv = uvs, + triangles = indices + }; + s_Quad.RecalculateNormals(); + s_Quad.RecalculateBounds(); + + return s_Quad; + } + } + + // Useful when rendering to MRT + public static void Blit(Material material, int pass) + { + GL.PushMatrix(); + { + GL.LoadOrtho(); + + material.SetPass(pass); + + GL.Begin(GL.TRIANGLE_STRIP); + { + GL.TexCoord2(0f, 0f); GL.Vertex3(0f, 0f, 0.1f); + GL.TexCoord2(1f, 0f); GL.Vertex3(1f, 0f, 0.1f); + GL.TexCoord2(0f, 1f); GL.Vertex3(0f, 1f, 0.1f); + GL.TexCoord2(1f, 1f); GL.Vertex3(1f, 1f, 0.1f); + } + GL.End(); + } + GL.PopMatrix(); + } + + public static void ClearAndBlit(Texture source, RenderTexture destination, Material material, int pass, bool clearColor = true, bool clearDepth = false) + { + var oldRT = RenderTexture.active; + RenderTexture.active = destination; + + GL.Clear(false, clearColor, Color.clear); + GL.PushMatrix(); + { + GL.LoadOrtho(); + + material.SetTexture("_MainTex", source); + material.SetPass(pass); + + GL.Begin(GL.TRIANGLE_STRIP); + { + GL.TexCoord2(0f, 0f); GL.Vertex3(0f, 0f, 0.1f); + GL.TexCoord2(1f, 0f); GL.Vertex3(1f, 0f, 0.1f); + GL.TexCoord2(0f, 1f); GL.Vertex3(0f, 1f, 0.1f); + GL.TexCoord2(1f, 1f); GL.Vertex3(1f, 1f, 0.1f); + } + GL.End(); + } + GL.PopMatrix(); + + RenderTexture.active = oldRT; + } + + public static void Destroy(UnityObject obj) + { + if (obj != null) + { +#if UNITY_EDITOR + if (Application.isPlaying) + UnityObject.Destroy(obj); + else + UnityObject.DestroyImmediate(obj); +#else + UnityObject.Destroy(obj); +#endif + } + } + + public static void Dispose() + { + Destroy(s_Quad); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Utils/GraphicsUtils.cs.meta b/Assets/PostProcessing/Runtime/Utils/GraphicsUtils.cs.meta new file mode 100644 index 0000000..1b1d3e1 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/GraphicsUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f40f0a1acf6ce2f419f2b71c667e8973 +timeCreated: 1467635425 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Utils/MaterialFactory.cs b/Assets/PostProcessing/Runtime/Utils/MaterialFactory.cs new file mode 100644 index 0000000..fa5eee7 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/MaterialFactory.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; + +namespace UnityEngine.PostProcessing +{ + using UnityObject = Object; + + public sealed class MaterialFactory : IDisposable + { + Dictionary m_Materials; + + public MaterialFactory() + { + m_Materials = new Dictionary(); + } + + public Material Get(string shaderName) + { + Material material; + + if (!m_Materials.TryGetValue(shaderName, out material)) + { + var shader = Shader.Find(shaderName); + + if (shader == null) + throw new ArgumentException(string.Format("Shader not found ({0})", shaderName)); + + material = new Material(shader) + { + name = string.Format("PostFX - {0}", shaderName.Substring(shaderName.LastIndexOf("/") + 1)), + hideFlags = HideFlags.DontSave + }; + + m_Materials.Add(shaderName, material); + } + + return material; + } + + public void Dispose() + { + var enumerator = m_Materials.GetEnumerator(); + while (enumerator.MoveNext()) + { + var material = enumerator.Current.Value; + GraphicsUtils.Destroy(material); + } + + m_Materials.Clear(); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Utils/MaterialFactory.cs.meta b/Assets/PostProcessing/Runtime/Utils/MaterialFactory.cs.meta new file mode 100644 index 0000000..ee39c48 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/MaterialFactory.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 594fad000c373f746864717c588e1815 +timeCreated: 1466586851 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Runtime/Utils/RenderTextureFactory.cs b/Assets/PostProcessing/Runtime/Utils/RenderTextureFactory.cs new file mode 100644 index 0000000..a386473 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/RenderTextureFactory.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; + +namespace UnityEngine.PostProcessing +{ + public sealed class RenderTextureFactory : IDisposable + { + HashSet m_TemporaryRTs; + + public RenderTextureFactory() + { + m_TemporaryRTs = new HashSet(); + } + + public RenderTexture Get(RenderTexture baseRenderTexture) + { + return Get( + baseRenderTexture.width, + baseRenderTexture.height, + baseRenderTexture.depth, + baseRenderTexture.format, + baseRenderTexture.sRGB ? RenderTextureReadWrite.sRGB : RenderTextureReadWrite.Linear, + baseRenderTexture.filterMode, + baseRenderTexture.wrapMode + ); + } + + public RenderTexture Get(int width, int height, int depthBuffer = 0, RenderTextureFormat format = RenderTextureFormat.ARGBHalf, RenderTextureReadWrite rw = RenderTextureReadWrite.Default, FilterMode filterMode = FilterMode.Bilinear, TextureWrapMode wrapMode = TextureWrapMode.Clamp, string name = "FactoryTempTexture") + { + var rt = RenderTexture.GetTemporary(width, height, depthBuffer, format, rw); // add forgotten param rw + rt.filterMode = filterMode; + rt.wrapMode = wrapMode; + rt.name = name; + m_TemporaryRTs.Add(rt); + return rt; + } + + public void Release(RenderTexture rt) + { + if (rt == null) + return; + + if (!m_TemporaryRTs.Contains(rt)) + throw new ArgumentException(string.Format("Attempting to remove a RenderTexture that was not allocated: {0}", rt)); + + m_TemporaryRTs.Remove(rt); + RenderTexture.ReleaseTemporary(rt); + } + + public void ReleaseAll() + { + var enumerator = m_TemporaryRTs.GetEnumerator(); + while (enumerator.MoveNext()) + RenderTexture.ReleaseTemporary(enumerator.Current); + + m_TemporaryRTs.Clear(); + } + + public void Dispose() + { + ReleaseAll(); + } + } +} diff --git a/Assets/PostProcessing/Runtime/Utils/RenderTextureFactory.cs.meta b/Assets/PostProcessing/Runtime/Utils/RenderTextureFactory.cs.meta new file mode 100644 index 0000000..3144dd0 --- /dev/null +++ b/Assets/PostProcessing/Runtime/Utils/RenderTextureFactory.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aec5694806c4d75449e231cfae69c329 +timeCreated: 1467361102 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures.meta b/Assets/PostProcessing/Textures.meta new file mode 100644 index 0000000..8a9ab77 --- /dev/null +++ b/Assets/PostProcessing/Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e15c29a7abfa52743a8cb7714389c3c7 +folderAsset: yes +timeCreated: 1466585230 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/LUTs.meta b/Assets/PostProcessing/Textures/LUTs.meta new file mode 100644 index 0000000..1f94f0c --- /dev/null +++ b/Assets/PostProcessing/Textures/LUTs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 499867e2df2e54e4aad0b9333221f875 +folderAsset: yes +timeCreated: 1473255405 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/LUTs/NeutralLUT_16.png b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_16.png new file mode 100644 index 0000000..0e4bda4 Binary files /dev/null and b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_16.png differ diff --git a/Assets/PostProcessing/Textures/LUTs/NeutralLUT_16.png.meta b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_16.png.meta new file mode 100644 index 0000000..acc4700 --- /dev/null +++ b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_16.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: e45483e270a314c4bbc6e317771d56ab +timeCreated: 1463066524 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 0 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/LUTs/NeutralLUT_32.png b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_32.png new file mode 100644 index 0000000..b8724d4 Binary files /dev/null and b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_32.png differ diff --git a/Assets/PostProcessing/Textures/LUTs/NeutralLUT_32.png.meta b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_32.png.meta new file mode 100644 index 0000000..56dc3f6 --- /dev/null +++ b/Assets/PostProcessing/Textures/LUTs/NeutralLUT_32.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 4f98e9c96c8a48541b5eb704e92d99b8 +timeCreated: 1463066534 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 0 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Lens Dirt.meta b/Assets/PostProcessing/Textures/Lens Dirt.meta new file mode 100644 index 0000000..1efaa7c --- /dev/null +++ b/Assets/PostProcessing/Textures/Lens Dirt.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 705e7922061713741885ae52a3e0bea4 +folderAsset: yes +timeCreated: 1472737148 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt00.png b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt00.png new file mode 100644 index 0000000..d90b8c0 Binary files /dev/null and b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt00.png differ diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt00.png.meta b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt00.png.meta new file mode 100644 index 0000000..4cc6293 --- /dev/null +++ b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt00.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 69e847bbff1cf5449a4ee0bbd045dbc9 +timeCreated: 1472572785 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 4096 + textureSettings: + filterMode: -1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt01.png b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt01.png new file mode 100644 index 0000000..eb9efb6 Binary files /dev/null and b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt01.png differ diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt01.png.meta b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt01.png.meta new file mode 100644 index 0000000..c907d8e --- /dev/null +++ b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt01.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3884f7a2d04ffe8409ad9200b275896f +timeCreated: 1472551546 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 4096 + textureSettings: + filterMode: -1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt02.png b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt02.png new file mode 100644 index 0000000..bc52c2a Binary files /dev/null and b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt02.png differ diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt02.png.meta b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt02.png.meta new file mode 100644 index 0000000..f1fd71d --- /dev/null +++ b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt02.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a2960ffde020f27409e070d92fb2e00b +timeCreated: 1472632371 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 4096 + textureSettings: + filterMode: -1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt03.png b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt03.png new file mode 100644 index 0000000..7ccd8af Binary files /dev/null and b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt03.png differ diff --git a/Assets/PostProcessing/Textures/Lens Dirt/LensDirt03.png.meta b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt03.png.meta new file mode 100644 index 0000000..6ba9a3e --- /dev/null +++ b/Assets/PostProcessing/Textures/Lens Dirt/LensDirt03.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7a051dbda2d7bc447bee412427cd311e +timeCreated: 1472641925 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 4096 + textureSettings: + filterMode: -1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Spectral LUTs.meta b/Assets/PostProcessing/Textures/Spectral LUTs.meta new file mode 100644 index 0000000..833d265 --- /dev/null +++ b/Assets/PostProcessing/Textures/Spectral LUTs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 67d9249960fda4c41b0a23a65573a8a2 +folderAsset: yes +timeCreated: 1473255405 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_BlueRed.tga b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_BlueRed.tga new file mode 100644 index 0000000..81828f5 Binary files /dev/null and b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_BlueRed.tga differ diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_BlueRed.tga.meta b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_BlueRed.tga.meta new file mode 100644 index 0000000..f47c5b8 --- /dev/null +++ b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_BlueRed.tga.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 318cbcd94840f1d48aca4d86234dc2e7 +timeCreated: 1473255656 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_GreenPurple.tga b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_GreenPurple.tga new file mode 100644 index 0000000..4dd4db7 Binary files /dev/null and b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_GreenPurple.tga differ diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_GreenPurple.tga.meta b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_GreenPurple.tga.meta new file mode 100644 index 0000000..1bec2a9 --- /dev/null +++ b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_GreenPurple.tga.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 4a8f054acfbd08043a931cd22760758d +timeCreated: 1473255985 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_PurpleGreen.tga b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_PurpleGreen.tga new file mode 100644 index 0000000..d67304c Binary files /dev/null and b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_PurpleGreen.tga differ diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_PurpleGreen.tga.meta b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_PurpleGreen.tga.meta new file mode 100644 index 0000000..1077fda --- /dev/null +++ b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_PurpleGreen.tga.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 42183971d24cfe443a346e7ec6e83bbb +timeCreated: 1473256088 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_RedBlue.tga b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_RedBlue.tga new file mode 100644 index 0000000..43cd826 Binary files /dev/null and b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_RedBlue.tga differ diff --git a/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_RedBlue.tga.meta b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_RedBlue.tga.meta new file mode 100644 index 0000000..fbe39ef --- /dev/null +++ b/Assets/PostProcessing/Textures/Spectral LUTs/SpectralLut_RedBlue.tga.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: ff5f3317371838d4fa16ac6c2acf2040 +timeCreated: 1473255656 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 1 + aniso: 0 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities.meta b/Assets/PostProcessing/Utilities.meta new file mode 100644 index 0000000..773a311 --- /dev/null +++ b/Assets/PostProcessing/Utilities.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 478d405e757b044f2bd9c4b777026b7e +folderAsset: yes +timeCreated: 1487339997 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture.meta new file mode 100644 index 0000000..3c30e83 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5b271143f6e834d6bb7a4309f2c781f2 +folderAsset: yes +timeCreated: 1487339997 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset b/Assets/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset new file mode 100644 index 0000000..16f736d Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset.meta new file mode 100644 index 0000000..f639d36 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/CustomMotionVectorDebugProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d982e879ff67b4d3fb6522d08c3cd5af +timeCreated: 1487341088 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity new file mode 100644 index 0000000..dac8063 Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity.meta new file mode 100644 index 0000000..a7b435d --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleScene.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed3a9f41209f84f6db99e07013da9628 +timeCreated: 1487347827 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleWheelController.cs b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleWheelController.cs new file mode 100644 index 0000000..a8bf34a --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleWheelController.cs @@ -0,0 +1,33 @@ +using UnityEngine; + +public class ExampleWheelController : MonoBehaviour +{ + public float acceleration; + public Renderer motionVectorRenderer; // Reference to the custom motion vector renderer + + Rigidbody m_Rigidbody; + + static class Uniforms + { + internal static readonly int _MotionAmount = Shader.PropertyToID("_MotionAmount"); + } + + void Start() + { + m_Rigidbody = GetComponent(); // Get reference to rigidbody + m_Rigidbody.maxAngularVelocity = 100; // Set max velocity for rigidbody + } + + void Update() + { + if (Input.GetKey (KeyCode.UpArrow)) // Rotate forward + m_Rigidbody.AddRelativeTorque(new Vector3(-1 * acceleration, 0, 0), ForceMode.Acceleration); // Add forward torque to mesh + else if (Input.GetKey (KeyCode.DownArrow)) // Rotate backward + m_Rigidbody.AddRelativeTorque(new Vector3(1 * acceleration, 0, 0), ForceMode.Acceleration); // Add backward torque to mesh + + float m = -m_Rigidbody.angularVelocity.x / 100; // Calculate multiplier for motion vector texture + + if (motionVectorRenderer) // If the custom motion vector texture renderer exists + motionVectorRenderer.material.SetFloat(Uniforms._MotionAmount, Mathf.Clamp(m, -0.25f, 0.25f)); // Set the multiplier on the renderer's material + } +} diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleWheelController.cs.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleWheelController.cs.meta new file mode 100644 index 0000000..9de9795 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/ExampleWheelController.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 840c928746809454cb5b9309b640dbd7 +timeCreated: 1479836093 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials.meta new file mode 100644 index 0000000..331a58e --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c4b2008f2662a41e587c4351609053c4 +folderAsset: yes +timeCreated: 1487340121 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat new file mode 100644 index 0000000..9bf45d9 Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat.meta new file mode 100644 index 0000000..fe3fd6a --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugMotionVectors.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7daeefbca4f14360bac0e1df1bdacd4 +timeCreated: 1479896287 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat new file mode 100644 index 0000000..e84b61c Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat.meta new file mode 100644 index 0000000..6ff4823 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/DebugQuad.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3c40c8fdc50a841579d7cb15882ac9d9 +timeCreated: 1479896287 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/UVChecker.mat b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/UVChecker.mat new file mode 100644 index 0000000..7800a04 Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/UVChecker.mat differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/UVChecker.mat.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/UVChecker.mat.meta new file mode 100644 index 0000000..e1c15c6 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/UVChecker.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 944463113244f4bf8b05c1757cd838a4 +timeCreated: 1487340121 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat new file mode 100644 index 0000000..016bd0e Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat.meta new file mode 100644 index 0000000..c1cb3b0 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Materials/WheelMotionVectors.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 055f7217f136349d9b68e82b9e987dae +timeCreated: 1479896287 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Models.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Models.meta new file mode 100644 index 0000000..2d28251 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Models.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ef5ce588de3614b39b5ba7b0613cbe43 +folderAsset: yes +timeCreated: 1487348152 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Models/WheelMovecs.FBX b/Assets/PostProcessing/Utilities/CustomMotionTexture/Models/WheelMovecs.FBX new file mode 100644 index 0000000..d8f6b35 Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Models/WheelMovecs.FBX differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Models/WheelMovecs.FBX.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Models/WheelMovecs.FBX.meta new file mode 100644 index 0000000..a616e6d --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Models/WheelMovecs.FBX.meta @@ -0,0 +1,81 @@ +fileFormatVersion: 2 +guid: c4abfbff3b9d442f4b435849d2d2124c +timeCreated: 1479895866 +licenseType: Pro +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2300000: //RootNode + 3300000: //RootNode + 4300000: Object + 9500000: //RootNode + materials: + importMaterials: 0 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 0 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders.meta new file mode 100644 index 0000000..4dd7311 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8e565c240745c49628f96f0573adfa76 +folderAsset: yes +timeCreated: 1487348368 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders/CustomMotionVectorTexture.shader b/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders/CustomMotionVectorTexture.shader new file mode 100644 index 0000000..b966815 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders/CustomMotionVectorTexture.shader @@ -0,0 +1,70 @@ +Shader "Post Processing/Custom Motion Vector Texture" +{ + Properties + { + _MotionTex ("Motion Vector Texture", 2D) = "black" {} + _MotionAmount ("Motion Vector Multiplier", range (-0.25, 0.25)) = 0 + } + SubShader + { + Pass + { + Name "Motion Vectors" + Tags { "LightMode" = "MotionVectors" } + + ZTest LEqual Cull Back ZWrite On + + CGPROGRAM + + #pragma vertex vert + #pragma fragment FragMotionVectors + #include "UnityCG.cginc" + + float4 _MotionValue; + sampler2D _MotionTex; + float4 _MotionTex_ST; + float _MotionAmount; + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float3 normal : NORMAL; + float4 tangent : TANGENT; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 transposedTangent : TEXCOORD1; + }; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MotionTex); + o.normal = UnityObjectToClipPos(v.normal); + o.normal = o.normal * 0.5 + 0.5; + o.tangent = mul(UNITY_MATRIX_MV, v.tangent); + o.transposedTangent = (mul(UNITY_MATRIX_IT_MV, v.tangent)) * 0.5 + 0.5; + return o; + } + + float4 FragMotionVectors(v2f i) : SV_Target + { + half4 c = tex2D(_MotionTex, i.uv); + c.rg = (c.rg * 2.0 - 1.0) * _MotionAmount; // Using color texture so need to make 0.5 neutral + half4 t1 = i.tangent * 0.005; // Sides of tire + half4 t2 = c * float4(i.transposedTangent.r * 2.0, i.transposedTangent.g * 2.0, 0.0, 1.0); // Front of tire + half4 t3 = lerp(t2, t1, c.b); // Lerp between front and side of tire + return t3 * _MotionAmount; + } + + ENDCG + } + } +} diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders/CustomMotionVectorTexture.shader.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders/CustomMotionVectorTexture.shader.meta new file mode 100644 index 0000000..448c62d --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Shaders/CustomMotionVectorTexture.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9189229324e2342b8b69f7c1904dceba +timeCreated: 1479826273 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures.meta new file mode 100644 index 0000000..6a7c156 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 92c42dce939f844cea2248583e06bd55 +folderAsset: yes +timeCreated: 1487348131 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/DebugMotionVectors.png b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/DebugMotionVectors.png new file mode 100644 index 0000000..4c32bd5 Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/DebugMotionVectors.png differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/DebugMotionVectors.png.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/DebugMotionVectors.png.meta new file mode 100644 index 0000000..bc948c8 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/DebugMotionVectors.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3aac3087967ea4fae858ec0494fd24d9 +timeCreated: 1479828550 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/UVChecker.png b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/UVChecker.png new file mode 100644 index 0000000..39442e6 Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/UVChecker.png differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/UVChecker.png.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/UVChecker.png.meta new file mode 100644 index 0000000..82df755 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/UVChecker.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: a08960dd6e8274e7f8fca616e09c48ed +timeCreated: 1487340672 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/WheelMotionVectors.png b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/WheelMotionVectors.png new file mode 100644 index 0000000..175836d Binary files /dev/null and b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/WheelMotionVectors.png differ diff --git a/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/WheelMotionVectors.png.meta b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/WheelMotionVectors.png.meta new file mode 100644 index 0000000..f794096 --- /dev/null +++ b/Assets/PostProcessing/Utilities/CustomMotionTexture/Textures/WheelMotionVectors.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: d1cc06458fe724df8837423c0a2f8f93 +timeCreated: 1487348028 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene.meta b/Assets/SEGI/Demo Scene.meta new file mode 100644 index 0000000..52a2b77 --- /dev/null +++ b/Assets/SEGI/Demo Scene.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 40179eb5518caa642b27dfbca905e94c +folderAsset: yes +timeCreated: 1465533948 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials.meta b/Assets/SEGI/Demo Scene/Materials.meta new file mode 100644 index 0000000..28e9c56 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7de833706de4417468d442e12a68e4e3 +folderAsset: yes +timeCreated: 1465534091 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Cabin Roof.mat b/Assets/SEGI/Demo Scene/Materials/Cabin Roof.mat new file mode 100644 index 0000000..ec9c754 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Cabin Roof.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Cabin Roof + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.38235295, g: 0.38235295, b: 0.38235295, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Cabin Roof.mat.meta b/Assets/SEGI/Demo Scene/Materials/Cabin Roof.mat.meta new file mode 100644 index 0000000..7c1a99e --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Cabin Roof.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8199f9274ac65d246b852eeb901e322c +timeCreated: 1451896066 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Cabin Windows.mat b/Assets/SEGI/Demo Scene/Materials/Cabin Windows.mat new file mode 100644 index 0000000..5ae8aca --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Cabin Windows.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Cabin Windows + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.102941155, g: 0.102941155, b: 0.102941155, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Cabin Windows.mat.meta b/Assets/SEGI/Demo Scene/Materials/Cabin Windows.mat.meta new file mode 100644 index 0000000..ed4ecfa --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Cabin Windows.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 66098619b47b8a8469e9f5fd1d106050 +timeCreated: 1451896030 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/CaveOccluder.mat b/Assets/SEGI/Demo Scene/Materials/CaveOccluder.mat new file mode 100644 index 0000000..3691d1b --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/CaveOccluder.mat @@ -0,0 +1,118 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: CaveOccluder + m_Shader: {fileID: 4800000, guid: 9313768e78db9694bbe5e6a14ecbc4a6, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: 2000 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BlockerValue + second: 20 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Glossiness + second: 0 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/CaveOccluder.mat.meta b/Assets/SEGI/Demo Scene/Materials/CaveOccluder.mat.meta new file mode 100644 index 0000000..8b00b6c --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/CaveOccluder.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7200bf42318ffbe4b9b71e4a48027d5e +timeCreated: 1452134006 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/CaveOccluderSunlight.mat b/Assets/SEGI/Demo Scene/Materials/CaveOccluderSunlight.mat new file mode 100644 index 0000000..42b81da --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/CaveOccluderSunlight.mat @@ -0,0 +1,130 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: CaveOccluderSunlight + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BlockerValue + second: 9.6 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.006, g: 0.006, b: 0.006, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/CaveOccluderSunlight.mat.meta b/Assets/SEGI/Demo Scene/Materials/CaveOccluderSunlight.mat.meta new file mode 100644 index 0000000..c37335a --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/CaveOccluderSunlight.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f76593ecbe727c947b3a6cf0c4edd934 +timeCreated: 1452514781 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Crystal.mat b/Assets/SEGI/Demo Scene/Materials/Crystal.mat new file mode 100644 index 0000000..9c7f78c --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Crystal.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Crystal + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.751 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0.596 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.71323526, g: 1, b: 0.96440166, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Crystal.mat.meta b/Assets/SEGI/Demo Scene/Materials/Crystal.mat.meta new file mode 100644 index 0000000..2010e52 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Crystal.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1aeca982fc963c4bb910c14a2462f05 +timeCreated: 1424670015 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/GlowingCrystal.mat b/Assets/SEGI/Demo Scene/Materials/GlowingCrystal.mat new file mode 100644 index 0000000..095c138 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/GlowingCrystal.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: GlowingCrystal + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.932 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.1397059, g: 0.1397059, b: 0.1397059, a: 1} + - first: + name: _EmissionColor + second: {r: 1, g: 0.7257606, b: 0.23529398, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/GlowingCrystal.mat.meta b/Assets/SEGI/Demo Scene/Materials/GlowingCrystal.mat.meta new file mode 100644 index 0000000..f953595 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/GlowingCrystal.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3bc33ff78e3ff3e48b2e7aea7c27c072 +timeCreated: 1452063947 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Gold.mat b/Assets/SEGI/Demo Scene/Materials/Gold.mat new file mode 100644 index 0000000..b50745b --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Gold.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Gold + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.58 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 1 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.1544118, g: 0.6501014, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Gold.mat.meta b/Assets/SEGI/Demo Scene/Materials/Gold.mat.meta new file mode 100644 index 0000000..b15a980 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Gold.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e5cb26d4baa613442968b28bc2730634 +timeCreated: 1451976362 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Grass.mat b/Assets/SEGI/Demo Scene/Materials/Grass.mat new file mode 100644 index 0000000..64c58eb --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Grass.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Grass + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 10, y: 10} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 10, y: 10} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.47267628, g: 0.5588235, b: 0.16846877, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Grass.mat.meta b/Assets/SEGI/Demo Scene/Materials/Grass.mat.meta new file mode 100644 index 0000000..ffb433c --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Grass.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf749d0050f23f140b3c993d2a03f6e5 +timeCreated: 1451781295 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/PineBark.mat b/Assets/SEGI/Demo Scene/Materials/PineBark.mat new file mode 100644 index 0000000..164e3f3 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/PineBark.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: PineBark + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.4705882, g: 0.41928044, b: 0.39446363, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/PineBark.mat.meta b/Assets/SEGI/Demo Scene/Materials/PineBark.mat.meta new file mode 100644 index 0000000..03d457f --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/PineBark.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4135376286d609a4fb2ae1a55875d790 +timeCreated: 1424674223 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/PineLeaves.mat b/Assets/SEGI/Demo Scene/Materials/PineLeaves.mat new file mode 100644 index 0000000..f1c1bd3 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/PineLeaves.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: PineLeaves + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.31919816, g: 0.4705882, b: 0.29065743, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/PineLeaves.mat.meta b/Assets/SEGI/Demo Scene/Materials/PineLeaves.mat.meta new file mode 100644 index 0000000..fc86347 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/PineLeaves.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 302cd7cea389af1468f947b57e4e6c41 +timeCreated: 1424674223 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/PineWoodBare.mat b/Assets/SEGI/Demo Scene/Materials/PineWoodBare.mat new file mode 100644 index 0000000..af39c25 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/PineWoodBare.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: PineWoodBare + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.5588235, g: 0.51234937, b: 0.4766436, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/PineWoodBare.mat.meta b/Assets/SEGI/Demo Scene/Materials/PineWoodBare.mat.meta new file mode 100644 index 0000000..b63771c --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/PineWoodBare.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5021d97a02d65549825dc192151b6cf +timeCreated: 1424827483 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Sand.mat b/Assets/SEGI/Demo Scene/Materials/Sand.mat new file mode 100644 index 0000000..8790fd4 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Sand.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Sand + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Sand.mat.meta b/Assets/SEGI/Demo Scene/Materials/Sand.mat.meta new file mode 100644 index 0000000..cad40a7 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Sand.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e9315620aefa1134b877c0c4065ad989 +timeCreated: 1424645276 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Snow 1.mat b/Assets/SEGI/Demo Scene/Materials/Snow 1.mat new file mode 100644 index 0000000..7f6a708 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Snow 1.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Snow 1 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 10, y: 10} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 10, y: 10} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EmissionScaleUI: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.9632353, g: 0.9632353, b: 0.9632353, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColorUI: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Snow 1.mat.meta b/Assets/SEGI/Demo Scene/Materials/Snow 1.mat.meta new file mode 100644 index 0000000..14c7a7d --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Snow 1.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 789993f51d1c70e44a1e7e200d8f87e0 +timeCreated: 1424724840 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Snow.mat b/Assets/SEGI/Demo Scene/Materials/Snow.mat new file mode 100644 index 0000000..7928ce9 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Snow.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Snow + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.9191176, g: 0.9191176, b: 0.9191176, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Snow.mat.meta b/Assets/SEGI/Demo Scene/Materials/Snow.mat.meta new file mode 100644 index 0000000..fa7a4ba --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Snow.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: efd86999051c37e4caf526fb837817e9 +timeCreated: 1424645316 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/TaigaPineBark.mat b/Assets/SEGI/Demo Scene/Materials/TaigaPineBark.mat new file mode 100644 index 0000000..03e8355 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/TaigaPineBark.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: TaigaPineBark + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.53676474, g: 0.4492381, b: 0.41441396, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/TaigaPineBark.mat.meta b/Assets/SEGI/Demo Scene/Materials/TaigaPineBark.mat.meta new file mode 100644 index 0000000..7a5976a --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/TaigaPineBark.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8793163c3f180294b93570bdaee55ef5 +timeCreated: 1424892239 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/TaigaPineLeaves.mat b/Assets/SEGI/Demo Scene/Materials/TaigaPineLeaves.mat new file mode 100644 index 0000000..16ac552 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/TaigaPineLeaves.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: TaigaPineLeaves + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.35986775, g: 0.47059405, b: 0.40186742, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/TaigaPineLeaves.mat.meta b/Assets/SEGI/Demo Scene/Materials/TaigaPineLeaves.mat.meta new file mode 100644 index 0000000..b68b4ce --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/TaigaPineLeaves.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 60e08d7b37f369343a04dce3ea58e8f6 +timeCreated: 1424891655 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 1.mat b/Assets/SEGI/Demo Scene/Materials/Throw Object 1.mat new file mode 100644 index 0000000..1f1dbb0 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 1.mat @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Throw Object 1 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Glossiness + second: 0.534 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.050980397, g: 0.25490198, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0.025490195, g: 0.12745093, b: 0.5, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 1.mat.meta b/Assets/SEGI/Demo Scene/Materials/Throw Object 1.mat.meta new file mode 100644 index 0000000..ef8a65d --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 1.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8ae95f4dc24b6e24a980732c83136c46 +timeCreated: 1452407396 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 2.mat b/Assets/SEGI/Demo Scene/Materials/Throw Object 2.mat new file mode 100644 index 0000000..bf68b46 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 2.mat @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Throw Object 2 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Glossiness + second: 0.534 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.27450982, g: 0.9333334, b: 0.49803925, a: 1} + - first: + name: _EmissionColor + second: {r: 0.14705881, g: 0.5, b: 0.26680675, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 2.mat.meta b/Assets/SEGI/Demo Scene/Materials/Throw Object 2.mat.meta new file mode 100644 index 0000000..5fbe87e --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 2.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e77543ff1889890468c44d4b93df7299 +timeCreated: 1452407397 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 3.mat b/Assets/SEGI/Demo Scene/Materials/Throw Object 3.mat new file mode 100644 index 0000000..a7f82d4 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 3.mat @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Throw Object 3 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Glossiness + second: 0.534 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 0.78823537, b: 0.10196079, a: 1} + - first: + name: _EmissionColor + second: {r: 0.5, g: 0.39411768, b: 0.05098039, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 3.mat.meta b/Assets/SEGI/Demo Scene/Materials/Throw Object 3.mat.meta new file mode 100644 index 0000000..4de8ade --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 3.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8c4f0a1a6e6616045981e93059721ede +timeCreated: 1452407399 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 4.mat b/Assets/SEGI/Demo Scene/Materials/Throw Object 4.mat new file mode 100644 index 0000000..7272a11 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 4.mat @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Throw Object 4 + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _Glossiness + second: 0.534 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.427451, g: 0.78823537, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0.2137255, g: 0.39411777, b: 0.5, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object 4.mat.meta b/Assets/SEGI/Demo Scene/Materials/Throw Object 4.mat.meta new file mode 100644 index 0000000..26e6f3e --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object 4.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 159aedd946c8fe64ea60f32d3e73419d +timeCreated: 1452407404 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object.mat b/Assets/SEGI/Demo Scene/Materials/Throw Object.mat new file mode 100644 index 0000000..d714dda --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: Throw Object + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.534 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 0.16911763, b: 0.16911763, a: 1} + - first: + name: _EmissionColor + second: {r: 0.5, g: 0.08431369, b: 0.08431369, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/Throw Object.mat.meta b/Assets/SEGI/Demo Scene/Materials/Throw Object.mat.meta new file mode 100644 index 0000000..79618e9 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/Throw Object.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f313cef394060a48b9e9397c62082f6 +timeCreated: 1452250316 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/bark.mat b/Assets/SEGI/Demo Scene/Materials/bark.mat new file mode 100644 index 0000000..0080dfa --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/bark.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: bark + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.5441177, g: 0.43849486, b: 0.2800606, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/bark.mat.meta b/Assets/SEGI/Demo Scene/Materials/bark.mat.meta new file mode 100644 index 0000000..12feb29 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/bark.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9336f646327687846ad6bf96c0dfcaed +timeCreated: 1451888684 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/leaf.mat b/Assets/SEGI/Demo Scene/Materials/leaf.mat new file mode 100644 index 0000000..debb03f --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/leaf.mat @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: leaf + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.4558748, g: 0.60294116, b: 0.31477073, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/leaf.mat.meta b/Assets/SEGI/Demo Scene/Materials/leaf.mat.meta new file mode 100644 index 0000000..5d88f8d --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/leaf.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 902740f8bc8aa0647a79679db5cf73cb +timeCreated: 1451888684 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/rock.mat b/Assets/SEGI/Demo Scene/Materials/rock.mat new file mode 100644 index 0000000..ec36ebe --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/rock.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: rock + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.7058823, g: 0.6647178, b: 0.5761245, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/rock.mat.meta b/Assets/SEGI/Demo Scene/Materials/rock.mat.meta new file mode 100644 index 0000000..9a13ee6 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/rock.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1a31f5631315f554c872f8b422446490 +timeCreated: 1424672239 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/skybox 1.mat b/Assets/SEGI/Demo Scene/Materials/skybox 1.mat new file mode 100644 index 0000000..1c6d36d --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/skybox 1.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: skybox 1 + m_Shader: {fileID: 106, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _SUNDISK_HIGH_QUALITY + m_LightmapFlags: 5 + m_CustomRenderQueue: 1000 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _AtmosphereThickness + second: 0.57 + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _Exposure + second: 2 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _SunDisk + second: 2 + - first: + name: _SunSize + second: 0.035 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _GroundColor + second: {r: 0.5441177, g: 0.5441177, b: 0.5441177, a: 1} + - first: + name: _SkyTint + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/skybox 1.mat.meta b/Assets/SEGI/Demo Scene/Materials/skybox 1.mat.meta new file mode 100644 index 0000000..f95592e --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/skybox 1.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 86c0be2dad2a8a6469a5b10563543587 +timeCreated: 1433591343 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Materials/water2_Group24177_groupMat.mat b/Assets/SEGI/Demo Scene/Materials/water2_Group24177_groupMat.mat new file mode 100644 index 0000000..fb90bc8 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/water2_Group24177_groupMat.mat @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: water2_Group24177_groupMat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.742 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.20404412, g: 0.5375508, b: 0.8161765, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 0} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Materials/water2_Group24177_groupMat.mat.meta b/Assets/SEGI/Demo Scene/Materials/water2_Group24177_groupMat.mat.meta new file mode 100644 index 0000000..033b8f3 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Materials/water2_Group24177_groupMat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 87db4496631853b43840bdd6c498f5a0 +timeCreated: 1424583940 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models.meta b/Assets/SEGI/Demo Scene/Models.meta new file mode 100644 index 0000000..c66a1d9 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f1b7bd9efb22ab14fb4c30dab4bfd176 +folderAsset: yes +timeCreated: 1465535292 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Crystals01.FBX b/Assets/SEGI/Demo Scene/Models/Crystals01.FBX new file mode 100644 index 0000000..0cf0275 Binary files /dev/null and b/Assets/SEGI/Demo Scene/Models/Crystals01.FBX differ diff --git a/Assets/SEGI/Demo Scene/Models/Crystals01.FBX.meta b/Assets/SEGI/Demo Scene/Models/Crystals01.FBX.meta new file mode 100644 index 0000000..7bb436b --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Crystals01.FBX.meta @@ -0,0 +1,133 @@ +fileFormatVersion: 2 +guid: 40c618b3f8760f74db4a2cefe3dff7b3 +timeCreated: 1452060958 +licenseType: Pro +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: CrystalLarge1 + 100002: CrystalLarge2 + 100004: CrystalLarge3 + 100006: CrystalLarge4 + 100008: CrystalMed1 + 100010: CrystalMed2 + 100012: CrystalMed3 + 100014: CrystalMed4 + 100016: //RootNode + 100018: CrystalSmall1 + 100020: CrystalSmall2 + 100022: CrystalSmall3 + 100024: CrystalSmall4 + 400000: CrystalLarge1 + 400002: CrystalLarge2 + 400004: CrystalLarge3 + 400006: CrystalLarge4 + 400008: CrystalMed1 + 400010: CrystalMed2 + 400012: CrystalMed3 + 400014: CrystalMed4 + 400016: //RootNode + 400018: CrystalSmall1 + 400020: CrystalSmall2 + 400022: CrystalSmall3 + 400024: CrystalSmall4 + 2300000: CrystalLarge1 + 2300002: CrystalLarge2 + 2300004: CrystalLarge3 + 2300006: CrystalLarge4 + 2300008: CrystalMed1 + 2300010: CrystalMed2 + 2300012: CrystalMed3 + 2300014: CrystalMed4 + 2300016: CrystalSmall1 + 2300018: CrystalSmall2 + 2300020: CrystalSmall3 + 2300022: CrystalSmall4 + 3300000: CrystalLarge1 + 3300002: CrystalLarge2 + 3300004: CrystalLarge3 + 3300006: CrystalLarge4 + 3300008: CrystalMed1 + 3300010: CrystalMed2 + 3300012: CrystalMed3 + 3300014: CrystalMed4 + 3300016: CrystalSmall1 + 3300018: CrystalSmall2 + 3300020: CrystalSmall3 + 3300022: CrystalSmall4 + 4300000: CrystalSmall2 + 4300002: CrystalSmall3 + 4300004: CrystalSmall4 + 4300006: CrystalMed1 + 4300008: CrystalMed2 + 4300010: CrystalMed3 + 4300012: CrystalMed4 + 4300014: CrystalLarge4 + 4300016: CrystalSmall1 + 4300018: CrystalLarge3 + 4300020: CrystalLarge2 + 4300022: CrystalLarge1 + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleRotations: 1 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 0.01 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Grassy Terrain 01.FBX b/Assets/SEGI/Demo Scene/Models/Grassy Terrain 01.FBX new file mode 100644 index 0000000..43b1cc4 Binary files /dev/null and b/Assets/SEGI/Demo Scene/Models/Grassy Terrain 01.FBX differ diff --git a/Assets/SEGI/Demo Scene/Models/Grassy Terrain 01.FBX.meta b/Assets/SEGI/Demo Scene/Models/Grassy Terrain 01.FBX.meta new file mode 100644 index 0000000..7c6c0e8 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Grassy Terrain 01.FBX.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: d6e1787571dd3be429cc767f57060e47 +timeCreated: 1451781295 +licenseType: Pro +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: Grass + 100002: //RootNode + 100004: Plane002 + 100006: Rock + 100008: Snow + 100010: Sand + 100012: Cave + 100014: CaveOccluder + 400000: Grass + 400002: //RootNode + 400004: Plane002 + 400006: Rock + 400008: Snow + 400010: Sand + 400012: Cave + 400014: CaveOccluder + 2300000: Grass + 2300002: Plane002 + 2300004: Rock + 2300006: Snow + 2300008: Sand + 2300010: Cave + 2300012: CaveOccluder + 3300000: Grass + 3300002: Plane002 + 3300004: Rock + 3300006: Snow + 3300008: Sand + 3300010: Cave + 3300012: CaveOccluder + 4300000: Rock + 4300002: Plane002 + 4300004: Grass + 4300006: Snow + 4300008: Sand + 4300010: Cave + 4300012: CaveOccluder + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleRotations: 1 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Log Cabin.FBX b/Assets/SEGI/Demo Scene/Models/Log Cabin.FBX new file mode 100644 index 0000000..d360941 Binary files /dev/null and b/Assets/SEGI/Demo Scene/Models/Log Cabin.FBX differ diff --git a/Assets/SEGI/Demo Scene/Models/Log Cabin.FBX.meta b/Assets/SEGI/Demo Scene/Models/Log Cabin.FBX.meta new file mode 100644 index 0000000..146503a --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Log Cabin.FBX.meta @@ -0,0 +1,97 @@ +fileFormatVersion: 2 +guid: 8f4541e43771fd0438f8a7bf2c6342db +timeCreated: 1465545208 +licenseType: Pro +ModelImporter: + serializedVersion: 18 + fileIDToRecycleName: + 100000: cabin_newA_Group27125_group + 100002: Glass + 100004: group_cabin_newA_Group25576 + 100006: group_cabin_newA_Group35338 + 100008: //RootNode + 100010: LogEnds + 100012: Roof + 400000: cabin_newA_Group27125_group + 400002: Glass + 400004: group_cabin_newA_Group25576 + 400006: group_cabin_newA_Group35338 + 400008: //RootNode + 400010: LogEnds + 400012: Roof + 2300000: cabin_newA_Group27125_group + 2300002: Glass + 2300004: group_cabin_newA_Group25576 + 2300006: group_cabin_newA_Group35338 + 2300008: LogEnds + 2300010: Roof + 3300000: cabin_newA_Group27125_group + 3300002: Glass + 3300004: group_cabin_newA_Group25576 + 3300006: group_cabin_newA_Group35338 + 3300008: LogEnds + 3300010: Roof + 4300000: cabin_newA_Group27125_group + 4300002: group_cabin_newA_Group35338 + 4300004: group_cabin_newA_Group25576 + 4300006: Roof + 4300008: Glass + 4300010: LogEnds + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationCompression: 1 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: .100000001 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + splitTangentsAcrossUV: 1 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Materials.meta b/Assets/SEGI/Demo Scene/Models/Materials.meta new file mode 100644 index 0000000..8c64696 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d755a67e21bfc554a833931a2e82a9a6 +folderAsset: yes +timeCreated: 1465562083 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Materials/02 - Default.mat b/Assets/SEGI/Demo Scene/Models/Materials/02 - Default.mat new file mode 100644 index 0000000..cdcbeb5 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/02 - Default.mat @@ -0,0 +1,121 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: 02 - Default + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.5882353, g: 0.5882353, b: 0.5882353, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Models/Materials/02 - Default.mat.meta b/Assets/SEGI/Demo Scene/Models/Materials/02 - Default.mat.meta new file mode 100644 index 0000000..7a91cbf --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/02 - Default.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e4ce47af5fbc146418c062d601c3b9cc +timeCreated: 1465562083 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Materials/No Name.mat b/Assets/SEGI/Demo Scene/Models/Materials/No Name.mat new file mode 100644 index 0000000..6630956 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/No Name.mat @@ -0,0 +1,121 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: No Name + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Models/Materials/No Name.mat.meta b/Assets/SEGI/Demo Scene/Models/Materials/No Name.mat.meta new file mode 100644 index 0000000..2f8e12e --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/No Name.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 158181d5e99b89146ad1bd7b9035fb37 +timeCreated: 1465562083 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Materials/_cabin_newAdefault.mat b/Assets/SEGI/Demo Scene/Models/Materials/_cabin_newAdefault.mat new file mode 100644 index 0000000..cfe7364 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/_cabin_newAdefault.mat @@ -0,0 +1,121 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: _cabin_newAdefault + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 0.588, g: 0.588, b: 0.588, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Models/Materials/_cabin_newAdefault.mat.meta b/Assets/SEGI/Demo Scene/Models/Materials/_cabin_newAdefault.mat.meta new file mode 100644 index 0000000..44a397d --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/_cabin_newAdefault.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e4247855dc872341beddecdd4332bee +timeCreated: 1465562084 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Materials/_pine_snowdefault.mat b/Assets/SEGI/Demo Scene/Models/Materials/_pine_snowdefault.mat new file mode 100644 index 0000000..ac00798 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/_pine_snowdefault.mat @@ -0,0 +1,121 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: _pine_snowdefault + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _EmissionScaleUI + second: 0 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 0, b: 0, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _EmissionColorUI + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/SEGI/Demo Scene/Models/Materials/_pine_snowdefault.mat.meta b/Assets/SEGI/Demo Scene/Models/Materials/_pine_snowdefault.mat.meta new file mode 100644 index 0000000..4f80044 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Materials/_pine_snowdefault.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba658be7b1876e147a9f3b107040b620 +timeCreated: 1465562083 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.FBX b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.FBX new file mode 100644 index 0000000..c9e697f Binary files /dev/null and b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.FBX differ diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.FBX.meta b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.FBX.meta new file mode 100644 index 0000000..a12bad0 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.FBX.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: 0d9d9165dea3d8249b8947d67fd8454d +timeCreated: 1465548328 +licenseType: Pro +ModelImporter: + serializedVersion: 18 + fileIDToRecycleName: + 100000: Leaves + 100002: //RootNode + 100004: Snow + 100006: Trunk + 400000: Leaves + 400002: //RootNode + 400004: Snow + 400006: Trunk + 2300000: Leaves + 2300002: Snow + 2300004: Trunk + 3300000: Leaves + 3300002: Snow + 3300004: Trunk + 4300000: Leaves + 4300002: Snow + 4300004: Trunk + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationCompression: 1 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + splitTangentsAcrossUV: 1 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.prefab b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.prefab new file mode 100644 index 0000000..f58c978 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.prefab @@ -0,0 +1,276 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &124328 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 446146} + - component: {fileID: 3310260} + - component: {fileID: 2323430} + m_Layer: 0 + m_Name: Leaves + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &150958 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 428434} + - component: {fileID: 3300262} + - component: {fileID: 2346032} + m_Layer: 0 + m_Name: Snow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &154996 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 469422} + - component: {fileID: 13676688} + - component: {fileID: 13613388} + m_Layer: 11 + m_Name: Pine Tree Snowy + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &174502 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 471220} + - component: {fileID: 3387108} + - component: {fileID: 2363334} + m_Layer: 0 + m_Name: Trunk + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &428434 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 150958} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -0.3579255, y: 0, z: -0.49316517} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 469422} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &446146 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 124328} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -0.3579255, y: 0, z: -0.49316517} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 469422} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &469422 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 154996} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -21.159193, y: -41.78, z: 53.349182} + m_LocalScale: {x: 0.2732126, y: 0.35143462, z: 0.27321258} + m_Children: + - {fileID: 446146} + - {fileID: 428434} + - {fileID: 471220} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &471220 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 174502} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -0.3579255, y: 0, z: -0.49316517} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 469422} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2323430 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 124328} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 60e08d7b37f369343a04dce3ea58e8f6, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2346032 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 150958} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: efd86999051c37e4caf526fb837817e9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2363334 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 174502} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 4135376286d609a4fb2ae1a55875d790, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3300262 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 150958} + m_Mesh: {fileID: 4300002, guid: 0d9d9165dea3d8249b8947d67fd8454d, type: 3} +--- !u!33 &3310260 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 124328} + m_Mesh: {fileID: 4300000, guid: 0d9d9165dea3d8249b8947d67fd8454d, type: 3} +--- !u!33 &3387108 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 174502} + m_Mesh: {fileID: 4300004, guid: 0d9d9165dea3d8249b8947d67fd8454d, type: 3} +--- !u!136 &13613388 +CapsuleCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 154996} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 1.91 + m_Height: 18.51 + m_Direction: 1 + m_Center: {x: 0, y: 8.3, z: 0} +--- !u!136 &13676688 +CapsuleCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 154996} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 12.3 + m_Height: 63 + m_Direction: 1 + m_Center: {x: 0, y: 44.09, z: 0} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 154996} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.prefab.meta b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.prefab.meta new file mode 100644 index 0000000..80c6826 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Pine Tree Snowy.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a886d93727cd9e248bbc2c4f63cac301 +timeCreated: 1465548522 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree.FBX b/Assets/SEGI/Demo Scene/Models/Pine Tree.FBX new file mode 100644 index 0000000..39b4ddc Binary files /dev/null and b/Assets/SEGI/Demo Scene/Models/Pine Tree.FBX differ diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree.FBX.meta b/Assets/SEGI/Demo Scene/Models/Pine Tree.FBX.meta new file mode 100644 index 0000000..a9aa420 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Pine Tree.FBX.meta @@ -0,0 +1,77 @@ +fileFormatVersion: 2 +guid: 0e3362739da8549428d4542bd8bfb228 +timeCreated: 1465547264 +licenseType: Pro +ModelImporter: + serializedVersion: 18 + fileIDToRecycleName: + 100000: Leaves + 100002: //RootNode + 100004: Trunk + 400000: Leaves + 400002: //RootNode + 400004: Trunk + 2300000: Leaves + 2300002: Trunk + 3300000: Leaves + 3300002: Trunk + 4300000: Leaves + 4300002: Trunk + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationCompression: 1 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: .100000001 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + splitTangentsAcrossUV: 1 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree.prefab b/Assets/SEGI/Demo Scene/Models/Pine Tree.prefab new file mode 100644 index 0000000..54194c5 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Pine Tree.prefab @@ -0,0 +1,207 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &120502 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 495650} + - component: {fileID: 13648820} + - component: {fileID: 13676596} + m_Layer: 11 + m_Name: Pine Tree + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &169846 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 403870} + - component: {fileID: 3372950} + - component: {fileID: 2379872} + m_Layer: 0 + m_Name: Trunk + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &179838 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 406788} + - component: {fileID: 3339568} + - component: {fileID: 2313228} + m_Layer: 0 + m_Name: Leaves + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &403870 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 169846} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0.0076141357, y: 0.26206207, z: -0.045627594} + m_LocalScale: {x: 1, y: 1, z: 2.215071} + m_Children: [] + m_Father: {fileID: 495650} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &406788 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 179838} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0.0076141357, y: 2.6057968, z: -0.045627594} + m_LocalScale: {x: 1, y: 1, z: 1.701627} + m_Children: [] + m_Father: {fileID: 495650} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &495650 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120502} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 22.1, y: -35.33, z: -13.47} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_Children: + - {fileID: 406788} + - {fileID: 403870} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2313228 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 179838} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 302cd7cea389af1468f947b57e4e6c41, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2379872 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 169846} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 4135376286d609a4fb2ae1a55875d790, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3339568 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 179838} + m_Mesh: {fileID: 4300000, guid: 0e3362739da8549428d4542bd8bfb228, type: 3} +--- !u!33 &3372950 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 169846} + m_Mesh: {fileID: 4300002, guid: 0e3362739da8549428d4542bd8bfb228, type: 3} +--- !u!136 &13648820 +CapsuleCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120502} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 3.33 + m_Height: 23 + m_Direction: 1 + m_Center: {x: 0, y: 16.5, z: 0} +--- !u!136 &13676596 +CapsuleCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120502} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.66 + m_Height: 7.06 + m_Direction: 1 + m_Center: {x: 0, y: 4.07, z: 0} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 120502} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Models/Pine Tree.prefab.meta b/Assets/SEGI/Demo Scene/Models/Pine Tree.prefab.meta new file mode 100644 index 0000000..3b3f9ba --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Pine Tree.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0d7d3d0641fa2bd4c81911b846d8d0d1 +timeCreated: 1465547897 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Poppy Tree 1.prefab b/Assets/SEGI/Demo Scene/Models/Poppy Tree 1.prefab new file mode 100644 index 0000000..0131fc0 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Poppy Tree 1.prefab @@ -0,0 +1,823 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &111932 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 440010} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &112236 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 417398} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &117200 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 414514} + - component: {fileID: 3310910} + - component: {fileID: 2357804} + m_Layer: 0 + m_Name: GeoSphere040 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &122848 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 414150} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &130066 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 408770} + - component: {fileID: 3395478} + - component: {fileID: 2396614} + m_Layer: 0 + m_Name: GeoSphere042 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &130360 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 494802} + - component: {fileID: 3371018} + - component: {fileID: 2333456} + m_Layer: 0 + m_Name: GeoSphere039 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &139546 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 429080} + - component: {fileID: 3395840} + - component: {fileID: 2336354} + m_Layer: 0 + m_Name: Cylinder008 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &140884 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 446324} + - component: {fileID: 3393656} + - component: {fileID: 2373066} + m_Layer: 0 + m_Name: GeoSphere041 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &143870 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 460428} + - component: {fileID: 3373286} + - component: {fileID: 2326468} + m_Layer: 0 + m_Name: GeoSphere044 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &146198 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 471212} + - component: {fileID: 3371836} + - component: {fileID: 2392750} + m_Layer: 0 + m_Name: Cylinder007 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &148820 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 469944} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &157012 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 461930} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &170022 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 488848} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &170402 +GameObject: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 403258} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &173792 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 466428} + - component: {fileID: 3385524} + - component: {fileID: 2312360} + m_Layer: 0 + m_Name: GeoSphere043 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &197444 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 433946} + - component: {fileID: 13590974} + - component: {fileID: 13633596} + m_Layer: 11 + m_Name: Poppy Tree 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &403258 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 170402} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 446324} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &408770 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130066} + m_LocalRotation: {x: -0.7221621, y: -0.17256328, z: 0.42603123, w: 0.5169151} + m_LocalPosition: {x: -20.897993, y: 10.779812, z: 11.079346} + m_LocalScale: {x: 1.3062677, y: 1.3062675, z: 1.3062676} + m_Children: + - {fileID: 440010} + m_Father: {fileID: 433946} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &414150 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 122848} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 429080} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &414514 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 117200} + m_LocalRotation: {x: 0.7117041, y: 0.41989616, z: -0.14730504, w: 0.5435676} + m_LocalPosition: {x: -21.482388, y: 8.089817, z: 3.9756575} + m_LocalScale: {x: 1.1311632, y: 1.1311635, z: 1.1311634} + m_Children: + - {fileID: 461930} + m_Father: {fileID: 433946} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &417398 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 112236} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 460428} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &429080 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 139546} + m_LocalRotation: {x: -0.1330786, y: 0.6944711, z: 0.6944711, w: 0.1330786} + m_LocalPosition: {x: -21.581406, y: 1.6198158, z: 7.796749} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 414150} + m_Father: {fileID: 433946} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &433946 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 197444} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -20.81, y: -41.46, z: -34.49} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 471212} + - {fileID: 429080} + - {fileID: 494802} + - {fileID: 414514} + - {fileID: 446324} + - {fileID: 408770} + - {fileID: 466428} + - {fileID: 460428} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &440010 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 111932} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 408770} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &446324 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 140884} + m_LocalRotation: {x: 0.35347265, y: 0.7996993, z: 0.061108254, w: -0.48146027} + m_LocalPosition: {x: -23.279884, y: 9.379818, z: 8.6931305} + m_LocalScale: {x: 1.1311635, y: 1.1311635, z: 1.1311632} + m_Children: + - {fileID: 403258} + m_Father: {fileID: 433946} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &460428 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 143870} + m_LocalRotation: {x: -0.58794093, y: -0.06939345, z: -0.6167362, w: 0.51879346} + m_LocalPosition: {x: -24.320847, y: 5.9098167, z: 4.77621} + m_LocalScale: {x: 1.1311635, y: 1.1311635, z: 1.1311636} + m_Children: + - {fileID: 417398} + m_Father: {fileID: 433946} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &461930 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 157012} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 414514} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &466428 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 173792} + m_LocalRotation: {x: -0.028710354, y: 0.74150693, z: 0.6582698, w: -0.12658621} + m_LocalPosition: {x: -22.57726, y: 7.4698143, z: 11.501423} + m_LocalScale: {x: 1.1311634, y: 1.1311636, z: 1.1311637} + m_Children: + - {fileID: 469944} + m_Father: {fileID: 433946} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &469944 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 148820} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 466428} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &471212 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 146198} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -21.581406, y: -1.4401894, z: 7.796749} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 488848} + m_Father: {fileID: 433946} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &488848 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 170022} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 471212} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &494802 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130360} + m_LocalRotation: {x: 0.8156394, y: -0.45417753, z: -0.35835436, w: 0.0061217025} + m_LocalPosition: {x: -20.454868, y: 6.6098137, z: 8.368568} + m_LocalScale: {x: 1.1311636, y: 1.1311636, z: 1.1311637} + m_Children: [] + m_Father: {fileID: 433946} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2312360 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 173792} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2326468 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 143870} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2333456 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130360} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2336354 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 139546} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 9336f646327687846ad6bf96c0dfcaed, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2357804 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 117200} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2373066 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 140884} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2392750 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 146198} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 9336f646327687846ad6bf96c0dfcaed, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2396614 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130066} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3310910 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 117200} + m_Mesh: {fileID: 4300056, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3371018 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130360} + m_Mesh: {fileID: 4300054, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3371836 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 146198} + m_Mesh: {fileID: 4300046, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3373286 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 143870} + m_Mesh: {fileID: 4300064, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3385524 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 173792} + m_Mesh: {fileID: 4300062, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3393656 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 140884} + m_Mesh: {fileID: 4300058, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3395478 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 130066} + m_Mesh: {fileID: 4300060, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3395840 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 139546} + m_Mesh: {fileID: 4300048, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!135 &13590974 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 197444} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 5.54 + m_Center: {x: -21.78, y: 8.17, z: 7.97} +--- !u!136 &13633596 +CapsuleCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 197444} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 1.62 + m_Height: 9.86 + m_Direction: 1 + m_Center: {x: -21.78, y: 2.01, z: 7.52} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 197444} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Models/Poppy Tree 1.prefab.meta b/Assets/SEGI/Demo Scene/Models/Poppy Tree 1.prefab.meta new file mode 100644 index 0000000..8b8bf68 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Poppy Tree 1.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e41fe40f0c94627419a3e800b40e6ee7 +timeCreated: 1451893514 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Poppy Tree 2.prefab b/Assets/SEGI/Demo Scene/Models/Poppy Tree 2.prefab new file mode 100644 index 0000000..aa9cd35 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Poppy Tree 2.prefab @@ -0,0 +1,551 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &100122 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 404562} + - component: {fileID: 3350508} + - component: {fileID: 2315484} + m_Layer: 0 + m_Name: GeoSphere033 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &104602 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 437562} + - component: {fileID: 3395510} + - component: {fileID: 2390202} + m_Layer: 0 + m_Name: GeoSphere032 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &120462 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 459768} + - component: {fileID: 3366368} + - component: {fileID: 2310418} + m_Layer: 0 + m_Name: GeoSphere031 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &139996 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 435190} + - component: {fileID: 13515526} + - component: {fileID: 13665278} + m_Layer: 11 + m_Name: Poppy Tree 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &152966 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 420722} + - component: {fileID: 3308172} + - component: {fileID: 2364556} + m_Layer: 0 + m_Name: GeoSphere034 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &163584 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 479788} + - component: {fileID: 3394484} + - component: {fileID: 2347536} + m_Layer: 0 + m_Name: GeoSphere035 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &165860 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 423808} + - component: {fileID: 3310926} + - component: {fileID: 2321956} + m_Layer: 0 + m_Name: Cylinder006 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &198804 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 452148} + - component: {fileID: 3303874} + - component: {fileID: 2389416} + m_Layer: 0 + m_Name: GeoSphere036 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &404562 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100122} + m_LocalRotation: {x: 0.970728, y: 0.03536668, z: -0.23728454, w: -0.011509655} + m_LocalPosition: {x: -13.089136, y: -20.144928, z: -50.85479} + m_LocalScale: {x: 0.8293778, y: 0.82937783, z: 0.82937783} + m_Children: [] + m_Father: {fileID: 435190} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &420722 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152966} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -14.754257, y: -18.441502, z: -52.870777} + m_LocalScale: {x: 1.0786748, y: 1.0786748, z: 1.0786748} + m_Children: [] + m_Father: {fileID: 435190} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &423808 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 165860} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -13.537045, y: -26.565525, z: -51.48681} + m_LocalScale: {x: 2.4687958, y: 2.4687958, z: 1.5750039} + m_Children: [] + m_Father: {fileID: 435190} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &435190 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 139996} + m_LocalRotation: {x: 0, y: 0.6833011, z: 0, w: 0.7301368} + m_LocalPosition: {x: -22.319487, y: 11.65, z: -33.832634} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 423808} + - {fileID: 459768} + - {fileID: 437562} + - {fileID: 404562} + - {fileID: 420722} + - {fileID: 479788} + - {fileID: 452148} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &437562 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 104602} + m_LocalRotation: {x: -0.24681887, y: -0.18944937, z: 0.5940794, w: 0.74179447} + m_LocalPosition: {x: -13.537045, y: -21.316175, z: -52.23152} + m_LocalScale: {x: 0.82937795, y: 0.82937783, z: 0.8293778} + m_Children: [] + m_Father: {fileID: 435190} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &452148 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 198804} + m_LocalRotation: {x: 0.7117041, y: 0.41989616, z: -0.14730504, w: 0.5435676} + m_LocalPosition: {x: -14.0070305, y: -16.37012, z: -52.403717} + m_LocalScale: {x: 1.0786748, y: 1.0786748, z: 1.0786748} + m_Children: [] + m_Father: {fileID: 435190} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &459768 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120462} + m_LocalRotation: {x: 0.7437525, y: 0.36399433, z: -0.56062937, w: -0.0059351693} + m_LocalPosition: {x: -11.880783, y: -17.18636, z: -52.183506} + m_LocalScale: {x: 0.9624666, y: 0.96246654, z: 0.96246696} + m_Children: [] + m_Father: {fileID: 435190} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &479788 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 163584} + m_LocalRotation: {x: -0.518419, y: 0.47106084, z: -0.27239764, w: 0.65965366} + m_LocalPosition: {x: -13.923708, y: -17.503685, z: -50.70535} + m_LocalScale: {x: 1.0786748, y: 1.0786748, z: 1.0786748} + m_Children: [] + m_Father: {fileID: 435190} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2310418 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120462} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2315484 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100122} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2321956 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 165860} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 9336f646327687846ad6bf96c0dfcaed, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2347536 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 163584} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2364556 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152966} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2389416 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 198804} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2390202 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 104602} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3303874 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 198804} + m_Mesh: {fileID: 4300044, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3308172 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152966} + m_Mesh: {fileID: 4300040, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3310926 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 165860} + m_Mesh: {fileID: 4300030, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3350508 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100122} + m_Mesh: {fileID: 4300038, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3366368 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120462} + m_Mesh: {fileID: 4300034, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3394484 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 163584} + m_Mesh: {fileID: 4300042, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3395510 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 104602} + m_Mesh: {fileID: 4300036, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!135 &13515526 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 139996} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 4.2 + m_Center: {x: -13.44, y: -18.36, z: -52} +--- !u!136 &13665278 +CapsuleCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 139996} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.9 + m_Height: 8.42 + m_Direction: 1 + m_Center: {x: -13.44, y: -23, z: -51.7} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 139996} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Models/Poppy Tree 2.prefab.meta b/Assets/SEGI/Demo Scene/Models/Poppy Tree 2.prefab.meta new file mode 100644 index 0000000..3583988 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Poppy Tree 2.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a7b1c07730965f49812dddb30707c7e +timeCreated: 1451893518 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Poppy Tree 3.prefab b/Assets/SEGI/Demo Scene/Models/Poppy Tree 3.prefab new file mode 100644 index 0000000..1e91e5b --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Poppy Tree 3.prefab @@ -0,0 +1,551 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &100208 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 404304} + - component: {fileID: 3315286} + - component: {fileID: 2349210} + m_Layer: 0 + m_Name: GeoSphere028 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &105452 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 491816} + - component: {fileID: 3346082} + - component: {fileID: 2373226} + m_Layer: 0 + m_Name: Cylinder004 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &110852 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 405158} + - component: {fileID: 13502818} + - component: {fileID: 13606628} + m_Layer: 11 + m_Name: Poppy Tree 3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &118950 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 409012} + - component: {fileID: 3360502} + - component: {fileID: 2382082} + m_Layer: 0 + m_Name: GeoSphere025 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &120512 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 453372} + - component: {fileID: 3332708} + - component: {fileID: 2325396} + m_Layer: 0 + m_Name: GeoSphere027 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &132010 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 485218} + - component: {fileID: 3342574} + - component: {fileID: 2333638} + m_Layer: 0 + m_Name: GeoSphere024 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &165976 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 435768} + - component: {fileID: 3358494} + - component: {fileID: 2345520} + m_Layer: 0 + m_Name: GeoSphere029 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &189056 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 484110} + - component: {fileID: 3307956} + - component: {fileID: 2371324} + m_Layer: 0 + m_Name: GeoSphere023 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &404304 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100208} + m_LocalRotation: {x: -0.4140586, y: 0.67442954, z: -0.2692831, w: 0.548805} + m_LocalPosition: {x: -19.773731, y: 11.919722, z: -4.2786713} + m_LocalScale: {x: 1.1311631, y: 1.1311634, z: 1.131164} + m_Children: [] + m_Father: {fileID: 405158} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &405158 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 110852} + m_LocalRotation: {x: 0, y: 0.8238767, z: 0, w: 0.5667692} + m_LocalPosition: {x: -68.11209, y: -23.09, z: -57.232174} + m_LocalScale: {x: 1.1482847, y: 1.1482844, z: 1.1482848} + m_Children: + - {fileID: 491816} + - {fileID: 484110} + - {fileID: 485218} + - {fileID: 409012} + - {fileID: 453372} + - {fileID: 404304} + - {fileID: 435768} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &409012 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118950} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -19.438267, y: 10.678265, z: -8.618164} + m_LocalScale: {x: 0.8697357, y: 0.8697357, z: 0.8697357} + m_Children: [] + m_Father: {fileID: 405158} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &435768 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 165976} + m_LocalRotation: {x: 0.7117041, y: 0.41989616, z: -0.14730504, w: 0.5435676} + m_LocalPosition: {x: -19.931122, y: 13.562821, z: -7.9800873} + m_LocalScale: {x: 1.1311632, y: 1.1311635, z: 1.1311634} + m_Children: [] + m_Father: {fileID: 405158} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &453372 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120512} + m_LocalRotation: {x: -0.4160732, y: 0.57173693, z: 0.57173693, w: 0.4160732} + m_LocalPosition: {x: -17.339455, y: 10.037325, z: -5.813925} + m_LocalScale: {x: 0.8697356, y: 0.8697357, z: 0.8697357} + m_Children: [] + m_Father: {fileID: 405158} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &484110 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189056} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -21.117247, y: 11.685484, z: -7.02586} + m_LocalScale: {x: 1.1311635, y: 1.1311635, z: 1.1311635} + m_Children: [] + m_Father: {fileID: 405158} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &485218 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 132010} + m_LocalRotation: {x: 0.7437524, y: 0.36399427, z: -0.56062937, w: -0.005935172} + m_LocalPosition: {x: -17.876081, y: 13.169427, z: -6.457346} + m_LocalScale: {x: 1.0093012, y: 1.0093017, z: 1.009301} + m_Children: [] + m_Father: {fileID: 405158} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &491816 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 105452} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -19.438267, y: 3.68799, z: -6.524851} + m_LocalScale: {x: 2.5889282, y: 2.5889282, z: 1.6516441} + m_Children: [] + m_Father: {fileID: 405158} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2325396 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2333638 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 132010} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2345520 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 165976} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2349210 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100208} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2371324 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189056} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2373226 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 105452} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 9336f646327687846ad6bf96c0dfcaed, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2382082 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118950} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 902740f8bc8aa0647a79679db5cf73cb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3307956 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 189056} + m_Mesh: {fileID: 4300014, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3315286 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 100208} + m_Mesh: {fileID: 4300026, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3332708 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 120512} + m_Mesh: {fileID: 4300024, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3342574 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 132010} + m_Mesh: {fileID: 4300016, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3346082 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 105452} + m_Mesh: {fileID: 4300010, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3358494 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 165976} + m_Mesh: {fileID: 4300028, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!33 &3360502 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 118950} + m_Mesh: {fileID: 4300018, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!135 &13502818 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 110852} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 3.92 + m_Center: {x: -19.4, y: 12.15, z: -6.21} +--- !u!136 &13606628 +CapsuleCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 110852} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.9 + m_Height: 7.1 + m_Direction: 1 + m_Center: {x: -19.4, y: 7, z: -6.49} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 110852} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Models/Poppy Tree 3.prefab.meta b/Assets/SEGI/Demo Scene/Models/Poppy Tree 3.prefab.meta new file mode 100644 index 0000000..26577b6 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Poppy Tree 3.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd980e7ca553f15499e90c5e744f0ec1 +timeCreated: 1451893522 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/Rock.FBX b/Assets/SEGI/Demo Scene/Models/Rock.FBX new file mode 100644 index 0000000..dd348dc Binary files /dev/null and b/Assets/SEGI/Demo Scene/Models/Rock.FBX differ diff --git a/Assets/SEGI/Demo Scene/Models/Rock.FBX.meta b/Assets/SEGI/Demo Scene/Models/Rock.FBX.meta new file mode 100644 index 0000000..702dca7 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/Rock.FBX.meta @@ -0,0 +1,70 @@ +fileFormatVersion: 2 +guid: 1f071a7cd60c17245b431c8251315370 +timeCreated: 1465548719 +licenseType: Pro +ModelImporter: + serializedVersion: 18 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2300000: //RootNode + 3300000: //RootNode + 4300000: GeoSphere001 + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationCompression: 1 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: .00999999978 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + splitTangentsAcrossUV: 1 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/SnowRock.prefab b/Assets/SEGI/Demo Scene/Models/SnowRock.prefab new file mode 100644 index 0000000..6f254d9 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/SnowRock.prefab @@ -0,0 +1,114 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &183842 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 418394} + - component: {fileID: 3328402} + - component: {fileID: 2358960} + - component: {fileID: 9589432} + - component: {fileID: 6490160} + m_Layer: 11 + m_Name: SnowRock + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &418394 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183842} + m_LocalRotation: {x: -0.27939114, y: -0.3804344, z: -0.6955382, w: 0.5416982} + m_LocalPosition: {x: -16.359211, y: -40.63, z: -20.937607} + m_LocalScale: {x: 6.731016, y: 7.528427, z: 5.7992363} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2358960 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183842} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 1a31f5631315f554c872f8b422446490, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3328402 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183842} + m_Mesh: {fileID: 4300000, guid: 02c2c51d2b8aa5b478143298edc7d7ab, type: 3} +--- !u!64 &6490160 +MeshCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183842} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300000, guid: 02c2c51d2b8aa5b478143298edc7d7ab, type: 3} +--- !u!95 &9589432 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 183842} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 02c2c51d2b8aa5b478143298edc7d7ab, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 183842} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Models/SnowRock.prefab.meta b/Assets/SEGI/Demo Scene/Models/SnowRock.prefab.meta new file mode 100644 index 0000000..967e57a --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/SnowRock.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 034b1c2c5bc333e4b8f33c538d1eb219 +timeCreated: 1424827808 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/logCabin01.prefab b/Assets/SEGI/Demo Scene/Models/logCabin01.prefab new file mode 100644 index 0000000..d1665ab --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/logCabin01.prefab @@ -0,0 +1,514 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &116538 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 490136} + - component: {fileID: 3348882} + - component: {fileID: 2305756} + m_Layer: 0 + m_Name: Roof + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &152400 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 492888} + - component: {fileID: 3377958} + - component: {fileID: 2341298} + m_Layer: 0 + m_Name: LogEnds + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &153758 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 460144} + - component: {fileID: 3368484} + - component: {fileID: 2389338} + - component: {fileID: 6462686} + m_Layer: 0 + m_Name: cabin_newA_Group27125_group + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &161748 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 468660} + - component: {fileID: 9528822} + - component: {fileID: 6597338} + - component: {fileID: 6594912} + m_Layer: 11 + m_Name: logCabin01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &168814 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 473874} + - component: {fileID: 3313418} + - component: {fileID: 2352504} + m_Layer: 0 + m_Name: group_cabin_newA_Group35338 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &188956 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 493552} + - component: {fileID: 3334466} + - component: {fileID: 2375898} + m_Layer: 0 + m_Name: Glass + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &191710 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 465308} + - component: {fileID: 3345810} + - component: {fileID: 2357696} + m_Layer: 0 + m_Name: group_cabin_newA_Group25576 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &460144 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 153758} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.77241975, y: 0, z: -2.053711} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 468660} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &465308 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 191710} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.77241975, y: 0, z: -2.053711} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 468660} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &468660 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161748} + m_LocalRotation: {x: 0, y: 0.99271995, z: 0, w: 0.12044572} + m_LocalPosition: {x: 8.37, y: -40.02, z: 83.82} + m_LocalScale: {x: 0.29190904, y: 0.29190898, z: 0.29190898} + m_Children: + - {fileID: 460144} + - {fileID: 493552} + - {fileID: 465308} + - {fileID: 473874} + - {fileID: 492888} + - {fileID: 490136} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &473874 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168814} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.77241975, y: 0, z: -2.053711} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 468660} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &490136 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116538} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.77241975, y: 0, z: -2.053711} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 468660} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &492888 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152400} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.77241975, y: 0, z: -2.053711} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 468660} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &493552 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 188956} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.77241975, y: 0, z: -2.053711} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 468660} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2305756 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116538} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 8199f9274ac65d246b852eeb901e322c, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2341298 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152400} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: b5021d97a02d65549825dc192151b6cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2352504 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168814} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2357696 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 191710} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 8793163c3f180294b93570bdaee55ef5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2375898 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 188956} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 66098619b47b8a8469e9f5fd1d106050, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!23 &2389338 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 153758} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 8793163c3f180294b93570bdaee55ef5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3313418 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 168814} + m_Mesh: {fileID: 4300002, guid: 8f4541e43771fd0438f8a7bf2c6342db, type: 3} +--- !u!33 &3334466 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 188956} + m_Mesh: {fileID: 4300008, guid: 8f4541e43771fd0438f8a7bf2c6342db, type: 3} +--- !u!33 &3345810 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 191710} + m_Mesh: {fileID: 4300004, guid: 8f4541e43771fd0438f8a7bf2c6342db, type: 3} +--- !u!33 &3348882 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 116538} + m_Mesh: {fileID: 4300006, guid: 8f4541e43771fd0438f8a7bf2c6342db, type: 3} +--- !u!33 &3368484 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 153758} + m_Mesh: {fileID: 4300000, guid: 8f4541e43771fd0438f8a7bf2c6342db, type: 3} +--- !u!33 &3377958 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 152400} + m_Mesh: {fileID: 4300010, guid: 8f4541e43771fd0438f8a7bf2c6342db, type: 3} +--- !u!64 &6462686 +MeshCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 153758} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300000, guid: 8f4541e43771fd0438f8a7bf2c6342db, type: 3} +--- !u!65 &6594912 +BoxCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161748} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 48.663826, y: 31.916359, z: 31.627657} + m_Center: {x: 0.8508313, y: 15.45821, z: -9.820763} +--- !u!65 &6597338 +BoxCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161748} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 28.830275, y: 17.852104, z: 22.065004} + m_Center: {x: -8.926418, y: 8.426053, z: 10.529626} +--- !u!95 &9528822 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 161748} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: 74ca5a8fa8beead4da7cb55a9a483dc5, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 161748} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Models/logCabin01.prefab.meta b/Assets/SEGI/Demo Scene/Models/logCabin01.prefab.meta new file mode 100644 index 0000000..a13fb14 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/logCabin01.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 700962cf36138e246bd627c79997dd1c +timeCreated: 1465545650 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/trees02.FBX b/Assets/SEGI/Demo Scene/Models/trees02.FBX new file mode 100644 index 0000000..fa17621 Binary files /dev/null and b/Assets/SEGI/Demo Scene/Models/trees02.FBX differ diff --git a/Assets/SEGI/Demo Scene/Models/trees02.FBX.meta b/Assets/SEGI/Demo Scene/Models/trees02.FBX.meta new file mode 100644 index 0000000..114fcc6 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/trees02.FBX.meta @@ -0,0 +1,238 @@ +fileFormatVersion: 2 +guid: 8cc9e2d54e559154197c65f07058e64c +timeCreated: 1451890472 +licenseType: Pro +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: Cylinder003 + 100002: Cylinder004 + 100004: Cylinder005 + 100006: Cylinder006 + 100008: Cylinder007 + 100010: Cylinder008 + 100012: GeoSphere018 + 100014: GeoSphere019 + 100016: GeoSphere020 + 100018: GeoSphere021 + 100020: GeoSphere022 + 100022: GeoSphere023 + 100024: GeoSphere024 + 100026: GeoSphere025 + 100028: GeoSphere026 + 100030: GeoSphere027 + 100032: GeoSphere028 + 100034: GeoSphere029 + 100036: GeoSphere030 + 100038: GeoSphere031 + 100040: GeoSphere032 + 100042: GeoSphere033 + 100044: GeoSphere034 + 100046: GeoSphere035 + 100048: GeoSphere036 + 100050: GeoSphere037 + 100052: GeoSphere038 + 100054: GeoSphere039 + 100056: GeoSphere040 + 100058: GeoSphere041 + 100060: GeoSphere042 + 100062: GeoSphere043 + 100064: GeoSphere044 + 100066: //RootNode + 400000: Cylinder003 + 400002: Cylinder004 + 400004: Cylinder005 + 400006: Cylinder006 + 400008: Cylinder007 + 400010: Cylinder008 + 400012: GeoSphere018 + 400014: GeoSphere019 + 400016: GeoSphere020 + 400018: GeoSphere021 + 400020: GeoSphere022 + 400022: GeoSphere023 + 400024: GeoSphere024 + 400026: GeoSphere025 + 400028: GeoSphere026 + 400030: GeoSphere027 + 400032: GeoSphere028 + 400034: GeoSphere029 + 400036: GeoSphere030 + 400038: GeoSphere031 + 400040: GeoSphere032 + 400042: GeoSphere033 + 400044: GeoSphere034 + 400046: GeoSphere035 + 400048: GeoSphere036 + 400050: GeoSphere037 + 400052: GeoSphere038 + 400054: GeoSphere039 + 400056: GeoSphere040 + 400058: GeoSphere041 + 400060: GeoSphere042 + 400062: GeoSphere043 + 400064: GeoSphere044 + 400066: //RootNode + 2300000: Cylinder003 + 2300002: Cylinder004 + 2300004: Cylinder005 + 2300006: Cylinder006 + 2300008: Cylinder007 + 2300010: Cylinder008 + 2300012: GeoSphere018 + 2300014: GeoSphere019 + 2300016: GeoSphere020 + 2300018: GeoSphere021 + 2300020: GeoSphere022 + 2300022: GeoSphere023 + 2300024: GeoSphere024 + 2300026: GeoSphere025 + 2300028: GeoSphere026 + 2300030: GeoSphere027 + 2300032: GeoSphere028 + 2300034: GeoSphere029 + 2300036: GeoSphere030 + 2300038: GeoSphere031 + 2300040: GeoSphere032 + 2300042: GeoSphere033 + 2300044: GeoSphere034 + 2300046: GeoSphere035 + 2300048: GeoSphere036 + 2300050: GeoSphere037 + 2300052: GeoSphere038 + 2300054: GeoSphere039 + 2300056: GeoSphere040 + 2300058: GeoSphere041 + 2300060: GeoSphere042 + 2300062: GeoSphere043 + 2300064: GeoSphere044 + 3300000: Cylinder003 + 3300002: Cylinder004 + 3300004: Cylinder005 + 3300006: Cylinder006 + 3300008: Cylinder007 + 3300010: Cylinder008 + 3300012: GeoSphere018 + 3300014: GeoSphere019 + 3300016: GeoSphere020 + 3300018: GeoSphere021 + 3300020: GeoSphere022 + 3300022: GeoSphere023 + 3300024: GeoSphere024 + 3300026: GeoSphere025 + 3300028: GeoSphere026 + 3300030: GeoSphere027 + 3300032: GeoSphere028 + 3300034: GeoSphere029 + 3300036: GeoSphere030 + 3300038: GeoSphere031 + 3300040: GeoSphere032 + 3300042: GeoSphere033 + 3300044: GeoSphere034 + 3300046: GeoSphere035 + 3300048: GeoSphere036 + 3300050: GeoSphere037 + 3300052: GeoSphere038 + 3300054: GeoSphere039 + 3300056: GeoSphere040 + 3300058: GeoSphere041 + 3300060: GeoSphere042 + 3300062: GeoSphere043 + 3300064: GeoSphere044 + 4300000: GeoSphere018 + 4300002: Cylinder003 + 4300004: GeoSphere019 + 4300006: GeoSphere020 + 4300008: GeoSphere021 + 4300010: Cylinder004 + 4300012: GeoSphere022 + 4300014: GeoSphere023 + 4300016: GeoSphere024 + 4300018: GeoSphere025 + 4300020: GeoSphere026 + 4300022: Cylinder005 + 4300024: GeoSphere027 + 4300026: GeoSphere028 + 4300028: GeoSphere029 + 4300030: Cylinder006 + 4300032: GeoSphere030 + 4300034: GeoSphere031 + 4300036: GeoSphere032 + 4300038: GeoSphere033 + 4300040: GeoSphere034 + 4300042: GeoSphere035 + 4300044: GeoSphere036 + 4300046: Cylinder007 + 4300048: Cylinder008 + 4300050: GeoSphere037 + 4300052: GeoSphere038 + 4300054: GeoSphere039 + 4300056: GeoSphere040 + 4300058: GeoSphere041 + 4300060: GeoSphere042 + 4300062: GeoSphere043 + 4300064: GeoSphere044 + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleRotations: 1 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Models/water2.OBJ.meta b/Assets/SEGI/Demo Scene/Models/water2.OBJ.meta new file mode 100644 index 0000000..baacb0a --- /dev/null +++ b/Assets/SEGI/Demo Scene/Models/water2.OBJ.meta @@ -0,0 +1,72 @@ +fileFormatVersion: 2 +guid: 42e8d121134ac6345a6e96d08266af8e +timeCreated: 1424591009 +licenseType: Pro +ModelImporter: + serializedVersion: 18 + fileIDToRecycleName: + 100000: //RootNode + 100002: water2_Group24177_group + 400000: //RootNode + 400002: water2_Group24177_group + 2300000: water2_Group24177_group + 3300000: water2_Group24177_group + 4300000: water2_Group24177_group + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + optimizeGameObjects: 0 + motionNodeName: + animationCompression: 1 + animationRotationError: .5 + animationPositionError: .5 + animationScaleError: .5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + splitTangentsAcrossUV: 1 + normalImportMode: 0 + tangentImportMode: 1 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: .5 + foreArmTwist: .5 + upperLegTwist: .5 + legTwist: .5 + armStretch: .0500000007 + legStretch: .0500000007 + feetSpacing: 0 + rootMotionBoneName: + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Prefabs.meta b/Assets/SEGI/Demo Scene/Prefabs.meta new file mode 100644 index 0000000..1d4ccfc --- /dev/null +++ b/Assets/SEGI/Demo Scene/Prefabs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 232f15e28f7b22b41bf6a07adc7690f9 +folderAsset: yes +timeCreated: 1465535755 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Prefabs/Throw Object.prefab b/Assets/SEGI/Demo Scene/Prefabs/Throw Object.prefab new file mode 100644 index 0000000..d3a6777 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Prefabs/Throw Object.prefab @@ -0,0 +1,142 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &181034 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 420608} + - component: {fileID: 3395992} + - component: {fileID: 13564096} + - component: {fileID: 2348972} + - component: {fileID: 5411778} + - component: {fileID: 6468798} + - component: {fileID: 11407376} + m_Layer: 0 + m_Name: Throw Object + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &420608 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181034} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.044695, y: -34.53, z: -19.222} + m_LocalScale: {x: 0.8778924, y: 0.87789243, z: 0.87789243} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2348972 +MeshRenderer: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181034} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 3f313cef394060a48b9e9397c62082f6, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingOrder: 0 +--- !u!33 &3395992 +MeshFilter: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181034} + m_Mesh: {fileID: 4300008, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!54 &5411778 +Rigidbody: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181034} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!64 &6468798 +MeshCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181034} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 1 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300008, guid: 8cc9e2d54e559154197c65f07058e64c, type: 3} +--- !u!114 &11407376 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181034} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fd97e24d2802c8e458ed9d97feb78084, type: 3} + m_Name: + m_EditorClassIdentifier: + mat0: {fileID: 2100000, guid: 3f313cef394060a48b9e9397c62082f6, type: 2} + mat1: {fileID: 2100000, guid: 8ae95f4dc24b6e24a980732c83136c46, type: 2} + mat2: {fileID: 2100000, guid: e77543ff1889890468c44d4b93df7299, type: 2} + mat3: {fileID: 2100000, guid: 8c4f0a1a6e6616045981e93059721ede, type: 2} + mat4: {fileID: 2100000, guid: 159aedd946c8fe64ea60f32d3e73419d, type: 2} +--- !u!135 &13564096 +SphereCollider: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 181034} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 0 + serializedVersion: 2 + m_Radius: 1.96 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 181034} + m_IsPrefabParent: 1 diff --git a/Assets/SEGI/Demo Scene/Prefabs/Throw Object.prefab.meta b/Assets/SEGI/Demo Scene/Prefabs/Throw Object.prefab.meta new file mode 100644 index 0000000..760348e --- /dev/null +++ b/Assets/SEGI/Demo Scene/Prefabs/Throw Object.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab7a056b0d4e7524eb3c5e0650fdaeb7 +timeCreated: 1452235272 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/SEGI Low Poly.unity b/Assets/SEGI/Demo Scene/SEGI Low Poly.unity new file mode 100644 index 0000000..8fc2b48 --- /dev/null +++ b/Assets/SEGI/Demo Scene/SEGI Low Poly.unity @@ -0,0 +1,14284 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0, g: 0, b: 0, a: 0} + m_AmbientEquatorColor: {r: 0, g: 0, b: 0, a: 0} + m_AmbientGroundColor: {r: 0, g: 0, b: 0, a: 0} + m_AmbientIntensity: 0 + m_AmbientMode: 1 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 2100000, guid: 86c0be2dad2a8a6469a5b10563543587, type: 2} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 0 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 0} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 0 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 1024 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 0 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &47707901 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 47707902} + - component: {fileID: 47707904} + - component: {fileID: 47707903} + m_Layer: 0 + m_Name: CrystalSmall3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &47707902 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47707901} + m_LocalRotation: {x: -0.5680182, y: -0.31962526, z: -0.08119062, w: 0.7540578} + m_LocalPosition: {x: -4.74, y: 11.76, z: 8.68} + m_LocalScale: {x: 5, y: 5, z: 9.499289} + m_Children: [] + m_Father: {fileID: 657520971} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &47707903 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47707901} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &47707904 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47707901} + m_Mesh: {fileID: 4300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &47722828 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 47722829} + - component: {fileID: 47722831} + - component: {fileID: 47722830} + m_Layer: 0 + m_Name: CrystalMed4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &47722829 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47722828} + m_LocalRotation: {x: -0.53999877, y: -0.6688292, z: -0.35930234, w: 0.36327782} + m_LocalPosition: {x: 2.2472441, y: -1.3835242, z: 1.8726091} + m_LocalScale: {x: 1.4139835, y: 1.4139831, z: 2.2578108} + m_Children: [] + m_Father: {fileID: 1363094077} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &47722830 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47722828} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 3bc33ff78e3ff3e48b2e7aea7c27c072, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &47722831 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 47722828} + m_Mesh: {fileID: 4300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &53737152 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: -14.6599998 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -39.4700012 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 88.5500031 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .554848373 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: .831951499 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 41 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 2 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .220170513 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .283206344 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .220170557 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &53737153 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 53737152} +--- !u!1 &59863363 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 59863364} + - component: {fileID: 59863366} + - component: {fileID: 59863365} + m_Layer: 0 + m_Name: CrystalMed4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &59863364 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 59863363} + m_LocalRotation: {x: -0.44836503, y: -0.37477726, z: -0.21497637, w: 0.7824934} + m_LocalPosition: {x: 2.772, y: -1.39, z: 2.0598} + m_LocalScale: {x: 1.4139835, y: 1.4139831, z: 2.2578108} + m_Children: [] + m_Father: {fileID: 1188902570} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &59863365 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 59863363} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &59863366 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 59863363} + m_Mesh: {fileID: 4300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &76569193 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 68.2400055 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -23.7000008 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 25.3699951 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .823861361 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: -.566791475 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 49 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 9 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .235582799 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .321678489 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .235582918 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &76569194 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 76569193} +--- !u!1001 &78745819 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -27.2129993 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -7.44193745 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 22.1462841 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.218619421 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .221066117 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.935804725 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.166147426 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 31 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 20.6770916 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 46.5984726 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 11.076169 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (31) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &78745820 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 78745819} +--- !u!1 &81835739 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 81835740} + - component: {fileID: 81835742} + - component: {fileID: 81835741} + m_Layer: 0 + m_Name: CrystalMed2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &81835740 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81835739} + m_LocalRotation: {x: -0.44889033, y: 0.010324692, z: -0.015559695, w: 0.8933918} + m_LocalPosition: {x: 3.762, y: -1.8453158, z: 2.482} + m_LocalScale: {x: 0.706294, y: 0.6835654, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1647423913} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &81835741 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81835739} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &81835742 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81835739} + m_Mesh: {fileID: 4300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &88600307 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -23.431366 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -7.70221424 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 34.4184303 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .201273173 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.181508139 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .794101059 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .54401052 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 26 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 5.16695118 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 7.13827896 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 4.36711645 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (26) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: e5cb26d4baa613442968b28bc2730634, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &95974159 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 95974160} + m_Layer: 0 + m_Name: Rocks + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &95974160 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 95974159} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1870320796} + - {fileID: 511411384} + - {fileID: 755514122} + - {fileID: 1700912724} + - {fileID: 1075074936} + - {fileID: 249017069} + - {fileID: 1256216630} + - {fileID: 2115729771} + - {fileID: 1791265090} + - {fileID: 1519326186} + - {fileID: 1823669488} + - {fileID: 1283043371} + - {fileID: 1655831590} + - {fileID: 872431993} + - {fileID: 860546618} + - {fileID: 1258454861} + - {fileID: 1316846542} + - {fileID: 1785711825} + - {fileID: 689899177} + - {fileID: 183658031} + - {fileID: 2110991212} + - {fileID: 1936046986} + - {fileID: 192223096} + - {fileID: 2100382956} + - {fileID: 1166636601} + - {fileID: 1870855494} + - {fileID: 1510140451} + - {fileID: 619121687} + - {fileID: 1264693488} + - {fileID: 456006742} + - {fileID: 824669963} + - {fileID: 78745820} + - {fileID: 708320663} + - {fileID: 1345046897} + - {fileID: 274368092} + - {fileID: 1371169592} + - {fileID: 491594628} + - {fileID: 123614805} + - {fileID: 678579344} + - {fileID: 1340841872} + - {fileID: 950691909} + - {fileID: 220574451} + - {fileID: 249375209} + - {fileID: 1413067275} + - {fileID: 1952323861} + - {fileID: 2146194182} + - {fileID: 119979170} + - {fileID: 1647423913} + - {fileID: 512280415} + - {fileID: 1225114906} + - {fileID: 1629820261} + - {fileID: 1188902570} + - {fileID: 283506051} + - {fileID: 657520971} + - {fileID: 1363094077} + - {fileID: 352304244} + - {fileID: 2046381190} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &102255323 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -29.5345592 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -23.3799992 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 98.7739334 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .220155761 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .251390159 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.938854992 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .0829808563 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 23 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 7.14164066 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 36.2480545 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 5.87815142 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (23) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &119979170 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1675151733} +--- !u!4 &123614805 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 249993902} +--- !u!1001 &126942213 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.x + value: -97.2287827 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.y + value: -29.9799995 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.z + value: -45.1818962 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: -.899045944 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: .437854439 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_RootOrder + value: 32 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0.7437524 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0.36399427 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: -0.56062937 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -0.0059351735 + objectReference: {fileID: 0} + - target: {fileID: 110852, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_Name + value: Poppy Tree 3 (2) + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &161363357 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -90.6407471 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -21.1988811 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -25.0497131 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.135571435 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.835115433 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .456143141 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.275927782 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 10.4347572 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 11.6709414 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 64.8579788 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (45) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &169780362 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 19.4999981 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -30.4799995 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -52.2000008 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .00652033323 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.999978781 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 21 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 11 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .5 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .5 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .5 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &169780363 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 169780362} +--- !u!1 &178255050 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 178255051} + - component: {fileID: 178255053} + - component: {fileID: 178255052} + m_Layer: 0 + m_Name: CrystalMed4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &178255051 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 178255050} + m_LocalRotation: {x: -0.44836503, y: -0.37477726, z: -0.21497637, w: 0.7824934} + m_LocalPosition: {x: 2.772, y: -1.39, z: 2.0598} + m_LocalScale: {x: 1.4139835, y: 1.4139831, z: 2.2578108} + m_Children: [] + m_Father: {fileID: 1647423913} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &178255052 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 178255050} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &178255053 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 178255050} + m_Mesh: {fileID: 4300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &182925130 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.x + value: -68.1120911 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.y + value: -23.0900002 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.z + value: -57.2321739 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: .823876679 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: .566769183 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_RootOrder + value: 33 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0.7437524 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0.36399427 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: -0.56062937 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -0.005935173 + objectReference: {fileID: 0} + - target: {fileID: 110852, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_Name + value: Poppy Tree 3 (3) + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.x + value: 1.14828467 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.y + value: 1.14828444 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.z + value: 1.14828479 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &183658031 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 227975872} +--- !u!4 &192223096 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 204404854} +--- !u!1001 &204404854 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -7.94000006 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -29.2099991 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 107.607872 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .331882596 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .645967066 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .107652754 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .678963482 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 22 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 7.14164066 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 36.2480545 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 12.3940258 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (22) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &212528654 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 25.8199978 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -32.2700005 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: 10.7600002 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .68432802 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .729174376 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 24 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 14 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .480337352 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .524892092 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .48033756 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &212528655 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 212528654} +--- !u!1001 &214063459 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: -3.44949341 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -37.4900017 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: 5.77718258 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.571381092 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .82068485 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 23 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 13 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .519999981 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .519999981 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .520000219 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &214063460 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 214063459} +--- !u!4 &220574451 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 821453216} +--- !u!1001 &222748836 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 51.8300018 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -22.6000004 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 53.4300003 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .823861361 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: -.566791475 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 50 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 11 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .235582978 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .321678489 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .235583097 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &222748837 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 222748836} +--- !u!1001 &227975872 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -2.48707151 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -38.5172424 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 64.7915802 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.502744734 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.391262859 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.0891617313 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .765644431 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 19 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 3.32405567 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 7.4911809 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 4.27362585 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (19) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &249017069 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1411622611} +--- !u!4 &249375209 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 878651697} +--- !u!1001 &249993902 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -9.10999966 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -27.6919994 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -67.5899963 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .173831552 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.730610311 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.544903636 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.372922599 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 37 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 14.6323128 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 16.3657761 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 90.9481812 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (37) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &255979706 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 255979707} + - component: {fileID: 255979709} + - component: {fileID: 255979708} + m_Layer: 0 + m_Name: CrystalLarge2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &255979707 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 255979706} + m_LocalRotation: {x: -0.7334834, y: 0.21147409, z: -0.023269696, w: 0.6455535} + m_LocalPosition: {x: 3.8804, y: -1.4799, z: 0.98225} + m_LocalScale: {x: 0.6988682, y: 0.6988682, z: 1.1159344} + m_Children: [] + m_Father: {fileID: 1629820261} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &255979708 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 255979706} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &255979709 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 255979706} + m_Mesh: {fileID: 4300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &257338147 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.x + value: -8.55000019 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.y + value: -46.6199989 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.z + value: 4.3499999 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_RootOrder + value: 38 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0.7437524 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0.36399427 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: -0.56062937 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -0.0059351735 + objectReference: {fileID: 0} + - target: {fileID: 110852, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_Name + value: Poppy Tree 3 (6) + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &259206132 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 259206133} + - component: {fileID: 259206135} + - component: {fileID: 259206134} + m_Layer: 0 + m_Name: CrystalMed2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &259206133 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 259206132} + m_LocalRotation: {x: -0.44889033, y: 0.010324692, z: -0.015559695, w: 0.8933918} + m_LocalPosition: {x: 3.762, y: -1.8453158, z: 2.482} + m_LocalScale: {x: 0.706294, y: 0.6835654, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 2046381190} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &259206134 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 259206132} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &259206135 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 259206132} + m_Mesh: {fileID: 4300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &260433179 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -77.3199997 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -13.5799999 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -66.6200027 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .167816564 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.825410366 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .52742964 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .111145727 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 32 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 10.4347544 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 11.6709394 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 64.8579712 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (32) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &265090247 stripped +Transform: + m_PrefabParentObject: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_PrefabInternal: {fileID: 257338147} +--- !u!1 &269562303 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 269562304} + - component: {fileID: 269562306} + - component: {fileID: 269562305} + m_Layer: 0 + m_Name: CrystalSmall3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &269562304 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 269562303} + m_LocalRotation: {x: -0.5680182, y: -0.31962526, z: -0.08119062, w: 0.7540578} + m_LocalPosition: {x: -5.8461113, y: 2.5964613, z: 0.45928955} + m_LocalScale: {x: 5, y: 5, z: 9.499289} + m_Children: [] + m_Father: {fileID: 512280415} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &269562305 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 269562303} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &269562306 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 269562303} + m_Mesh: {fileID: 4300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &274368092 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 2022471510} +--- !u!1001 &277811516 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -37.8703041 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -30.8899994 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -8.66279984 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .832378149 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .217695683 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.309965193 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.404569954 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 15.396451 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 19.6087818 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 6.75155306 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (12) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &283506050 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 283506051} + m_Layer: 0 + m_Name: Crystal (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &283506051 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 283506050} + m_LocalRotation: {x: 0.14360884, y: 0.79558796, z: -0.38303116, w: -0.4468821} + m_LocalPosition: {x: -72.214, y: -16.85, z: 84.15} + m_LocalScale: {x: 1.2496787, y: 1.2496787, z: 1.2496787} + m_Children: + - {fileID: 1398649091} + - {fileID: 513820710} + - {fileID: 1301257112} + - {fileID: 1834337759} + - {fileID: 1101107754} + - {fileID: 999099942} + m_Father: {fileID: 95974160} + m_RootOrder: 52 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &287519405 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 287519408} + - component: {fileID: 287519407} + - component: {fileID: 287519406} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &287519406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 287519405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &287519407 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 287519405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &287519408 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 287519405} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &309980128 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + m_PrefabInternal: {fileID: 2010138577} + m_GameObject: {fileID: 715335706} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2038266179} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &316164335 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -21.7424679 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -8.40190411 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 32.3310089 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .112901852 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .290061563 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.534409463 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.785826981 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 28 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 2.0913825 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 2.88929915 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 5.88933039 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (28) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: e5cb26d4baa613442968b28bc2730634, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &320903598 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 320903599} + - component: {fileID: 320903601} + - component: {fileID: 320903600} + m_Layer: 0 + m_Name: CrystalSmall2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &320903599 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 320903598} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0.5158663, y: 0, z: 0.45529833} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1647423913} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &320903600 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 320903598} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &320903601 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 320903598} + m_Mesh: {fileID: 4300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &327757356 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 327757357} + - component: {fileID: 327757359} + - component: {fileID: 327757358} + m_Layer: 0 + m_Name: CrystalLarge4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &327757357 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 327757356} + m_LocalRotation: {x: -0.70029235, y: 0.09793186, z: -0.09793186, w: 0.70029235} + m_LocalPosition: {x: 1.840889, y: -0.54353905, z: 0.5074272} + m_LocalScale: {x: 5.9000006, y: 5.900001, z: 9.420965} + m_Children: [] + m_Father: {fileID: 512280415} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &327757358 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 327757356} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &327757359 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 327757356} + m_Mesh: {fileID: 4300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &328900847 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 328900848} + - component: {fileID: 328900850} + - component: {fileID: 328900849} + m_Layer: 0 + m_Name: CrystalMed3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &328900848 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 328900847} + m_LocalRotation: {x: -0.5555126, y: 0.20978862, z: 0.00586126, w: 0.804587} + m_LocalPosition: {x: 4.299, y: -1.557, z: 1.656} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1647423913} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &328900849 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 328900847} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &328900850 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 328900847} + m_Mesh: {fileID: 4300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &332367065 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -22.4608402 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -10.3370409 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 33.6749611 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .149284869 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .598418117 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .542073727 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.570759058 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 27 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 2.79331374 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 3.85903621 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 4.64739895 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (27) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: e5cb26d4baa613442968b28bc2730634, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &352304243 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 352304244} + m_Layer: 0 + m_Name: Crystal (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &352304244 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 352304243} + m_LocalRotation: {x: 0.059144445, y: 0.6196413, z: 0.778859, w: -0.076975115} + m_LocalPosition: {x: -68.070915, y: -55.36, z: -8.090956} + m_LocalScale: {x: 0.8717434, y: 0.87174296, z: 0.87174374} + m_Children: + - {fileID: 2110535175} + - {fileID: 417141007} + - {fileID: 1749595407} + - {fileID: 1533433732} + - {fileID: 1404491860} + - {fileID: 1866720454} + m_Father: {fileID: 95974160} + m_RootOrder: 55 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &362005190 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 362005191} + m_Layer: 0 + m_Name: Trees + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &362005191 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 362005190} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 13.689493, y: 2.1697388, z: 10.172817} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2004733925} + - {fileID: 1882740559} + - {fileID: 1499366281} + - {fileID: 1237428177} + - {fileID: 723885306} + - {fileID: 1787324654} + - {fileID: 2040345155} + - {fileID: 1241841766} + - {fileID: 1908802881} + - {fileID: 1994173264} + - {fileID: 666188727} + - {fileID: 1717673916} + - {fileID: 1083168593} + - {fileID: 734872798} + - {fileID: 931057005} + - {fileID: 2055964771} + - {fileID: 1888712540} + - {fileID: 1588089087} + - {fileID: 560831150} + - {fileID: 1325970265} + - {fileID: 1361043802} + - {fileID: 169780363} + - {fileID: 1486275504} + - {fileID: 214063460} + - {fileID: 212528655} + - {fileID: 657374850} + - {fileID: 1999325530} + - {fileID: 1463137094} + - {fileID: 2025839430} + - {fileID: 1260727565} + - {fileID: 482223844} + - {fileID: 760048890} + - {fileID: 791683805} + - {fileID: 1643053031} + - {fileID: 662561658} + - {fileID: 821214464} + - {fileID: 1660457360} + - {fileID: 1538392704} + - {fileID: 265090247} + - {fileID: 1995955653} + - {fileID: 1869081842} + - {fileID: 53737153} + - {fileID: 1119024280} + - {fileID: 791070205} + - {fileID: 887822950} + - {fileID: 1909850844} + - {fileID: 2006142291} + - {fileID: 1307236236} + - {fileID: 478883451} + - {fileID: 76569194} + - {fileID: 222748837} + - {fileID: 2036665019} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &365534681 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 365534682} + - component: {fileID: 365534684} + - component: {fileID: 365534683} + m_Layer: 0 + m_Name: CrystalSmall2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &365534682 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 365534681} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0.5158663, y: 0, z: 0.45529833} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2046381190} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &365534683 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 365534681} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &365534684 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 365534681} + m_Mesh: {fileID: 4300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &382258745 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 382258746} + - component: {fileID: 382258748} + - component: {fileID: 382258747} + m_Layer: 0 + m_Name: CrystalLarge3 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &382258746 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382258745} + m_LocalRotation: {x: -0.74135864, y: 0.1837617, z: 0.3576558, w: 0.53730947} + m_LocalPosition: {x: 2.7816796, y: -0.9848208, z: 0.9939766} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1629820261} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &382258747 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382258745} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &382258748 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 382258745} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &391558033 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -32.1176414 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: 6.71117973 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 48.7339478 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.50405854 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .18576166 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.129694164 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.833424926 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 2.0913837 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 2.88929939 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 10.9645662 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (30) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: e5cb26d4baa613442968b28bc2730634, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &417141006 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 417141007} + - component: {fileID: 417141009} + - component: {fileID: 417141008} + m_Layer: 0 + m_Name: CrystalLarge4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &417141007 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 417141006} + m_LocalRotation: {x: -0.70029235, y: 0.09793186, z: -0.09793186, w: 0.70029235} + m_LocalPosition: {x: 1.840889, y: -0.54353905, z: 0.5074272} + m_LocalScale: {x: 5.9000006, y: 5.900001, z: 9.420965} + m_Children: [] + m_Father: {fileID: 352304244} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &417141008 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 417141006} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &417141009 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 417141006} + m_Mesh: {fileID: 4300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &434550740 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 434550741} + - component: {fileID: 434550743} + - component: {fileID: 434550742} + m_Layer: 0 + m_Name: CrystalLarge3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &434550741 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 434550740} + m_LocalRotation: {x: -0.6370788, y: -0.09566541, z: -0.04889991, w: 0.7632742} + m_LocalPosition: {x: -1.99, y: 13.16, z: 7.14} + m_LocalScale: {x: 9.405651, y: 9.405649, z: 15.018691} + m_Children: [] + m_Father: {fileID: 657520971} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &434550742 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 434550740} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &434550743 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 434550740} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &436409037 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 436409038} + - component: {fileID: 436409040} + - component: {fileID: 436409039} + m_Layer: 0 + m_Name: CrystalMed3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &436409038 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 436409037} + m_LocalRotation: {x: -0.5555126, y: 0.20978862, z: 0.00586126, w: 0.804587} + m_LocalPosition: {x: 4.299, y: -1.557, z: 1.656} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1225114906} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &436409039 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 436409037} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &436409040 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 436409037} + m_Mesh: {fileID: 4300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &456006742 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1024648757} +--- !u!1001 &478263182 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: 12.0169659 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -9.60427761 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -73.5355377 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .26079151 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .631015599 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.547623456 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .48364839 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 38 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.53783751 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 18.9563847 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 105.34478 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (38) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &478883450 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 64.4599991 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -5.94000006 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 39.9500008 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .823861361 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: -.566791475 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 10 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .235582873 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .321678489 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .235582992 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &478883451 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 478883450} +--- !u!1001 &482223843 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.x + value: 54.6987152 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.y + value: -9.75 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.z + value: -25.7435112 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.y + value: .794952273 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.w + value: .606672049 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_RootOrder + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 139996, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_Name + value: Poppy Tree 2 (1) + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &482223844 stripped +Transform: + m_PrefabParentObject: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_PrefabInternal: {fileID: 482223843} +--- !u!4 &491594628 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 708628709} +--- !u!1 &497926796 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 497926797} + - component: {fileID: 497926801} + - component: {fileID: 497926800} + - component: {fileID: 497926799} + - component: {fileID: 497926798} + m_Layer: 5 + m_Name: FPS + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &497926797 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 497926796} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 864.1, y: 490.07996} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &497926798 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 497926796} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &497926799 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 497926796} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &497926800 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 497926796} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'FPS: 60' +--- !u!222 &497926801 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 497926796} +--- !u!4 &511411384 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1727291815} +--- !u!1 &512280414 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 512280415} + m_Layer: 0 + m_Name: Crystal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &512280415 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 512280414} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -94.52, y: -18.61, z: 59.16} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1431464299} + - {fileID: 327757357} + - {fileID: 1715842955} + - {fileID: 2087962260} + - {fileID: 269562304} + - {fileID: 2141267825} + m_Father: {fileID: 95974160} + m_RootOrder: 48 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &513820709 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 513820710} + - component: {fileID: 513820712} + - component: {fileID: 513820711} + m_Layer: 0 + m_Name: CrystalLarge4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &513820710 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 513820709} + m_LocalRotation: {x: -0.70029235, y: 0.09793186, z: -0.09793186, w: 0.70029235} + m_LocalPosition: {x: 1.840889, y: -0.54353905, z: 0.5074272} + m_LocalScale: {x: 5.9000006, y: 5.900001, z: 9.420965} + m_Children: [] + m_Father: {fileID: 283506051} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &513820711 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 513820709} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &513820712 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 513820709} + m_Mesh: {fileID: 4300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &515100666 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 515100667} + - component: {fileID: 515100669} + - component: {fileID: 515100668} + m_Layer: 0 + m_Name: CrystalSmall4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &515100667 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 515100666} + m_LocalRotation: {x: -0.47365332, y: -0.031788133, z: -0.24821082, w: 0.8444131} + m_LocalPosition: {x: -1.4276123, y: -1.9500399, z: 4.413578} + m_LocalScale: {x: 4.5792894, y: 4.5792894, z: 7.8722076} + m_Children: [] + m_Father: {fileID: 657520971} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &515100668 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 515100666} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &515100669 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 515100666} + m_Mesh: {fileID: 4300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &519404019 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: 6.6500001 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -18.0501442 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -69.8700027 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .204131842 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .787529767 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.575102627 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.0859315172 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 40 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.53783894 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 9.1435194 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 60.4621696 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (40) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &536319872 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 536319873} + - component: {fileID: 536319875} + - component: {fileID: 536319874} + m_Layer: 0 + m_Name: CrystalLarge1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &536319873 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 536319872} + m_LocalRotation: {x: -0.69349414, y: -0.110060565, z: 0.024316499, w: 0.71159065} + m_LocalPosition: {x: 3.2056, y: -0.29285, z: 1.6311} + m_LocalScale: {x: 1.8091333, y: 1.5563307, z: 1.9480637} + m_Children: [] + m_Father: {fileID: 1647423913} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &536319874 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 536319872} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &536319875 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 536319872} + m_Mesh: {fileID: 4300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &560831149 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 23.539999 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -35.9700012 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -2.98999977 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.879018962 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.476786882 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 18 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 18 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .519999862 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .519999981 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .520000219 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &560831150 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 560831149} +--- !u!1 &562534186 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 562534187} + - component: {fileID: 562534189} + - component: {fileID: 562534188} + m_Layer: 0 + m_Name: CrystalLarge3 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &562534187 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 562534186} + m_LocalRotation: {x: -0.74135864, y: 0.1837617, z: 0.3576558, w: 0.53730947} + m_LocalPosition: {x: 2.7816796, y: -0.9848208, z: 0.9939766} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1188902570} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &562534188 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 562534186} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &562534189 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 562534186} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &566506295 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 566506296} + - component: {fileID: 566506298} + - component: {fileID: 566506297} + m_Layer: 0 + m_Name: CrystalMed2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &566506296 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 566506295} + m_LocalRotation: {x: -0.44889033, y: 0.010324692, z: -0.015559695, w: 0.8933918} + m_LocalPosition: {x: 3.762, y: -1.8453158, z: 2.482} + m_LocalScale: {x: 0.706294, y: 0.6835654, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1188902570} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &566506297 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 566506295} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &566506298 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 566506295} + m_Mesh: {fileID: 4300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &579881703 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -87.2699966 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -31.9400005 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -18.8999996 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .49990052 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .136217043 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.0220562816 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.855019271 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 43 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 10.4347582 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 26.4632072 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 64.8579712 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (43) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &603646788 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 603646789} + - component: {fileID: 603646791} + - component: {fileID: 603646790} + - component: {fileID: 603646793} + - component: {fileID: 603646792} + m_Layer: 5 + m_Name: Cone Trace Steps + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &603646789 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 603646788} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -934, y: 417.9} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &603646790 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 603646788} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Cone Trace Steps: 8' +--- !u!222 &603646791 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 603646788} +--- !u!114 &603646792 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 603646788} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &603646793 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 603646788} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!1 &611785419 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 611785420} + - component: {fileID: 611785422} + - component: {fileID: 611785421} + m_Layer: 0 + m_Name: CrystalMed1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &611785420 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 611785419} + m_LocalRotation: {x: -0.83456016, y: 0.15312554, z: 0.20988719, w: 0.4858079} + m_LocalPosition: {x: -2.62, y: 11.37, z: 1.07} + m_LocalScale: {x: 4.5, y: 4.5, z: 11.510697} + m_Children: [] + m_Father: {fileID: 657520971} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &611785421 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 611785419} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &611785422 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 611785419} + m_Mesh: {fileID: 4300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &616291744 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 616291745} + - component: {fileID: 616291747} + - component: {fileID: 616291746} + m_Layer: 0 + m_Name: CrystalLarge4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &616291745 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 616291744} + m_LocalRotation: {x: -0.70029235, y: 0.09793186, z: -0.09793186, w: 0.70029235} + m_LocalPosition: {x: -0.86, y: 4.2, z: 6.71} + m_LocalScale: {x: 5.3697915, y: 5.369792, z: 8.574342} + m_Children: [] + m_Father: {fileID: 657520971} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &616291746 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 616291744} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &616291747 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 616291744} + m_Mesh: {fileID: 4300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &619121687 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 332367065} +--- !u!1001 &630721403 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -28.8247299 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -3.42000008 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 21.3945732 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .415058196 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .166891158 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.206626192 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .870160758 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 16.9050579 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 38.0976791 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 16.0239239 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (2) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &647203243 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 647203244} + - component: {fileID: 647203246} + - component: {fileID: 647203245} + m_Layer: 0 + m_Name: CrystalSmall2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &647203244 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647203243} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0.5158663, y: 0, z: 0.45529833} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1629820261} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &647203245 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647203243} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &647203246 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647203243} + m_Mesh: {fileID: 4300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &657374849 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 33.4599991 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -25.4300003 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -54.3300018 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .882109165 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .471045107 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 25 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 15 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .5200001 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .519999981 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .520000398 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &657374850 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 657374849} +--- !u!1 &657520970 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 657520971} + m_Layer: 0 + m_Name: Crystal (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &657520971 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 657520970} + m_LocalRotation: {x: 0.9182468, y: 0.016276196, z: -0.16571158, w: 0.3593014} + m_LocalPosition: {x: -38.90725, y: 3.3279808, z: 51.40316} + m_LocalScale: {x: 0.9657354, y: 0.96573496, z: 0.96573573} + m_Children: + - {fileID: 434550741} + - {fileID: 616291745} + - {fileID: 611785420} + - {fileID: 1048579352} + - {fileID: 47707902} + - {fileID: 515100667} + m_Father: {fileID: 95974160} + m_RootOrder: 53 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &658115972 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -45.4900017 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -7.36999989 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 26.9400005 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .642877936 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.289136142 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .628629386 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .32853207 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 28.9016132 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 65.1334839 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 27.3952103 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (6) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &662561658 stripped +Transform: + m_PrefabParentObject: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_PrefabInternal: {fileID: 980127969} +--- !u!1001 &666188726 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 6.1605072 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -34.0600014 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: 7.77718353 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .0401011147 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .999195635 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 10 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .584554017 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .806421101 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .584554017 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &666188727 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 666188726} +--- !u!1 &677325987 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 677325988} + - component: {fileID: 677325990} + - component: {fileID: 677325989} + m_Layer: 0 + m_Name: CrystalLarge2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &677325988 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 677325987} + m_LocalRotation: {x: -0.7334834, y: 0.21147409, z: -0.023269696, w: 0.6455535} + m_LocalPosition: {x: 3.8804, y: -1.4799, z: 0.98225} + m_LocalScale: {x: 0.6988682, y: 0.6988682, z: 1.1159344} + m_Children: [] + m_Father: {fileID: 1363094077} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &677325989 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 677325987} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &677325990 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 677325987} + m_Mesh: {fileID: 4300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &678579344 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 478263182} +--- !u!1 &680391700 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 680391701} + - component: {fileID: 680391703} + - component: {fileID: 680391702} + - component: {fileID: 680391704} + m_Layer: 0 + m_Name: Sand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &680391701 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 680391700} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -18.31092, y: 1.136261, z: 10.315361} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117909684} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &680391702 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300008, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 680391700} + m_Enabled: 1 + m_CastShadows: 2 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: e9315620aefa1134b877c0c4065ad989, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &680391703 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300008, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 680391700} + m_Mesh: {fileID: 4300008, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!64 &680391704 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 680391700} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300008, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!4 &689899177 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1988105804} +--- !u!4 &708320663 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 260433179} +--- !u!1001 &708628709 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -30.3272705 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -28.9192028 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -66.6752014 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.115654789 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.731423318 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .447366983 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.50150454 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 36 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 12.4166956 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 5.92651224 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 30.51507 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (36) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &715335706 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 2010138577} + serializedVersion: 5 + m_Component: + - component: {fileID: 309980128} + m_Layer: 0 + m_Name: Missing Prefab (Dummy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &722621865 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100000, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 722621866} + - component: {fileID: 722621868} + - component: {fileID: 722621867} + - component: {fileID: 722621869} + m_Layer: 0 + m_Name: Grass + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &722621866 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400000, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 722621865} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -18.31092, y: 1.136261, z: 10.315361} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117909684} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &722621867 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300000, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 722621865} + m_Enabled: 1 + m_CastShadows: 2 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: cf749d0050f23f140b3c993d2a03f6e5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &722621868 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300000, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 722621865} + m_Mesh: {fileID: 4300004, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!64 &722621869 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 722621865} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300004, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!1001 &723010930 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.x + value: -77.1948929 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.y + value: -15.4700012 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.z + value: 27.7806473 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.y + value: -.461148739 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.w + value: .887322843 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_RootOrder + value: 37 + objectReference: {fileID: 0} + - target: {fileID: 139996, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_Name + value: Poppy Tree 2 (3) + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &723885305 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 63.9423447 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -10.2299995 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -31.9193401 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .907561362 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .41991958 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 4 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .562071204 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .708131373 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .562071323 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &723885306 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 723885305} +--- !u!1001 &734872797 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: -2.48999977 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -36.4700012 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -36.7099991 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.99307996 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.117440805 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 13 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 13 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .5 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .5 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .5 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &734872798 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 734872797} +--- !u!1001 &745449033 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -36.75 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -32.0099983 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -5.28000021 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.797628462 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .0330553465 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .0525535047 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.599945307 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 11 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 12.0383415 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 13.4644823 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 18.3530693 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (11) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &748123005 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 748123006} + - component: {fileID: 748123008} + - component: {fileID: 748123007} + m_Layer: 0 + m_Name: CrystalMed2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &748123006 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 748123005} + m_LocalRotation: {x: -0.44889033, y: 0.010324692, z: -0.015559695, w: 0.8933918} + m_LocalPosition: {x: 3.762, y: -1.8453158, z: 2.482} + m_LocalScale: {x: 0.706294, y: 0.6835654, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1363094077} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &748123007 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 748123005} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &748123008 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 748123005} + m_Mesh: {fileID: 4300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &755514122 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 630721403} +--- !u!4 &760048890 stripped +Transform: + m_PrefabParentObject: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + m_PrefabInternal: {fileID: 1932419681} +--- !u!1 &767697641 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 767697642} + - component: {fileID: 767697644} + - component: {fileID: 767697643} + - component: {fileID: 767697646} + - component: {fileID: 767697645} + m_Layer: 5 + m_Name: Voxel Resolution + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &767697642 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767697641} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -934, y: 490.08} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &767697643 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767697641} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Voxel Resolution: 256' +--- !u!222 &767697644 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767697641} +--- !u!114 &767697645 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767697641} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &767697646 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 767697641} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!1001 &791070204 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 20.6000004 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -43.7799988 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 66.5 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .957241595 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: .289289862 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 43 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 4 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .220170513 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .244533062 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .220170587 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &791070205 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 791070204} +--- !u!4 &791683805 stripped +Transform: + m_PrefabParentObject: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_PrefabInternal: {fileID: 126942213} +--- !u!1 &801009546 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 801009547} + - component: {fileID: 801009549} + - component: {fileID: 801009548} + - component: {fileID: 801009550} + m_Layer: 0 + m_Name: Cave + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &801009547 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801009546} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -18.31092, y: 1.136261, z: 10.315361} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117909684} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &801009548 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300010, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801009546} + m_Enabled: 1 + m_CastShadows: 2 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 1a31f5631315f554c872f8b422446490, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &801009549 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300010, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801009546} + m_Mesh: {fileID: 4300010, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!64 &801009550 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 801009546} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300010, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!1 &813110763 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 813110764} + - component: {fileID: 813110766} + - component: {fileID: 813110765} + m_Layer: 0 + m_Name: CrystalLarge1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &813110764 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 813110763} + m_LocalRotation: {x: -0.69349414, y: -0.110060565, z: 0.024316499, w: 0.71159065} + m_LocalPosition: {x: 3.2056, y: -0.29285, z: 1.6311} + m_LocalScale: {x: 1.8091333, y: 1.5563307, z: 1.9480637} + m_Children: [] + m_Father: {fileID: 2046381190} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &813110765 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 813110763} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &813110766 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 813110763} + m_Mesh: {fileID: 4300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &821214464 stripped +Transform: + m_PrefabParentObject: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_PrefabInternal: {fileID: 1896384728} +--- !u!1001 &821453216 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: 30.0362453 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -19.8881226 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -77.3882751 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.458687693 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .215427905 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.518739879 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .688553095 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 41 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 80.4863205 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 18.9563866 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 34.0300179 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (41) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &824669963 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 391558033} +--- !u!4 &860546618 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1817044207} +--- !u!1001 &871331044 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -34.3588257 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -22.9000568 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -75.095253 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.423905075 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .325468153 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .809147418 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .244244769 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 17 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 20.2861977 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 9.68263626 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 49.8550224 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (17) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &872431993 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 984631454} +--- !u!1 &873374784 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 873374785} + - component: {fileID: 873374787} + - component: {fileID: 873374786} + m_Layer: 0 + m_Name: CrystalLarge3 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &873374785 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 873374784} + m_LocalRotation: {x: -0.90101284, y: 0.038158353, z: 0.0033964803, w: 0.43209752} + m_LocalPosition: {x: 2.53, y: -1.979, z: 0.279} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1363094077} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &873374786 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 873374784} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &873374787 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 873374784} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &878651697 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: 37.257473 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -20.3644848 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -72.4076309 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .0813386813 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.565838933 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.645683289 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .506264269 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 42 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.53784513 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 9.14352036 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 60.4621964 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (42) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &887822949 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 22.0425129 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -39.6399994 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 42.8708229 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .999951661 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: .00983540528 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 44 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 5 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .220170587 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .300634116 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .220170632 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &887822950 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 887822949} +--- !u!1001 &888367829 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.x + value: -1.70000005 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.y + value: -15.4700003 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.z + value: 51.7400017 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_RootOrder + value: 27 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &891681124 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 891681125} + - component: {fileID: 891681127} + - component: {fileID: 891681126} + m_Layer: 0 + m_Name: CrystalMed2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &891681125 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 891681124} + m_LocalRotation: {x: -0.44889033, y: 0.010324692, z: -0.015559695, w: 0.8933918} + m_LocalPosition: {x: 3.762, y: -1.8453158, z: 2.482} + m_LocalScale: {x: 0.706294, y: 0.6835654, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1629820261} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &891681126 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 891681124} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &891681127 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 891681124} + m_Mesh: {fileID: 4300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &931057004 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 37.6800003 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -38.4000015 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: 3.5 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .0401011147 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .999195635 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 14 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 14 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .584554017 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .806421101 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .584554017 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &931057005 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 931057004} +--- !u!4 &950691909 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 519404019} +--- !u!1001 &980127969 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.x + value: -22.3194866 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.y + value: 11.6499996 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalPosition.z + value: -33.832634 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.y + value: .683301091 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_LocalRotation.w + value: .730136812 + objectReference: {fileID: 0} + - target: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_RootOrder + value: 34 + objectReference: {fileID: 0} + - target: {fileID: 139996, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + propertyPath: m_Name + value: Poppy Tree 2 (2) + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &980912352 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: 39.869976 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -21.9200001 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 103.359589 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .141584843 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .198650599 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.95827806 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.148979604 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 24 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 7.14164066 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 23.0373192 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 12.3940201 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (24) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &984631454 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -38.1500015 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -30.4200001 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -2.58999991 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .353714347 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .753343284 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .396720111 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.387263834 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 13 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 3.7043364 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 4.08566809 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 11.4095135 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (13) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &999099941 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 999099942} + - component: {fileID: 999099944} + - component: {fileID: 999099943} + m_Layer: 0 + m_Name: CrystalSmall4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &999099942 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 999099941} + m_LocalRotation: {x: -0.47365332, y: -0.031788133, z: -0.24821082, w: 0.8444131} + m_LocalPosition: {x: -1.4276123, y: -1.9500399, z: 4.413578} + m_LocalScale: {x: 4.5792894, y: 4.5792894, z: 7.8722076} + m_Children: [] + m_Father: {fileID: 283506051} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &999099943 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 999099941} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &999099944 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 999099941} + m_Mesh: {fileID: 4300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1013435734 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1013435735} + - component: {fileID: 1013435737} + - component: {fileID: 1013435736} + m_Layer: 0 + m_Name: CrystalMed3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1013435735 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1013435734} + m_LocalRotation: {x: -0.5555126, y: 0.20978862, z: 0.00586126, w: 0.804587} + m_LocalPosition: {x: 4.299, y: -1.557, z: 1.656} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1188902570} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1013435736 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1013435734} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1013435737 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1013435734} + m_Mesh: {fileID: 4300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1024648757 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -31.6268291 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: 4.87914705 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 47.7085533 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.729916811 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.0278679375 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .388761908 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .561523795 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 29 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 2.0913837 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 2.88929987 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 10.9645662 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (29) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: e5cb26d4baa613442968b28bc2730634, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1027570844 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1027570845} + - component: {fileID: 1027570847} + - component: {fileID: 1027570846} + m_Layer: 0 + m_Name: CrystalLarge2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1027570845 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1027570844} + m_LocalRotation: {x: -0.7334834, y: 0.21147409, z: -0.023269696, w: 0.6455535} + m_LocalPosition: {x: 3.8804, y: -1.4799, z: 0.98225} + m_LocalScale: {x: 0.6988682, y: 0.6988682, z: 1.1159344} + m_Children: [] + m_Father: {fileID: 1225114906} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1027570846 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1027570844} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1027570847 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1027570844} + m_Mesh: {fileID: 4300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1039794783 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1039794784} + - component: {fileID: 1039794786} + - component: {fileID: 1039794785} + m_Layer: 0 + m_Name: CrystalSmall2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &1039794784 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1039794783} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0.5158663, y: 0, z: 0.45529833} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1188902570} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1039794785 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1039794783} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1039794786 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1039794783} + m_Mesh: {fileID: 4300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1048579351 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1048579352} + - component: {fileID: 1048579354} + - component: {fileID: 1048579353} + m_Layer: 0 + m_Name: CrystalSmall1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1048579352 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1048579351} + m_LocalRotation: {x: -0.5852398, y: 0.11536342, z: 0.0040016575, w: 0.8026018} + m_LocalPosition: {x: 2.23, y: 9.66, z: 10.81} + m_LocalScale: {x: 6.433442, y: 6.4334397, z: 14.281688} + m_Children: [] + m_Father: {fileID: 657520971} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1048579353 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1048579351} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1048579354 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1048579351} + m_Mesh: {fileID: 4300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1069245713 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1069245714} + - component: {fileID: 1069245716} + - component: {fileID: 1069245715} + m_Layer: 0 + m_Name: CrystalLarge3 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1069245714 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1069245713} + m_LocalRotation: {x: -0.74135864, y: 0.1837617, z: 0.3576558, w: 0.53730947} + m_LocalPosition: {x: 2.7816796, y: -0.9848208, z: 0.9939766} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 2046381190} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1069245715 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1069245713} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1069245716 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1069245713} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &1075074936 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1934088767} +--- !u!1001 &1083168592 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 14.6605072 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -34.0800018 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: 5.65718269 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .68432802 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .729174376 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 12 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .480337232 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .524892092 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .480337441 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1083168593 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1083168592} +--- !u!1 &1101107753 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1101107754} + - component: {fileID: 1101107756} + - component: {fileID: 1101107755} + m_Layer: 0 + m_Name: CrystalSmall3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1101107754 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1101107753} + m_LocalRotation: {x: -0.5680182, y: -0.31962526, z: -0.08119062, w: 0.7540578} + m_LocalPosition: {x: -5.8461113, y: 2.5964613, z: 0.45928955} + m_LocalScale: {x: 5, y: 5, z: 9.499289} + m_Children: [] + m_Father: {fileID: 283506051} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1101107755 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1101107753} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1101107756 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1101107753} + m_Mesh: {fileID: 4300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1117909683 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100002, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1117909684} + m_Layer: 0 + m_Name: Grassy Terrain 01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1117909684 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400002, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1117909683} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -43.9, z: 0} + m_LocalScale: {x: 0.5, y: 0.81458336, z: 0.5} + m_Children: + - {fileID: 722621866} + - {fileID: 1222109812} + - {fileID: 680391701} + - {fileID: 1654534488} + - {fileID: 801009547} + - {fileID: 1847463903} + - {fileID: 1993973926} + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1119024279 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 37.9100037 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -36.4199982 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 51.5 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .554848373 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: .831951499 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 42 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 3 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .220170513 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .283206344 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .220170557 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1119024280 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 1119024279} +--- !u!1001 &1132893704 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: 20.5172234 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -14.1362305 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -69.0998154 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .61060518 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .539963603 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .155448213 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .558065057 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 39 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.53783894 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 18.9563866 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 105.344818 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (39) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1144947351 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -8.3295002 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -38.0900002 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 14.8314953 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.258267015 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .78507936 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .555873573 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .0891814381 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 4.51068544 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 10.1654091 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 5.79923725 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (7) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1150205514 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -75.3379974 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -23.1573582 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -62.5345154 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .441704154 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .270837486 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.26075846 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.814585567 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 33 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 10.4347572 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 11.6709414 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 64.8579788 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (33) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1154633240 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1154633241} + - component: {fileID: 1154633243} + - component: {fileID: 1154633242} + m_Layer: 0 + m_Name: CrystalLarge1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1154633241 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1154633240} + m_LocalRotation: {x: -0.69349414, y: -0.110060565, z: 0.024316499, w: 0.71159065} + m_LocalPosition: {x: 3.2056, y: -0.29285, z: 1.6311} + m_LocalScale: {x: 1.8091333, y: 1.5563307, z: 1.9480637} + m_Children: [] + m_Father: {fileID: 1188902570} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1154633242 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1154633240} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1154633243 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1154633240} + m_Mesh: {fileID: 4300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1155132416 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -101.139999 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -24.0119991 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -29.2000008 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.172157481 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.480949998 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.773188531 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .375803739 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 44 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 29.9906216 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 26.7475014 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 87.1972733 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (44) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1166636601 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 980912352} +--- !u!1001 &1169763339 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -42.7599983 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -17.0799999 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 13.1216698 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .262150288 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .486203581 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.225452632 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .80253005 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 16.9050407 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 67.4141388 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 9.05559254 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (3) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1188902569 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1188902570} + m_Layer: 0 + m_Name: Crystalb (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1188902570 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1188902569} + m_LocalRotation: {x: 0, y: 0.6965291, z: 0, w: -0.71752864} + m_LocalPosition: {x: -61.68, y: 3.75, z: 61.81} + m_LocalScale: {x: 7.967903, y: 7.9679003, z: 7.967906} + m_Children: + - {fileID: 1154633241} + - {fileID: 1287730603} + - {fileID: 566506296} + - {fileID: 1013435735} + - {fileID: 59863364} + - {fileID: 1039794784} + - {fileID: 562534187} + m_Father: {fileID: 95974160} + m_RootOrder: 51 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1196032080 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1196032081} + - component: {fileID: 1196032085} + - component: {fileID: 1196032084} + - component: {fileID: 1196032083} + - component: {fileID: 1196032082} + m_Layer: 5 + m_Name: Spawned Objects + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1196032081 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1196032080} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -934, y: -521.35} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1196032082 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1196032080} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &1196032083 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1196032080} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &1196032084 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1196032080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Spawned Objects: 10' +--- !u!222 &1196032085 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1196032080} +--- !u!1 &1222109811 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100006, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1222109812} + - component: {fileID: 1222109814} + - component: {fileID: 1222109813} + - component: {fileID: 1222109815} + m_Layer: 0 + m_Name: Rock + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1222109812 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400006, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1222109811} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -18.31092, y: 1.136261, z: 10.315361} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117909684} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1222109813 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1222109811} + m_Enabled: 1 + m_CastShadows: 2 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 1a31f5631315f554c872f8b422446490, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1222109814 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1222109811} + m_Mesh: {fileID: 4300000, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!64 &1222109815 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1222109811} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300000, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!1 &1225114905 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1225114906} + m_Layer: 0 + m_Name: Crystalb (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1225114906 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1225114905} + m_LocalRotation: {x: 0, y: 0.98955804, z: 0, w: 0.14413561} + m_LocalPosition: {x: -71.540634, y: 0.54, z: 72.553825} + m_LocalScale: {x: 7.9678974, y: 7.9679003, z: 7.9679003} + m_Children: + - {fileID: 1259480013} + - {fileID: 1027570845} + - {fileID: 1750593959} + - {fileID: 436409038} + - {fileID: 1397007349} + - {fileID: 2073412894} + - {fileID: 2077310718} + m_Father: {fileID: 95974160} + m_RootOrder: 49 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1226602410 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -1.5202049 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -38.9900017 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 71.5614471 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.576059163 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.298186004 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .410987496 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.640570223 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 20 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 7.14163303 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 10.5806417 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 6.03612185 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (20) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1236127181 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -2.68974543 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -40.7200012 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -.343100011 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.797954023 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.0239395518 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .00961356796 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.602165937 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.73101711 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 7.52842808 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 5.79923725 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (8) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1237428176 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 41.4800034 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -21.5200005 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -33.9799995 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .603832006 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .79711163 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 3 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .562071204 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .708131373 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .562071204 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1237428177 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1237428176} +--- !u!1001 &1241841765 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 71.1175079 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -8.06000042 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -34.7468185 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .907561362 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .41991958 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 7 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .517979026 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .652581394 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .517979026 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1241841766 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1241841765} +--- !u!4 &1256216630 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 658115972} +--- !u!4 &1258454861 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1712010849} +--- !u!1 &1259480012 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1259480013} + - component: {fileID: 1259480015} + - component: {fileID: 1259480014} + m_Layer: 0 + m_Name: CrystalLarge1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1259480013 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1259480012} + m_LocalRotation: {x: -0.69349414, y: -0.110060565, z: 0.024316499, w: 0.71159065} + m_LocalPosition: {x: 3.2056, y: -0.29285, z: 1.6311} + m_LocalScale: {x: 1.8091333, y: 1.5563307, z: 1.9480637} + m_Children: [] + m_Father: {fileID: 1225114906} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1259480014 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1259480012} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1259480015 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1259480012} + m_Mesh: {fileID: 4300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1260727564 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.x + value: -29.2513618 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.y + value: -46.4399986 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.z + value: -15.3714199 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: .998856246 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -.0478153862 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_RootOrder + value: 29 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0.7437524 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0.36399427 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: -0.56062937 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -0.0059351735 + objectReference: {fileID: 0} + - target: {fileID: 110852, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_Name + value: Poppy Tree 3 (1) + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.x + value: 1.14828432 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.y + value: 1.14828444 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.z + value: 1.14828444 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1260727565 stripped +Transform: + m_PrefabParentObject: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_PrefabInternal: {fileID: 1260727564} +--- !u!4 &1264693488 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 316164335} +--- !u!4 &1283043371 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 745449033} +--- !u!1 &1287730602 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1287730603} + - component: {fileID: 1287730605} + - component: {fileID: 1287730604} + m_Layer: 0 + m_Name: CrystalLarge2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1287730603 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1287730602} + m_LocalRotation: {x: -0.7334834, y: 0.21147409, z: -0.023269696, w: 0.6455535} + m_LocalPosition: {x: 3.8804, y: -1.4799, z: 0.98225} + m_LocalScale: {x: 0.6988682, y: 0.6988682, z: 1.1159344} + m_Children: [] + m_Father: {fileID: 1188902570} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1287730604 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1287730602} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1287730605 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1287730602} + m_Mesh: {fileID: 4300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1297580666 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1297580668} + - component: {fileID: 1297580667} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1297580667 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1297580666} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95068145, b: 0.8161765, a: 1} + m_Intensity: 0.88 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: 3 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.06 + m_NormalBias: 0 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1297580668 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1297580666} + m_LocalRotation: {x: -0.24908103, y: 0.3562131, z: -0.8951235, w: -0.09912073} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1301257111 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1301257112} + - component: {fileID: 1301257114} + - component: {fileID: 1301257113} + m_Layer: 0 + m_Name: CrystalMed1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1301257112 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1301257111} + m_LocalRotation: {x: -0.83456016, y: 0.15312554, z: 0.20988719, w: 0.4858079} + m_LocalPosition: {x: -2.1311111, y: -0.7705393, z: -3.1417732} + m_LocalScale: {x: 4.5, y: 4.5, z: 7.185482} + m_Children: [] + m_Father: {fileID: 283506051} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1301257113 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1301257111} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1301257114 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1301257111} + m_Mesh: {fileID: 4300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1303326938 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -28.0002003 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -42.1800003 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -10.3570004 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .64391613 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .408708364 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.184239194 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .619988203 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 3.70433593 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 4.14318228 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 5.64745617 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (10) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1307236235 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 21.2199993 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -23.9099998 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 21.8400002 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .823861361 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: -.566791475 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 47 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 8 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .235582739 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .321678489 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .235582799 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1307236236 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 1307236235} +--- !u!4 &1316846542 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1432688352} +--- !u!1001 &1318184469 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -25.0900002 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -36.7400017 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -66.1100006 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .464823842 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .274939865 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.797483504 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .26901117 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 35 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 20.2862034 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 31.4226437 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 18.6733189 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (35) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1320592613 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1320592617} + - component: {fileID: 1320592616} + - component: {fileID: 1320592615} + - component: {fileID: 1320592614} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1320592614 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1320592613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1320592615 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1320592613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1320592616 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1320592613} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 1 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1320592617 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1320592613} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 767697642} + - {fileID: 1927565344} + - {fileID: 1379195240} + - {fileID: 603646789} + - {fileID: 1477508400} + - {fileID: 1547018582} + - {fileID: 497926797} + - {fileID: 1196032081} + - {fileID: 2099886014} + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1001 &1325970264 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 4.02000046 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -35.1100006 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -59.9799995 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.988575399 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .150727212 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 19 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 10 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .584554017 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .638775766 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .584554017 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1325970265 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1325970264} +--- !u!1001 &1328203303 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -11.3020163 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -22.7199993 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 106.726532 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.367231399 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .310232371 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.875655472 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.0460935682 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 21 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 7.14163303 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 36.2480125 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 12.3940239 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (21) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1337975597 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1337975598} + m_Layer: 0 + m_Name: Buildings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &1337975598 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1337975597} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 13.689493, y: 2.1697388, z: 10.172817} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1702229617} + - {fileID: 2038266179} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1340841872 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1132893704} +--- !u!4 &1345046897 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1150205514} +--- !u!1001 &1361043801 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 26.4100018 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -31.1499996 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -28.6800003 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.598621428 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.801032126 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 20 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 19 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .562071204 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .699802995 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .562071204 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1361043802 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1361043801} +--- !u!1 &1363094076 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1363094077} + m_Layer: 0 + m_Name: Crystalb (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1363094077 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1363094076} + m_LocalRotation: {x: 0, y: 0.98955804, z: 0, w: 0.14413561} + m_LocalPosition: {x: -59.93, y: -58.708, z: 0.65565} + m_LocalScale: {x: 6.1352854, y: 6.1352825, z: 6.135287} + m_Children: + - {fileID: 1808673462} + - {fileID: 677325988} + - {fileID: 748123006} + - {fileID: 1845159463} + - {fileID: 47722829} + - {fileID: 1996379723} + - {fileID: 873374785} + m_Father: {fileID: 95974160} + m_RootOrder: 54 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1371169592 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1318184469} +--- !u!1 &1379195239 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1379195240} + - component: {fileID: 1379195242} + - component: {fileID: 1379195241} + - component: {fileID: 1379195244} + - component: {fileID: 1379195243} + m_Layer: 5 + m_Name: Cones + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1379195240 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1379195239} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -934, y: 442} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1379195241 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1379195239} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Cones: 20' +--- !u!222 &1379195242 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1379195239} +--- !u!114 &1379195243 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1379195239} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &1379195244 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1379195239} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!1001 &1389322577 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1337975598} + m_Modifications: + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalPosition.x + value: -42.73119 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalPosition.y + value: -40.97 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalPosition.z + value: -8.652468 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.y + value: -0.9589529 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.w + value: 0.28356552 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalScale.z + value: 0.95000005 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1397007348 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1397007349} + - component: {fileID: 1397007351} + - component: {fileID: 1397007350} + m_Layer: 0 + m_Name: CrystalMed4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1397007349 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1397007348} + m_LocalRotation: {x: -0.44836503, y: -0.37477726, z: -0.21497637, w: 0.7824934} + m_LocalPosition: {x: 2.772, y: -1.39, z: 2.0598} + m_LocalScale: {x: 1.4139835, y: 1.4139831, z: 2.2578108} + m_Children: [] + m_Father: {fileID: 1225114906} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1397007350 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1397007348} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1397007351 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1397007348} + m_Mesh: {fileID: 4300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1398649090 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1398649091} + - component: {fileID: 1398649093} + - component: {fileID: 1398649092} + m_Layer: 0 + m_Name: CrystalLarge3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1398649091 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1398649090} + m_LocalRotation: {x: -0.6370788, y: -0.09566541, z: -0.04889991, w: 0.7632742} + m_LocalPosition: {x: -2.5854645, y: 8.259896, z: 2.7370796} + m_LocalScale: {x: 9.405651, y: 9.405649, z: 15.018691} + m_Children: [] + m_Father: {fileID: 283506051} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1398649092 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1398649090} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1398649093 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1398649090} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1404491859 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1404491860} + - component: {fileID: 1404491862} + - component: {fileID: 1404491861} + m_Layer: 0 + m_Name: CrystalSmall3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1404491860 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404491859} + m_LocalRotation: {x: -0.5680182, y: -0.31962526, z: -0.08119062, w: 0.7540578} + m_LocalPosition: {x: -5.8461113, y: 2.5964613, z: 0.45928955} + m_LocalScale: {x: 5, y: 5, z: 9.499289} + m_Children: [] + m_Father: {fileID: 352304244} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1404491861 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404491859} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1404491862 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1404491859} + m_Mesh: {fileID: 4300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1409637237 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1409637238} + - component: {fileID: 1409637240} + - component: {fileID: 1409637239} + m_Layer: 0 + m_Name: CrystalLarge2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1409637238 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1409637237} + m_LocalRotation: {x: -0.7334834, y: 0.21147409, z: -0.023269696, w: 0.6455535} + m_LocalPosition: {x: 3.8804, y: -1.4799, z: 0.98225} + m_LocalScale: {x: 0.6988682, y: 0.6988682, z: 1.1159344} + m_Children: [] + m_Father: {fileID: 1647423913} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1409637239 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1409637237} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1409637240 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1409637237} + m_Mesh: {fileID: 4300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1411622611 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -47.3589592 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -18.9099998 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 6.31715012 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .129215613 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .961121798 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .229031384 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.084218882 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 16.9050446 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 67.4141388 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 9.05558395 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (5) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1413067275 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 579881703} +--- !u!1 &1431464298 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1431464299} + - component: {fileID: 1431464301} + - component: {fileID: 1431464300} + m_Layer: 0 + m_Name: CrystalLarge3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1431464299 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1431464298} + m_LocalRotation: {x: -0.6370788, y: -0.09566541, z: -0.04889991, w: 0.7632742} + m_LocalPosition: {x: -2.5854645, y: 8.259896, z: 2.7370796} + m_LocalScale: {x: 9.405651, y: 9.405649, z: 15.018691} + m_Children: [] + m_Father: {fileID: 512280415} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1431464300 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1431464298} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1431464301 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1431464298} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1432688352 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -78.4599991 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -20.085062 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -64.2200012 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.0335631892 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.605970323 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.670733392 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .426368713 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.73101807 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 7.52842808 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 41.8371315 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (16) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1443715222 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1443715223} + - component: {fileID: 1443715225} + - component: {fileID: 1443715224} + m_Layer: 0 + m_Name: CrystalLarge2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1443715223 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1443715222} + m_LocalRotation: {x: -0.7334834, y: 0.21147409, z: -0.023269696, w: 0.6455535} + m_LocalPosition: {x: 3.8804, y: -1.4799, z: 0.98225} + m_LocalScale: {x: 0.6988682, y: 0.6988682, z: 1.1159344} + m_Children: [] + m_Father: {fileID: 2046381190} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1443715224 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1443715222} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1443715225 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300002, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1443715222} + m_Mesh: {fileID: 4300020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1448437542 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 137426, guid: 7db2b2e3f34da674195b5dfefc2d8f51, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1448437544} + - component: {fileID: 1448437543} + m_Layer: 0 + m_Name: FirstPersonFlyingController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1448437543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 11466882, guid: 7db2b2e3f34da674195b5dfefc2d8f51, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1448437542} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6e0b00f945a6ec441b262a1479fdd3dd, type: 3} + m_Name: + m_EditorClassIdentifier: + speed: 2 + cameraTransform: {fileID: 1689627606} + checkSphere: {fileID: 0} + dontRequireClick: 0 + limitPosition: 0 + minPosition: {x: 0, y: 0, z: 0} + maxPosition: {x: 0, y: 0, z: 0} +--- !u!4 &1448437544 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 419696, guid: 7db2b2e3f34da674195b5dfefc2d8f51, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1448437542} + m_LocalRotation: {x: 0, y: 0.49079344, z: 0, w: -0.871276} + m_LocalPosition: {x: 19.086313, y: -29.280317, z: -18.307138} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1689627606} + m_Father: {fileID: 0} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1457371259 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + m_PrefabInternal: {fileID: 1389322577} + m_GameObject: {fileID: 1523951291} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1702229617} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1463137094 stripped +Transform: + m_PrefabParentObject: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_PrefabInternal: {fileID: 888367829} +--- !u!1 &1477508399 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1477508400} + - component: {fileID: 1477508402} + - component: {fileID: 1477508401} + - component: {fileID: 1477508404} + - component: {fileID: 1477508403} + m_Layer: 5 + m_Name: Infinite Bounces + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1477508400 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1477508399} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -934, y: 393.7} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1477508401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1477508399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Infinite Bounces: On' +--- !u!222 &1477508402 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1477508399} +--- !u!114 &1477508403 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1477508399} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &1477508404 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1477508399} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!1001 &1486275503 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 2.51050758 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -40.0699997 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -11.9728174 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .987571597 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.157169968 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 22 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 12 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .584553838 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .638775766 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .584554136 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1486275504 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1486275503} +--- !u!1001 &1499366280 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: -11.0100002 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -40.0800018 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -47.3199997 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.862510085 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .506039977 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 2 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .562071204 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .614207506 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .562071204 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1499366281 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1499366280} +--- !u!1 &1502077799 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1502077800} + - component: {fileID: 1502077802} + - component: {fileID: 1502077801} + m_Layer: 0 + m_Name: CrystalMed4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1502077800 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1502077799} + m_LocalRotation: {x: -0.44836503, y: -0.37477726, z: -0.21497637, w: 0.7824934} + m_LocalPosition: {x: 2.772, y: -1.39, z: 2.0598} + m_LocalScale: {x: 1.4139835, y: 1.4139831, z: 2.2578108} + m_Children: [] + m_Father: {fileID: 2046381190} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1502077801 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1502077799} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1502077802 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1502077799} + m_Mesh: {fileID: 4300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &1510140451 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 88600307} +--- !u!4 &1519326186 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1969448265} +--- !u!1 &1523951291 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 1389322577} + serializedVersion: 5 + m_Component: + - component: {fileID: 1457371259} + m_Layer: 0 + m_Name: Missing Prefab (Dummy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1533433731 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1533433732} + - component: {fileID: 1533433734} + - component: {fileID: 1533433733} + m_Layer: 0 + m_Name: CrystalSmall1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1533433732 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1533433731} + m_LocalRotation: {x: -0.5852398, y: 0.11536342, z: 0.0040016575, w: 0.8026018} + m_LocalPosition: {x: 1.1388855, y: 1.4985638, z: 4.3365784} + m_LocalScale: {x: 3.9954584, y: 3.995458, z: 8.8695755} + m_Children: [] + m_Father: {fileID: 352304244} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1533433733 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1533433731} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1533433734 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1533433731} + m_Mesh: {fileID: 4300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &1538392704 stripped +Transform: + m_PrefabParentObject: {fileID: 435190, guid: 7a7b1c07730965f49812dddb30707c7e, type: 2} + m_PrefabInternal: {fileID: 723010930} +--- !u!1 &1544990945 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1544990946} + - component: {fileID: 1544990948} + - component: {fileID: 1544990947} + m_Layer: 0 + m_Name: CrystalMed4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1544990946 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1544990945} + m_LocalRotation: {x: -0.44836503, y: -0.37477726, z: -0.21497637, w: 0.7824934} + m_LocalPosition: {x: 2.772, y: -1.39, z: 2.0598} + m_LocalScale: {x: 1.4139835, y: 1.4139831, z: 2.2578108} + m_Children: [] + m_Father: {fileID: 1629820261} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1544990947 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1544990945} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1544990948 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300014, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1544990945} + m_Mesh: {fileID: 4300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1547018581 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1547018582} + - component: {fileID: 1547018584} + - component: {fileID: 1547018583} + - component: {fileID: 1547018586} + - component: {fileID: 1547018585} + m_Layer: 5 + m_Name: GI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1547018582 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547018581} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -934, y: 369.3} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1547018583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547018581} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'GI: On' +--- !u!222 &1547018584 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547018581} +--- !u!114 &1547018585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547018581} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &1547018586 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1547018581} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!1 &1553693391 stripped +GameObject: + m_PrefabParentObject: {fileID: 100002, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + m_PrefabInternal: {fileID: 1729110607} +--- !u!114 &1553693395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1553693391} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9c952a70ec9e5d24cb586447b5e3cb23, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1580163373 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1580163374} + - component: {fileID: 1580163376} + - component: {fileID: 1580163375} + m_Layer: 0 + m_Name: CrystalLarge3 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1580163374 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1580163373} + m_LocalRotation: {x: -0.74135864, y: 0.1837617, z: 0.3576558, w: 0.53730947} + m_LocalPosition: {x: 2.7816796, y: -0.9848208, z: 0.9939766} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1647423913} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1580163375 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1580163373} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1580163376 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1580163373} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1588089086 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 30.3805065 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -29.1499996 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -41.6528168 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.976880848 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.21378459 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 17 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 17 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .461862743 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .504703939 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .461862743 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1588089087 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1588089086} +--- !u!1 &1629820260 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1629820261} + m_Layer: 0 + m_Name: Crystalb (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1629820261 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1629820260} + m_LocalRotation: {x: 0.21628684, y: 0.42741784, z: 0.009983224, w: 0.8777439} + m_LocalPosition: {x: -86.66, y: -5.55, z: 65.04} + m_LocalScale: {x: 7.8596735, y: 7.859676, z: 7.859676} + m_Children: + - {fileID: 1723451404} + - {fileID: 255979707} + - {fileID: 891681125} + - {fileID: 1707887331} + - {fileID: 1544990946} + - {fileID: 647203244} + - {fileID: 382258746} + m_Father: {fileID: 95974160} + m_RootOrder: 50 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &1643053031 stripped +Transform: + m_PrefabParentObject: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_PrefabInternal: {fileID: 182925130} +--- !u!1 &1647423912 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1647423913} + m_Layer: 0 + m_Name: Crystalb + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1647423913 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1647423912} + m_LocalRotation: {x: -0.053885594, y: 0.74079984, z: 0.25677264, w: 0.6183687} + m_LocalPosition: {x: -63.04443, y: -33.369614, z: 72.55162} + m_LocalScale: {x: 5, y: 5, z: 5} + m_Children: + - {fileID: 536319873} + - {fileID: 1409637238} + - {fileID: 81835740} + - {fileID: 328900848} + - {fileID: 178255051} + - {fileID: 320903599} + - {fileID: 1580163374} + m_Father: {fileID: 95974160} + m_RootOrder: 47 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1654534487 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100008, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1654534488} + - component: {fileID: 1654534490} + - component: {fileID: 1654534489} + - component: {fileID: 1654534491} + m_Layer: 0 + m_Name: Snow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1654534488 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400008, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654534487} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -18.31092, y: 1.136261, z: 10.31536} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117909684} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1654534489 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300006, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654534487} + m_Enabled: 1 + m_CastShadows: 2 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1654534490 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300006, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654534487} + m_Mesh: {fileID: 4300006, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!64 &1654534491 +MeshCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1654534487} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Convex: 0 + m_InflateMesh: 0 + m_SkinWidth: 0.01 + m_Mesh: {fileID: 4300006, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!4 &1655831590 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 277811516} +--- !u!4 &1660457360 stripped +Transform: + m_PrefabParentObject: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_PrefabInternal: {fileID: 2084915637} +--- !u!1001 &1675151733 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -102.138443 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -10.0100002 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -34.2416077 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .0705633163 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.641121864 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.764126301 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.00973045826 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 46 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 14.0288525 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 33.0211868 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 87.1972809 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (46) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1689627605 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 189156, guid: 7db2b2e3f34da674195b5dfefc2d8f51, type: 2} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1689627606} + - component: {fileID: 1689627609} + - component: {fileID: 1689627608} + - component: {fileID: 1689627607} + - component: {fileID: 1689627613} + - component: {fileID: 1689627610} + m_Layer: 0 + m_Name: Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1689627606 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 406226, guid: 7db2b2e3f34da674195b5dfefc2d8f51, type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1689627605} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1448437544} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1689627607 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1689627605} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 855c24b21068ca6449a4680af0c5645e, type: 3} + m_Name: + m_EditorClassIdentifier: + updateGI: 1 + giCullingMask: + serializedVersion: 2 + m_Bits: 2147483647 + shadowSpaceSize: 50 + sun: {fileID: 1297580667} + skyColor: {r: 0.43137258, g: 0.5764706, b: 0.8196079, a: 0} + voxelSpaceSize: 200 + useBilateralFiltering: 0 + innerOcclusionLayers: 1 + temporalBlendWeight: 0.13 + voxelResolution: 256 + visualizeSunDepthTexture: 0 + visualizeGI: 0 + visualizeVoxels: 0 + halfResolution: 1 + stochasticSampling: 1 + infiniteBounces: 1 + followTransform: {fileID: 0} + cones: 32 + coneTraceSteps: 11 + coneLength: 1 + coneWidth: 6 + occlusionStrength: 0.69 + nearOcclusionStrength: 0.6 + occlusionPower: 0.6 + coneTraceBias: 0.64 + nearLightGain: 0 + giGain: 1.36 + secondaryBounceGain: 1.74 + softSunlight: 0 + skyIntensity: 1 + doReflections: 1 + reflectionSteps: 73 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + voxelAA: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 6 + secondaryOcclusionStrength: 0.7 + sphericalSkylight: 0 +--- !u!81 &1689627608 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 8191418, guid: 7db2b2e3f34da674195b5dfefc2d8f51, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1689627605} + m_Enabled: 1 +--- !u!20 &1689627609 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2003720, guid: 7db2b2e3f34da674195b5dfefc2d8f51, + type: 2} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1689627605} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 75 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294966271 + m_RenderingPath: 3 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!114 &1689627610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1689627605} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3f6545096e58f2445a95f9ff831d18fd, type: 3} + m_Name: + m_EditorClassIdentifier: + voxelResolution: 128 + visualizeSunDepthTexture: 0 + visualizeGI: 0 + sun: {fileID: 1297580667} + giCullingMask: + serializedVersion: 2 + m_Bits: 2147483647 + shadowSpaceSize: 50 + temporalBlendWeight: 0.1 + visualizeVoxels: 0 + updateGI: 1 + skyColor: {r: 0.37647063, g: 0.50980395, b: 0.7411765, a: 0} + voxelSpaceSize: 50 + useBilateralFiltering: 0 + innerOcclusionLayers: 1 + halfResolution: 0 + stochasticSampling: 1 + infiniteBounces: 0 + followTransform: {fileID: 0} + cones: 4 + coneTraceSteps: 10 + coneLength: 1 + coneWidth: 3.9 + occlusionStrength: 0.15 + nearOcclusionStrength: 0.5 + occlusionPower: 0.65 + coneTraceBias: 2.8 + nearLightGain: 0.36 + giGain: 1 + secondaryBounceGain: 0.9 + softSunlight: 0 + skyIntensity: 1.19 + reflectionSteps: 64 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 6 + secondaryOcclusionStrength: 0.27 + sphericalSkylight: 0 + voxelAA: 0 +--- !u!114 &1689627613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1689627605} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66529e19c7b4f3f46b1fdda57717299a, type: 3} + m_Name: + m_EditorClassIdentifier: + throwObject: {fileID: 181034, guid: ab7a056b0d4e7524eb3c5e0650fdaeb7, type: 2} + grabMask: + serializedVersion: 2 + m_Bits: 0 + voxelResolution: {fileID: 767697643} + reflections: {fileID: 1927565345} + cones: {fileID: 1379195241} + coneTraceSteps: {fileID: 603646790} + infiniteBounces: {fileID: 1477508401} + gi: {fileID: 1547018583} + fpsCounter: {fileID: 497926800} + spawnedObjects: {fileID: 1196032084} + low: {fileID: 11400000, guid: 28519154347e6a044a59179298cba08f, type: 2} + medium: {fileID: 11400000, guid: b17028f848222554092a65f240008718, type: 2} + high: {fileID: 11400000, guid: 0d981da1c3fe167469bedb2d4051e4ce, type: 2} + ultra: {fileID: 11400000, guid: 8296f7aff584a024ebbdd8d55c430449, type: 2} + infoOverlay: {fileID: 2099886013} +--- !u!4 &1700912724 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1169763339} +--- !u!1 &1702229616 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 1389322577} + serializedVersion: 5 + m_Component: + - component: {fileID: 1702229617} + m_Layer: 0 + m_Name: Missing Prefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1702229617 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 1389322577} + m_GameObject: {fileID: 1702229616} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1457371259} + m_Father: {fileID: 1337975598} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1707887330 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1707887331} + - component: {fileID: 1707887333} + - component: {fileID: 1707887332} + m_Layer: 0 + m_Name: CrystalMed3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1707887331 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1707887330} + m_LocalRotation: {x: -0.5555126, y: 0.20978862, z: 0.00586126, w: 0.804587} + m_LocalPosition: {x: 4.299, y: -1.557, z: 1.656} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1629820261} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1707887332 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1707887330} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1707887333 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1707887330} + m_Mesh: {fileID: 4300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1711899151 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_LocalPosition.x + value: 8.36999989 + objectReference: {fileID: 0} + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_LocalPosition.y + value: -40.0200005 + objectReference: {fileID: 0} + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_LocalPosition.z + value: 83.8199997 + objectReference: {fileID: 0} + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_LocalRotation.y + value: .992719948 + objectReference: {fileID: 0} + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_LocalRotation.w + value: .120445721 + objectReference: {fileID: 0} + - target: {fileID: 468660, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 700962cf36138e246bd627c79997dd1c, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1712010849 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -16.359211 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -40.6300011 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -20.9376068 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.27939114 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.380434394 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.695538223 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .541698217 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 15 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.73101616 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 7.52842712 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 5.7992363 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (15) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1715842954 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1715842955} + - component: {fileID: 1715842957} + - component: {fileID: 1715842956} + m_Layer: 0 + m_Name: CrystalMed1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1715842955 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1715842954} + m_LocalRotation: {x: -0.83456016, y: 0.15312554, z: 0.20988719, w: 0.4858079} + m_LocalPosition: {x: -2.1311111, y: -0.7705393, z: -3.1417732} + m_LocalScale: {x: 4.5, y: 4.5, z: 7.185482} + m_Children: [] + m_Father: {fileID: 512280415} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1715842956 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1715842954} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1715842957 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1715842954} + m_Mesh: {fileID: 4300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1717673915 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 12.3700008 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -37.2200012 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -7.98999977 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .882109165 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .471045107 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 11 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 11 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .519999981 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .519999981 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .520000219 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1717673916 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1717673915} +--- !u!1 &1723451403 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1723451404} + - component: {fileID: 1723451406} + - component: {fileID: 1723451405} + m_Layer: 0 + m_Name: CrystalLarge1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1723451404 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1723451403} + m_LocalRotation: {x: -0.69349414, y: -0.110060565, z: 0.024316499, w: 0.71159065} + m_LocalPosition: {x: 3.2056, y: -0.29285, z: 1.6311} + m_LocalScale: {x: 1.8091333, y: 1.5563307, z: 1.9480637} + m_Children: [] + m_Father: {fileID: 1629820261} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1723451405 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1723451403} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1723451406 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1723451403} + m_Mesh: {fileID: 4300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1727291815 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -36.5 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -27.9799995 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 5.86999989 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .554049671 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .00181819312 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.679520905 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.480912685 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 20.6770897 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 82.4563751 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 11.0761814 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (1) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1729110607 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalPosition.x + value: -15.2 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalPosition.y + value: -39.6 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalPosition.z + value: -45.7 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalRotation.y + value: 0.17816745 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalRotation.w + value: 0.9840002 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalScale.x + value: 5.7759113 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalScale.y + value: 5.7759085 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + propertyPath: m_LocalScale.z + value: 5.7759085 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 42e8d121134ac6345a6e96d08266af8e, type: 3} + m_IsPrefabParent: 0 +--- !u!1 &1749176680 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1749176681} + - component: {fileID: 1749176683} + - component: {fileID: 1749176682} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1749176681 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1749176680} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2099886014} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 18.169998, y: -42.399902} + m_SizeDelta: {x: 558.7, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1749176682 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1749176680} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 300 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: 'SEGI Beta v0.8 Demo + + + W, A, S, D, Shift, Space: Move + + 1, 2, 3, 4: Switch Presets (Low, Medium, High, Ultra) + + G: Toggle GI + + I: Toggle infinite bounces + + R: Toggle voxel resolution (Low, High) + + + Q: Throw glowing object + + C: Clear thrown objects + + + Page Up, Page Down: Adjust sunlight intensity + + Home, End: Adjust soft sunlight intensity + + Up, Left, Down, Right: Adjust sunlight angle + + + H: Hide this overlay + +' +--- !u!222 &1749176683 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1749176680} +--- !u!1 &1749595406 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1749595407} + - component: {fileID: 1749595409} + - component: {fileID: 1749595408} + m_Layer: 0 + m_Name: CrystalMed1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1749595407 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1749595406} + m_LocalRotation: {x: -0.83456016, y: 0.15312554, z: 0.20988719, w: 0.4858079} + m_LocalPosition: {x: -2.1311111, y: -0.7705393, z: -3.1417732} + m_LocalScale: {x: 4.5, y: 4.5, z: 7.185482} + m_Children: [] + m_Father: {fileID: 352304244} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1749595408 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1749595406} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1749595409 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1749595406} + m_Mesh: {fileID: 4300006, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1750593958 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1750593959} + - component: {fileID: 1750593961} + - component: {fileID: 1750593960} + m_Layer: 0 + m_Name: CrystalMed2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1750593959 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1750593958} + m_LocalRotation: {x: -0.44889033, y: 0.010324692, z: -0.015559695, w: 0.8933918} + m_LocalPosition: {x: 3.762, y: -1.8453158, z: 2.482} + m_LocalScale: {x: 0.706294, y: 0.6835654, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1225114906} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1750593960 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1750593958} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1750593961 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1750593958} + m_Mesh: {fileID: 4300008, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1782763343 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalPosition.x + value: -20.8099995 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalPosition.y + value: -41.4599991 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalPosition.z + value: -34.4900017 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_RootOrder + value: 26 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1785711825 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 871331044} +--- !u!1001 &1787324653 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 67.6625061 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -10.0500002 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -22.7558174 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .907561362 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .41991958 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 5 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .620606482 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .781877577 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .620606542 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1787324654 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1787324653} +--- !u!4 &1791265090 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1236127181} +--- !u!1 &1795442792 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1795442793} + - component: {fileID: 1795442795} + - component: {fileID: 1795442794} + m_Layer: 0 + m_Name: CrystalMed3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1795442793 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1795442792} + m_LocalRotation: {x: -0.5555126, y: 0.20978862, z: 0.00586126, w: 0.804587} + m_LocalPosition: {x: 4.299, y: -1.557, z: 1.656} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 2046381190} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1795442794 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1795442792} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1795442795 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1795442792} + m_Mesh: {fileID: 4300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1808673461 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1808673462} + - component: {fileID: 1808673464} + - component: {fileID: 1808673463} + m_Layer: 0 + m_Name: CrystalLarge1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1808673462 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1808673461} + m_LocalRotation: {x: -0.7530575, y: -0.17351753, z: -0.16870636, w: 0.61182874} + m_LocalPosition: {x: 3.55275, y: -0.924, z: 1.3167491} + m_LocalScale: {x: 1.8091333, y: 1.5563307, z: 1.9480637} + m_Children: [] + m_Father: {fileID: 1363094077} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1808673463 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1808673461} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1808673464 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1808673461} + m_Mesh: {fileID: 4300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1817044207 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -42.0200005 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -33.5800018 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -14.4399996 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .556075037 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .0923575461 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .770382464 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .297928721 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 14 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 12.0383291 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 23.8255081 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 10.3718624 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (14) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1823669488 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1303326938} +--- !u!1 &1834337758 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1834337759} + - component: {fileID: 1834337761} + - component: {fileID: 1834337760} + m_Layer: 0 + m_Name: CrystalSmall1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1834337759 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834337758} + m_LocalRotation: {x: -0.5852398, y: 0.11536342, z: 0.0040016575, w: 0.8026018} + m_LocalPosition: {x: 1.1388855, y: 1.4985638, z: 4.3365784} + m_LocalScale: {x: 3.9954584, y: 3.995458, z: 8.8695755} + m_Children: [] + m_Father: {fileID: 283506051} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1834337760 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834337758} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1834337761 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1834337758} + m_Mesh: {fileID: 4300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1845159462 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1845159463} + - component: {fileID: 1845159465} + - component: {fileID: 1845159464} + m_Layer: 0 + m_Name: CrystalMed3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1845159463 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1845159462} + m_LocalRotation: {x: -0.5555126, y: 0.20978862, z: 0.00586126, w: 0.804587} + m_LocalPosition: {x: 4.299, y: -1.557, z: 1.656} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1363094077} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1845159464 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1845159462} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1845159465 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1845159462} + m_Mesh: {fileID: 4300010, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &1847463902 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1847463903} + - component: {fileID: 1847463905} + - component: {fileID: 1847463904} + m_Layer: 10 + m_Name: CaveOccluder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1847463903 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1847463902} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -18.31092, y: 1.136261, z: 10.31536} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117909684} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1847463904 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1847463902} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 7200bf42318ffbe4b9b71e4a48027d5e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1847463905 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1847463902} + m_Mesh: {fileID: 4300012, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!1 &1866720453 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1866720454} + - component: {fileID: 1866720456} + - component: {fileID: 1866720455} + m_Layer: 0 + m_Name: CrystalSmall4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1866720454 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1866720453} + m_LocalRotation: {x: -0.47365332, y: -0.031788133, z: -0.24821082, w: 0.8444131} + m_LocalPosition: {x: -1.4276123, y: -1.9500399, z: 4.413578} + m_LocalScale: {x: 4.5792894, y: 4.5792894, z: 7.8722076} + m_Children: [] + m_Father: {fileID: 352304244} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1866720455 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1866720453} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1866720456 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1866720453} + m_Mesh: {fileID: 4300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &1869081841 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 8.26380539 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -40.0400009 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 80.0905304 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .554848373 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: .831951499 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 40 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 1 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .220170513 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .283206344 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .220170498 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1869081842 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 1869081841} +--- !u!4 &1870320796 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 2072376404} +--- !u!4 &1870855494 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1938163772} +--- !u!1001 &1882740558 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 38.2799988 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -27.6000004 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -24.4200001 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .603832006 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .79711163 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 1 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .562071204 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .708131373 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .562071204 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1882740559 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1882740558} +--- !u!1001 &1888712539 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: -3.86949348 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -39.7299995 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -2.36281729 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .643760443 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.765227079 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 16 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .480337173 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .524892092 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .480337441 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1888712540 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1888712539} +--- !u!1001 &1896384728 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.x + value: -40.8180008 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.y + value: -43.4599991 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.z + value: -41.223999 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: .440186381 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -.897906423 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_RootOrder + value: 35 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0.7437524 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0.36399427 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: -0.56062937 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -0.005935173 + objectReference: {fileID: 0} + - target: {fileID: 110852, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_Name + value: Poppy Tree 3 (4) + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.x + value: 1.28607881 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.y + value: 1.28607857 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.z + value: 1.28607893 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1908802880 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 62.0205078 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -10.75 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -44.0228157 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: .907561362 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .41991958 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 8 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .432956785 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .545465291 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .432956904 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1908802881 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1908802880} +--- !u!1001 &1909850843 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: -26.3600006 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -37.1399994 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 40.4300003 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .999951661 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: .00983540528 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 6 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .220170647 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .300634116 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .220170707 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1909850844 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 1909850843} +--- !u!1 &1927565343 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1927565344} + - component: {fileID: 1927565346} + - component: {fileID: 1927565345} + - component: {fileID: 1927565348} + - component: {fileID: 1927565347} + m_Layer: 5 + m_Name: Reflections + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1927565344 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1927565343} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1320592617} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -934, y: 466} + m_SizeDelta: {x: 280.54, y: 30} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1927565345 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1927565343} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: a7575f7884b85764095a888d4aab1e05, type: 2} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Reflections: On' +--- !u!222 &1927565346 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1927565343} +--- !u!114 &1927565347 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1927565343} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 1} + m_EffectDistance: {x: -0.5, y: -0.5} + m_UseGraphicAlpha: 1 +--- !u!114 &1927565348 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1927565343} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 1573420865, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 1} + m_EffectDistance: {x: 0.5, y: 0.5} + m_UseGraphicAlpha: 1 +--- !u!1001 &1932419681 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalPosition.x + value: -32.3699989 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalPosition.y + value: 15.6199999 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalPosition.z + value: 15.5 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_RootOrder + value: 31 + objectReference: {fileID: 0} + - target: {fileID: 197444, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + propertyPath: m_Name + value: Poppy Tree 1 (1) + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1934088767 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -37.8755341 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -39.8499985 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 10.4675503 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .240422368 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .647979259 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .334196419 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.640806317 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 20.6770897 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 46.5984764 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 19.5993633 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (4) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1936046986 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1328203303} +--- !u!1001 &1938163772 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: 18.4204731 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -21.9400005 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 107.943947 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .749254525 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.27621612 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .587300658 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .131910309 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 25 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 13.4224873 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 68.1270599 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 23.2941685 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (25) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1952323861 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1155132416} +--- !u!1001 &1969448265 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -34.9599991 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -37 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -10.6199999 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.0408301502 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .600767851 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: -.796966851 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.0474840216 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 6.73102379 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 7.52842712 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 10.2617931 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (9) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &1988105804 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -13.1499996 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -36.5499992 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 84.4300003 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.0298335459 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .760837555 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .612214983 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: -.213140786 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 18 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 3.32405543 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 7.49118185 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 4.27362633 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (18) + objectReference: {fileID: 0} + - target: {fileID: 2358960, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 789993f51d1c70e44a1e7e200d8f87e0, type: 2} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &1993973925 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100014, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1993973926} + - component: {fileID: 1993973928} + - component: {fileID: 1993973927} + m_Layer: 8 + m_Name: CaveOccluderSunlight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1993973926 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400014, guid: d6e1787571dd3be429cc767f57060e47, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1993973925} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -18.31092, y: 1.1362607, z: 10.31536} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117909684} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1993973927 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300012, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1993973925} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f76593ecbe727c947b3a6cf0c4edd934, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1993973928 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300012, guid: d6e1787571dd3be429cc767f57060e47, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1993973925} + m_Mesh: {fileID: 4300012, guid: d6e1787571dd3be429cc767f57060e47, type: 3} +--- !u!1001 &1994173263 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 13.8705063 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -30.1399994 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -39.8628159 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.862510085 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .506039977 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 9 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .562071204 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .708131373 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .562071204 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1994173264 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 1994173263} +--- !u!1001 &1995955652 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: -21.159193 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -41.7799988 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 53.3491821 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 39 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &1995955653 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 1995955652} +--- !u!1 &1996379722 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1996379723} + - component: {fileID: 1996379725} + - component: {fileID: 1996379724} + m_Layer: 0 + m_Name: CrystalSmall2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &1996379723 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1996379722} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0.5158663, y: 0, z: 0.45529833} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1363094077} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1996379724 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1996379722} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1996379725 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1996379722} + m_Mesh: {fileID: 4300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &1999325530 stripped +Transform: + m_PrefabParentObject: {fileID: 433946, guid: e41fe40f0c94627419a3e800b40e6ee7, type: 2} + m_PrefabInternal: {fileID: 1782763343} +--- !u!1001 &2004733924 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 22.1000004 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -35.3300018 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -13.4700003 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &2004733925 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 2004733924} +--- !u!1001 &2006142290 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: -15.1359997 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -36.7200012 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 31.5769997 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .823861361 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: -.566791475 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 46 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 7 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .235582635 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .321678489 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .235582724 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &2006142291 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 2006142290} +--- !u!1001 &2010138577 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1337975598} + m_Modifications: + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalPosition.x + value: -44.86949 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalPosition.y + value: 16.680262 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalPosition.z + value: 29.177181 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.y + value: -0.9589529 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalRotation.w + value: 0.28356555 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 153728, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_Name + value: Windmill 2 (1) + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalScale.x + value: 0.9500003 + objectReference: {fileID: 0} + - target: {fileID: 476260, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + propertyPath: m_LocalScale.z + value: 0.95000017 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 60d2710595a367347a5ddd46b26d1886, type: 2} + m_IsPrefabParent: 0 +--- !u!1001 &2022471510 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -22.0682678 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -35.1859207 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: -70.8017273 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: -.510356367 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: .413911909 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .727768421 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .196383521 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 34 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 20.2862015 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 9.68264008 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 49.8550224 + objectReference: {fileID: 0} + - target: {fileID: 183842, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Name + value: SnowRock (34) + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &2025839430 stripped +Transform: + m_PrefabParentObject: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_PrefabInternal: {fileID: 2102526571} +--- !u!1001 &2036665018 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.x + value: 49.7000046 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.y + value: -38.9700012 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalPosition.z + value: 22.7000008 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.y + value: .957241595 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalRotation.w + value: .289289862 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_RootOrder + value: 51 + objectReference: {fileID: 0} + - target: {fileID: 154996, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_Name + value: Pine Tree Snowy 12 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.x + value: .220170587 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.y + value: .244533062 + objectReference: {fileID: 0} + - target: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + propertyPath: m_LocalScale.z + value: .220170617 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &2036665019 stripped +Transform: + m_PrefabParentObject: {fileID: 469422, guid: a886d93727cd9e248bbc2c4f63cac301, type: 2} + m_PrefabInternal: {fileID: 2036665018} +--- !u!1 &2038266178 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 2010138577} + serializedVersion: 5 + m_Component: + - component: {fileID: 2038266179} + m_Layer: 0 + m_Name: Missing Prefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2038266179 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 2010138577} + m_GameObject: {fileID: 2038266178} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 309980128} + m_Father: {fileID: 1337975598} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &2040345154 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 6.55000114 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -35.7799988 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -24.1700001 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.320861906 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: .947126031 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 6 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .461862743 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .504703939 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .461862743 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &2040345155 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 2040345154} +--- !u!1 &2046381189 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2046381190} + m_Layer: 0 + m_Name: Crystalb (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2046381190 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2046381189} + m_LocalRotation: {x: -0.37012148, y: 0.41671413, z: 0.8270206, w: 0.07346001} + m_LocalPosition: {x: -58.964684, y: -67.53, z: 8.415041} + m_LocalScale: {x: 5.558201, y: 5.558197, z: 5.5582056} + m_Children: + - {fileID: 813110764} + - {fileID: 1443715223} + - {fileID: 259206133} + - {fileID: 1795442793} + - {fileID: 1502077800} + - {fileID: 365534682} + - {fileID: 1069245714} + m_Father: {fileID: 95974160} + m_RootOrder: 56 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &2055964770 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.x + value: 41.8600006 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.y + value: -30.4799995 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalPosition.z + value: -12.4499998 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.y + value: -.0335851274 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalRotation.w + value: -.999435902 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_RootOrder + value: 15 + objectReference: {fileID: 0} + - target: {fileID: 120502, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_Name + value: Pine Tree 15 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.x + value: .584554136 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.y + value: .806421101 + objectReference: {fileID: 0} + - target: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + propertyPath: m_LocalScale.z + value: .584554136 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_IsPrefabParent: 0 +--- !u!4 &2055964771 stripped +Transform: + m_PrefabParentObject: {fileID: 495650, guid: 0d7d3d0641fa2bd4c81911b846d8d0d1, type: 2} + m_PrefabInternal: {fileID: 2055964770} +--- !u!1001 &2072376404 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 95974160} + m_Modifications: + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.x + value: -26.3700008 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.y + value: -25.5699997 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalPosition.z + value: 15.6700001 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.x + value: .267446578 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.y + value: -.0438622981 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.z + value: .082645312 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalRotation.w + value: .959019423 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.x + value: 20.6770897 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.y + value: 82.4563522 + objectReference: {fileID: 0} + - target: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_LocalScale.z + value: 11.07617 + objectReference: {fileID: 0} + - target: {fileID: 3328402, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + - target: {fileID: 6490160, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 1f071a7cd60c17245b431c8251315370, type: 3} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &2073412893 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2073412894} + - component: {fileID: 2073412896} + - component: {fileID: 2073412895} + m_Layer: 0 + m_Name: CrystalSmall2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &2073412894 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400020, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2073412893} + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068} + m_LocalPosition: {x: -0.5158663, y: 0, z: 0.45529833} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1225114906} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2073412895 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2073412893} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &2073412896 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2073412893} + m_Mesh: {fileID: 4300000, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &2077310717 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2077310718} + - component: {fileID: 2077310720} + - component: {fileID: 2077310719} + m_Layer: 0 + m_Name: CrystalLarge3 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2077310718 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2077310717} + m_LocalRotation: {x: -0.74135864, y: 0.1837617, z: 0.3576558, w: 0.53730947} + m_LocalPosition: {x: 2.7816796, y: -0.9848208, z: 0.9939766} + m_LocalScale: {x: 1, y: 1, z: 1.5967736} + m_Children: [] + m_Father: {fileID: 1225114906} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2077310719 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2077310717} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &2077310720 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2077310717} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1001 &2084915637 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.x + value: -21.7444897 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.y + value: -50.25 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.z + value: -35.7172852 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: .629110456 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: .777315974 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_RootOrder + value: 36 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0.7437525 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0.3639943 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: -0.5606294 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -0.0059351735 + objectReference: {fileID: 0} + - target: {fileID: 110852, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_Name + value: Poppy Tree 3 (5) + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.x + value: 1.14828467 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.y + value: 1.14828444 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalScale.z + value: 1.14828479 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &2087962259 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2087962260} + - component: {fileID: 2087962262} + - component: {fileID: 2087962261} + m_Layer: 0 + m_Name: CrystalSmall1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2087962260 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087962259} + m_LocalRotation: {x: -0.5852398, y: 0.11536342, z: 0.0040016575, w: 0.8026018} + m_LocalPosition: {x: 1.1388855, y: 1.4985638, z: 4.3365784} + m_LocalScale: {x: 3.9954584, y: 3.995458, z: 8.8695755} + m_Children: [] + m_Father: {fileID: 512280415} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2087962261 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087962259} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &2087962262 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2087962259} + m_Mesh: {fileID: 4300016, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!1 &2099886013 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2099886014} + - component: {fileID: 2099886016} + - component: {fileID: 2099886015} + m_Layer: 5 + m_Name: Info Overlay + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2099886014 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099886013} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1749176681} + m_Father: {fileID: 1320592617} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 657.33, y: -299.5} + m_SizeDelta: {x: -1344.66, y: -629} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2099886015 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099886013} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.728} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &2099886016 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2099886013} +--- !u!4 &2100382956 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 102255323} +--- !u!1001 &2102526571 +Prefab: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 362005191} + m_Modifications: + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.x + value: -1.23000002 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.y + value: -47.0600014 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalPosition.z + value: -26.1399994 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 405158, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_RootOrder + value: 28 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.x + value: 0.7437524 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.y + value: 0.36399427 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.z + value: -0.56062937 + objectReference: {fileID: 0} + - target: {fileID: 485218, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + propertyPath: m_LocalRotation.w + value: -0.005935174 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 100100000, guid: dd980e7ca553f15499e90c5e744f0ec1, type: 2} + m_IsPrefabParent: 0 +--- !u!1 &2110535174 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2110535175} + - component: {fileID: 2110535177} + - component: {fileID: 2110535176} + m_Layer: 0 + m_Name: CrystalLarge3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2110535175 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2110535174} + m_LocalRotation: {x: -0.7935501, y: 0.28680703, z: 0.09620265, w: 0.52798206} + m_LocalPosition: {x: 6.979943, y: 29.738989, z: 1.9827821} + m_LocalScale: {x: 9.405651, y: 9.405649, z: 15.018691} + m_Children: [] + m_Father: {fileID: 352304244} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2110535176 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2110535174} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &2110535177 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2110535174} + m_Mesh: {fileID: 4300018, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &2110991212 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1226602410} +--- !u!4 &2115729771 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 1144947351} +--- !u!1 &2141267824 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 100024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2141267825} + - component: {fileID: 2141267827} + - component: {fileID: 2141267826} + m_Layer: 0 + m_Name: CrystalSmall4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2141267825 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 400024, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2141267824} + m_LocalRotation: {x: -0.47365332, y: -0.031788133, z: -0.24821082, w: 0.8444131} + m_LocalPosition: {x: -1.4276123, y: -1.9500399, z: 4.413578} + m_LocalScale: {x: 4.5792894, y: 4.5792894, z: 7.8722076} + m_Children: [] + m_Father: {fileID: 512280415} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2141267826 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 2300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2141267824} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: d1aeca982fc963c4bb910c14a2462f05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &2141267827 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 3300022, guid: 40c618b3f8760f74db4a2cefe3dff7b3, + type: 3} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2141267824} + m_Mesh: {fileID: 4300004, guid: 40c618b3f8760f74db4a2cefe3dff7b3, type: 3} +--- !u!4 &2146194182 stripped +Transform: + m_PrefabParentObject: {fileID: 418394, guid: 034b1c2c5bc333e4b8f33c538d1eb219, type: 2} + m_PrefabInternal: {fileID: 161363357} diff --git a/Assets/SEGI/Demo Scene/SEGI Low Poly.unity.meta b/Assets/SEGI/Demo Scene/SEGI Low Poly.unity.meta new file mode 100644 index 0000000..0cb3d9b --- /dev/null +++ b/Assets/SEGI/Demo Scene/SEGI Low Poly.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3433a1b8bc583f64f8c4b96d377fb2af +timeCreated: 1465534083 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Scripts.meta b/Assets/SEGI/Demo Scene/Scripts.meta new file mode 100644 index 0000000..c40826b --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8fda0840fefe3714c8080a33a825dfb6 +folderAsset: yes +timeCreated: 1465534963 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Scripts/FirstPersonFlyingController.cs b/Assets/SEGI/Demo Scene/Scripts/FirstPersonFlyingController.cs new file mode 100644 index 0000000..e98845d --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/FirstPersonFlyingController.cs @@ -0,0 +1,100 @@ +using UnityEngine; +using System.Collections; + +public class FirstPersonFlyingController : MonoBehaviour +{ + public float speed = 1.0f; + + public Transform cameraTransform; + + + Transform t; + + Vector3 movementVectorSmooth; + Vector3 rotationVectorSmooth; + + public GameObject checkSphere; + + public bool dontRequireClick = false; + + public bool limitPosition = false; + + public Vector3 minPosition; + public Vector3 maxPosition; + + // Use this for initialization + void Start () + { + t = GetComponent(); + } + + void LateUpdate () + { +// if (DemoAnimation.instance.demoMode == DemoAnimation.DemoMode.Interactive) +// { + Movement(); + MouseLook(); + + //if (Input.GetKey(KeyCode.F)) + //{ + //checkSphere.transform.position = cameraTransform.position + cameraTransform.forward * 2.0f; + //} +// } + } + + void Movement() + { + Vector3 movementVector = Vector3.zero; + + if (Input.GetKey(KeyCode.W)) + movementVector.z += 1.0f; + + if (Input.GetKey(KeyCode.S)) + movementVector.z -= 1.0f; + + if (Input.GetKey(KeyCode.A)) + movementVector.x -= 1.0f; + + if (Input.GetKey(KeyCode.D)) + movementVector.x += 1.0f; + + if (Input.GetKey(KeyCode.Space)) + movementVector.y += 1.0f; + + if (Input.GetKey(KeyCode.LeftShift)) + movementVector.y -= 1.0f; + + movementVector = Vector3.Normalize(movementVector); + +// movementVector *= Input.GetKey(KeyCode.LeftAlt) ? 0.2f : 1.0f; + + movementVectorSmooth = Vector3.Lerp(movementVectorSmooth, movementVector, 5.0f * Time.deltaTime); + + t.Translate(movementVectorSmooth * 9.0f * Time.deltaTime * speed); + + if (limitPosition) + { + Vector3 pos = t.position; + pos.x = Mathf.Clamp(pos.x, minPosition.x, maxPosition.x); + pos.y = Mathf.Clamp(pos.y, minPosition.y, maxPosition.y); + pos.z = Mathf.Clamp(pos.z, minPosition.z, maxPosition.z); + t.position = pos; + } + } + + void MouseLook() + { + Vector3 rotationVector = Vector3.zero; + + if (Input.GetKey(KeyCode.Mouse0) || dontRequireClick) + { + rotationVector.y += (Input.GetAxis("Mouse X")) * 1.00f; + rotationVector.x -= (Input.GetAxis("Mouse Y")) * 1.00f; + } + + rotationVectorSmooth = Vector3.Lerp(rotationVectorSmooth, rotationVector, 5.0f * Time.deltaTime); + + t.Rotate(new Vector3(0.0f, rotationVectorSmooth.y * 2.0f, 0.0f)); + cameraTransform.Rotate(Vector3.right * rotationVectorSmooth.x * 2.0f); + } +} diff --git a/Assets/SEGI/Demo Scene/Scripts/FirstPersonFlyingController.cs.meta b/Assets/SEGI/Demo Scene/Scripts/FirstPersonFlyingController.cs.meta new file mode 100644 index 0000000..296e3c5 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/FirstPersonFlyingController.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6e0b00f945a6ec441b262a1479fdd3dd +timeCreated: 1424592353 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Scripts/SEGIDemo.cs b/Assets/SEGI/Demo Scene/Scripts/SEGIDemo.cs new file mode 100644 index 0000000..fcfa245 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/SEGIDemo.cs @@ -0,0 +1,229 @@ +using UnityEngine; +using UnityEngine.UI; +using System.Collections; +using System; +using System.Collections.Generic; + +public class SEGIDemo : MonoBehaviour +{ + SEGI segi; + + public GameObject throwObject; + List thrownObjects = new List(); + + public LayerMask grabMask; + + public Text voxelResolution; + public Text reflections; + public Text cones; + public Text coneTraceSteps; + public Text infiniteBounces; + public Text gi; + public Text fpsCounter; + public Text spawnedObjects; + + Transform heldObject; + Transform heldObjectParent; + + public SEGIPreset low; + public SEGIPreset medium; + public SEGIPreset high; + public SEGIPreset ultra; + + float fps; + float prevfps; + int spawnedObjectsCounter; + + public GameObject infoOverlay; + + void Start() + { + segi = GetComponent(); + } + + void UpdateUIText() + { + voxelResolution.text = "Voxel Resolution: " + (segi.voxelResolution == SEGI.VoxelResolution.low ? "128" : "256"); + reflections.text = "Reflections: " + (segi.doReflections ? "On" : "Off"); + cones.text = "Cones: " + segi.cones.ToString(); + coneTraceSteps.text = "Cone Trace Steps: " + segi.coneTraceSteps.ToString(); + infiniteBounces.text = "Infinite Bounces: " + (segi.infiniteBounces ? "On" : "Off"); + gi.text = "GI: " + (segi.enabled ? "On" : "Off"); + + fps = Mathf.Lerp(fps, Mathf.Lerp(1.0f / Time.deltaTime, prevfps, 0.5f), 3.0f * Time.deltaTime); + + fpsCounter.text = "FPS: " + Mathf.RoundToInt(fps).ToString(); + + spawnedObjects.text = "Spawned Objects: " + spawnedObjectsCounter.ToString(); + + prevfps = 1.0f / Time.deltaTime; + } + + void Update() + { + UpdateUIText(); + + if (Input.GetKeyDown(KeyCode.G)) + { + if (segi.enabled) + { + segi.enabled = false; + gi.text = "GI: Off"; + AddBadAmbient(); + } + else + { + segi.enabled = true; + gi.text = "GI: On"; + RemoveBadAmbient(); + } + } + + if (Input.GetKeyDown(KeyCode.I)) + { + segi.infiniteBounces = !segi.infiniteBounces; + infiniteBounces.text = segi.infiniteBounces ? "Infinite Bounces: On" : "Infinite Bounces: Off"; + } + + if (Input.GetKeyDown(KeyCode.R)) + { + if (segi.voxelResolution == SEGI.VoxelResolution.high) + { + segi.voxelResolution = SEGI.VoxelResolution.low; + voxelResolution.text = "Voxel Resolution: 128"; + } + else + { + segi.voxelResolution = SEGI.VoxelResolution.high; + voxelResolution.text = "Voxel Resolution: 256"; + } + } + + if (Input.GetKeyDown(KeyCode.Alpha1)) + segi.ApplyPreset(low); + if (Input.GetKeyDown(KeyCode.Alpha2)) + segi.ApplyPreset(medium); + if (Input.GetKeyDown(KeyCode.Alpha3)) + segi.ApplyPreset(high); + if (Input.GetKeyDown(KeyCode.Alpha4)) + segi.ApplyPreset(ultra); + + //Throw an object + if (Input.GetKeyDown(KeyCode.Q)) + { + GameObject thrownObject = Instantiate(throwObject, transform.position + transform.forward * 4.0f, transform.rotation) as GameObject; + Rigidbody thrownRigidbody = thrownObject.GetComponent(); + thrownRigidbody.AddForce(transform.forward * 1000.0f); + thrownObjects.Add(thrownObject); + spawnedObjectsCounter++; + } + + //Clear thrown objects + if (Input.GetKeyDown(KeyCode.C)) + { + foreach (GameObject thrownObject in thrownObjects) + { + Destroy(thrownObject); + } + + thrownObjects.Clear(); + spawnedObjectsCounter = 0; + } + + //Grabbing and moving objects + if (Input.GetKeyDown(KeyCode.E)) + { + if (heldObject == null) + { + RaycastHit hit; + + if (Physics.Raycast(new Ray(transform.position, transform.forward), out hit, 50.0f, grabMask)) + { + heldObject = hit.transform; + heldObjectParent = heldObject.parent; + heldObject.SetParent(transform); + Debug.Log("Grabbed " + hit.transform.gameObject.name); + } + } + else + { + if (heldObjectParent != null) + { + heldObject.SetParent(heldObjectParent); + } + else + { + heldObject.SetParent(null); + } + heldObject = null; + } + } + + if (Input.GetKey(KeyCode.PageUp)) + { + segi.sun.intensity += 1.0f * Time.deltaTime; + } + + if (Input.GetKey(KeyCode.PageDown)) + { + segi.sun.intensity -= 1.0f * Time.deltaTime; + } + + if (Input.GetKey(KeyCode.Home)) + { + segi.softSunlight += 1.0f * Time.deltaTime; + segi.softSunlight = Mathf.Max(0.0f, segi.softSunlight); + } + if (Input.GetKey(KeyCode.End)) + { + segi.softSunlight -= 1.0f * Time.deltaTime; + segi.softSunlight = Mathf.Max(0.0f, segi.softSunlight); + } + + if (Input.GetKey(KeyCode.RightArrow)) + { + segi.sun.transform.RotateAround(segi.sun.transform.position, Vector3.up, 30.0f * Time.deltaTime); + } + if (Input.GetKey(KeyCode.LeftArrow)) + { + segi.sun.transform.RotateAround(segi.sun.transform.position, Vector3.down, 30.0f * Time.deltaTime); + } + if (Input.GetKey(KeyCode.UpArrow)) + { + segi.sun.transform.Rotate(Vector3.right * 30.0f * Time.deltaTime); + } + if (Input.GetKey(KeyCode.DownArrow)) + { + segi.sun.transform.Rotate(Vector3.left * 30.0f * Time.deltaTime); + } + + if (Input.GetKeyDown(KeyCode.H)) + { + if (infoOverlay.activeSelf) + { + infoOverlay.SetActive(false); + } + else + { + infoOverlay.SetActive(true); + } + + } + + if (Input.GetKeyDown(KeyCode.Escape)) + { + Application.Quit(); + } + } + + private void RemoveBadAmbient() + { + RenderSettings.ambientIntensity = 0.0f; + } + + private void AddBadAmbient() + { + RenderSettings.ambientIntensity = 1.0f; + } + +} diff --git a/Assets/SEGI/Demo Scene/Scripts/SEGIDemo.cs.meta b/Assets/SEGI/Demo Scene/Scripts/SEGIDemo.cs.meta new file mode 100644 index 0000000..21e9eee --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/SEGIDemo.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 66529e19c7b4f3f46b1fdda57717299a +timeCreated: 1452042584 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Scripts/SEGIThrowObject.cs b/Assets/SEGI/Demo Scene/Scripts/SEGIThrowObject.cs new file mode 100644 index 0000000..5b4d315 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/SEGIThrowObject.cs @@ -0,0 +1,47 @@ +using UnityEngine; +using System.Collections; + +public class SEGIThrowObject : MonoBehaviour +{ + + Color generatedColor; + Renderer r; + + float pulseSpeed; + float pulseOffset; + + public Material mat0; + public Material mat1; + public Material mat2; + public Material mat3; + public Material mat4; + + void Awake() + { + r = GetComponent(); + + int matIndex = Random.Range(0, 5); + + switch(matIndex) + { + case 0: + r.material = mat0; + break; + case 1: + r.material = mat1; + break; + case 2: + r.material = mat2; + break; + case 3: + r.material = mat3; + break; + case 4: + r.material = mat4; + break; + default: + break; + } + + } +} diff --git a/Assets/SEGI/Demo Scene/Scripts/SEGIThrowObject.cs.meta b/Assets/SEGI/Demo Scene/Scripts/SEGIThrowObject.cs.meta new file mode 100644 index 0000000..5cbacf6 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/SEGIThrowObject.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fd97e24d2802c8e458ed9d97feb78084 +timeCreated: 1452240390 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Demo Scene/Scripts/SEGIWaterDisplacement.cs b/Assets/SEGI/Demo Scene/Scripts/SEGIWaterDisplacement.cs new file mode 100644 index 0000000..05f2f9e --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/SEGIWaterDisplacement.cs @@ -0,0 +1,38 @@ +using UnityEngine; +using System.Collections; + +[RequireComponent(typeof(MeshFilter))] +public class SEGIWaterDisplacement : MonoBehaviour +{ + MeshFilter meshFilter; + Mesh mesh; + Vector3[] initialVertices; + + // Use this for initialization + void Start () + { + meshFilter = GetComponent(); + mesh = meshFilter.mesh; + initialVertices = mesh.vertices; + } + + // Update is called once per frame + void Update () + { + Vector3[] vertices = mesh.vertices; + float scale = 1.0f; + float amp = 0.1f; + for (int i = 0; i < vertices.Length; i++) + { + vertices[i].y = 0.0f + + Mathf.Sin(Time.time + initialVertices[i].x * scale * 1.0f) * 0.25f * amp + + Mathf.Sin(Time.time + initialVertices[i].x * scale * 0.15278f) * 0.25f * amp + + Mathf.Sin(Time.time * 1.5f + initialVertices[i].x * scale * 1.15278f + initialVertices[i].z * scale * 0.4f) * 0.25f * amp + + Mathf.PerlinNoise(initialVertices[i].x * 0.85f + Time.time, initialVertices[i].z * 0.85f) * amp + + Mathf.PerlinNoise(initialVertices[i].x * 2.85f + Time.time, initialVertices[i].z * 4.85f) * 0.5f * amp; + } + mesh.vertices = vertices; + mesh.RecalculateNormals(); + + } +} diff --git a/Assets/SEGI/Demo Scene/Scripts/SEGIWaterDisplacement.cs.meta b/Assets/SEGI/Demo Scene/Scripts/SEGIWaterDisplacement.cs.meta new file mode 100644 index 0000000..d631031 --- /dev/null +++ b/Assets/SEGI/Demo Scene/Scripts/SEGIWaterDisplacement.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9c952a70ec9e5d24cb586447b5e3cb23 +timeCreated: 1424562264 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Editor.meta b/Assets/SEGI/Editor.meta new file mode 100644 index 0000000..80613f6 --- /dev/null +++ b/Assets/SEGI/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b1d5c75d8d4db414999f6a063263bbea +folderAsset: yes +timeCreated: 1451700781 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Editor/SEGICascadedEditor.cs b/Assets/SEGI/Editor/SEGICascadedEditor.cs new file mode 100644 index 0000000..8e559f8 --- /dev/null +++ b/Assets/SEGI/Editor/SEGICascadedEditor.cs @@ -0,0 +1,347 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; + +[CustomEditor(typeof(SEGICascaded))] +public class SEGICascadedEditor : Editor +{ + SerializedObject serObj; + + SerializedProperty voxelResolution; + SerializedProperty visualizeSunDepthTexture; + SerializedProperty visualizeGI; + SerializedProperty sun; + SerializedProperty giCullingMask; + SerializedProperty shadowSpaceSize; + SerializedProperty temporalBlendWeight; + SerializedProperty visualizeVoxels; + SerializedProperty updateGI; + SerializedProperty skyColor; + SerializedProperty voxelSpaceSize; + SerializedProperty useBilateralFiltering; + SerializedProperty halfResolution; + SerializedProperty stochasticSampling; + SerializedProperty infiniteBounces; + SerializedProperty followTransform; + SerializedProperty cones; + SerializedProperty coneTraceSteps; + SerializedProperty coneLength; + SerializedProperty coneWidth; + SerializedProperty occlusionStrength; + SerializedProperty nearOcclusionStrength; + SerializedProperty occlusionPower; + SerializedProperty coneTraceBias; + SerializedProperty nearLightGain; + SerializedProperty giGain; + SerializedProperty secondaryBounceGain; + SerializedProperty softSunlight; + //SerializedProperty doReflections; + SerializedProperty voxelAA; + //SerializedProperty reflectionSteps; + //SerializedProperty skyReflectionIntensity; + //SerializedProperty gaussianMipFilter; + //SerializedProperty reflectionOcclusionPower; + SerializedProperty farOcclusionStrength; + SerializedProperty farthestOcclusionStrength; + SerializedProperty secondaryCones; + SerializedProperty secondaryOcclusionStrength; + SerializedProperty skyIntensity; + SerializedProperty sphericalSkylight; + SerializedProperty innerOcclusionLayers; + + SEGICascaded instance; + + const string presetPath = "Assets/SEGI/Resources/Cascaded Presets"; + + GUIStyle headerStyle; + GUIStyle vramLabelStyle + { + get + { + GUIStyle s = new GUIStyle(EditorStyles.boldLabel); + s.fontStyle = FontStyle.Italic; + return s; + } + } + + + bool showMainConfig = true; + bool showDebugTools = false; + bool showTracingProperties = true; + bool showEnvironmentProperties = true; + bool showPresets = true; + //bool showReflectionProperties = true; + + string presetToSaveName; + + int presetPopupIndex; + + void OnEnable() + { + serObj = new SerializedObject(target); + + voxelResolution = serObj.FindProperty("voxelResolution"); + visualizeSunDepthTexture = serObj.FindProperty("visualizeSunDepthTexture"); + visualizeGI = serObj.FindProperty("visualizeGI"); + sun = serObj.FindProperty("sun"); + giCullingMask = serObj.FindProperty("giCullingMask"); + shadowSpaceSize = serObj.FindProperty("shadowSpaceSize"); + temporalBlendWeight = serObj.FindProperty("temporalBlendWeight"); + visualizeVoxels = serObj.FindProperty("visualizeVoxels"); + updateGI = serObj.FindProperty("updateGI"); + skyColor = serObj.FindProperty("skyColor"); + voxelSpaceSize = serObj.FindProperty("voxelSpaceSize"); + useBilateralFiltering = serObj.FindProperty("useBilateralFiltering"); + halfResolution = serObj.FindProperty("halfResolution"); + stochasticSampling = serObj.FindProperty("stochasticSampling"); + infiniteBounces = serObj.FindProperty("infiniteBounces"); + followTransform = serObj.FindProperty("followTransform"); + cones = serObj.FindProperty("cones"); + coneTraceSteps = serObj.FindProperty("coneTraceSteps"); + coneLength = serObj.FindProperty("coneLength"); + coneWidth = serObj.FindProperty("coneWidth"); + occlusionStrength = serObj.FindProperty("occlusionStrength"); + nearOcclusionStrength = serObj.FindProperty("nearOcclusionStrength"); + occlusionPower = serObj.FindProperty("occlusionPower"); + coneTraceBias = serObj.FindProperty("coneTraceBias"); + nearLightGain = serObj.FindProperty("nearLightGain"); + giGain = serObj.FindProperty("giGain"); + secondaryBounceGain = serObj.FindProperty("secondaryBounceGain"); + softSunlight = serObj.FindProperty("softSunlight"); + //doReflections = serObj.FindProperty("doReflections"); + voxelAA = serObj.FindProperty("voxelAA"); + //reflectionSteps = serObj.FindProperty("reflectionSteps"); + //skyReflectionIntensity = serObj.FindProperty("skyReflectionIntensity"); + //gaussianMipFilter = serObj.FindProperty("gaussianMipFilter"); + //reflectionOcclusionPower = serObj.FindProperty("reflectionOcclusionPower"); + farOcclusionStrength = serObj.FindProperty("farOcclusionStrength"); + farthestOcclusionStrength = serObj.FindProperty("farthestOcclusionStrength"); + secondaryCones = serObj.FindProperty("secondaryCones"); + secondaryOcclusionStrength = serObj.FindProperty("secondaryOcclusionStrength"); + skyIntensity = serObj.FindProperty("skyIntensity"); + sphericalSkylight = serObj.FindProperty("sphericalSkylight"); + innerOcclusionLayers = serObj.FindProperty("innerOcclusionLayers"); + + + instance = target as SEGICascaded; + } + + public override void OnInspectorGUI() + { + serObj.Update(); + + EditorGUILayout.HelpBox("This is a preview of the work-in-progress version of SEGI with cascaded GI volumes. Behavior is not final and is subject to change.", MessageType.Info); + + //Presets + showPresets = EditorGUILayout.Foldout(showPresets, new GUIContent("Presets")); + if (showPresets) + { + EditorGUI.indentLevel++; + string[] presetGUIDs = AssetDatabase.FindAssets("t:SEGICascadedPreset", new string[1] { presetPath }); + string[] presetNames = new string[presetGUIDs.Length]; + string[] presetPaths = new string[presetGUIDs.Length]; + + for (int i = 0; i < presetGUIDs.Length; i++) + { + presetPaths[i] = AssetDatabase.GUIDToAssetPath(presetGUIDs[i]); + presetNames[i] = System.IO.Path.GetFileNameWithoutExtension(presetPaths[i]); + } + + EditorGUILayout.BeginHorizontal(); + presetPopupIndex = EditorGUILayout.Popup("", presetPopupIndex, presetNames); + + if (GUILayout.Button("Load")) + { + if (presetPaths.Length > 0) + { + SEGICascadedPreset preset = AssetDatabase.LoadAssetAtPath(presetPaths[presetPopupIndex]); + instance.ApplyPreset(preset); + EditorUtility.SetDirty(target); + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + presetToSaveName = EditorGUILayout.TextField(presetToSaveName); + + if (GUILayout.Button("Save")) + { + SavePreset(presetToSaveName); + } + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + //Main Configuration + showMainConfig = EditorGUILayout.Foldout(showMainConfig, new GUIContent("Main Configuration")); + if (showMainConfig) + { + EditorGUI.indentLevel++; + EditorGUILayout.BeginVertical(); + EditorGUILayout.PropertyField(voxelResolution, new GUIContent("Voxel Resolution", "The resolution of the voxel texture used to calculate GI.")); + EditorGUILayout.PropertyField(voxelAA, new GUIContent("Voxel AA", "Enables anti-aliasing during voxelization for higher precision voxels.")); + EditorGUILayout.PropertyField(innerOcclusionLayers, new GUIContent("Inner Occlusion Layers", "Enables the writing of additional black occlusion voxel layers on the back face of geometry. Can help with light leaking but may cause artifacts with small objects.")); + //EditorGUILayout.PropertyField(gaussianMipFilter, new GUIContent("Gaussian Mip Filter", "Enables gaussian filtering during mipmap generation. This can improve visual smoothness and consistency, particularly with large moving objects.")); + EditorGUILayout.PropertyField(voxelSpaceSize, new GUIContent("Voxel Space Size", "The size of the voxel volume in world units. Everything inside the voxel volume will contribute to GI.")); + EditorGUILayout.PropertyField(shadowSpaceSize, new GUIContent("Shadow Space Size", "The size of the sun shadow texture used to inject sunlight with shadows into the voxels in world units. It is recommended to set this value similar to Voxel Space Size.")); + EditorGUILayout.PropertyField(giCullingMask, new GUIContent("GI Culling Mask", "Which layers should be voxelized and contribute to GI.")); + EditorGUILayout.PropertyField(updateGI, new GUIContent("Update GI", "Whether voxelization and multi-bounce rendering should update every frame. When disabled, GI tracing will use cached data from the last time this was enabled.")); + EditorGUILayout.PropertyField(infiniteBounces, new GUIContent("Infinite Bounces", "Enables infinite bounces. This is expensive for complex scenes and is still experimental.")); + EditorGUILayout.PropertyField(followTransform, new GUIContent("Follow Transform", "If provided, the voxel volume will follow and be centered on this object instead of the camera. Useful for top-down scenes.")); + EditorGUILayout.EndVertical(); + EditorGUILayout.Space(); + EditorGUILayout.LabelField("VRAM Usage: " + instance.vramUsage.ToString("F2") + " MB", vramLabelStyle); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + + + + //Environment + showEnvironmentProperties = EditorGUILayout.Foldout(showEnvironmentProperties, new GUIContent("Environment Properties")); + if (instance.sun == null) + { + showEnvironmentProperties = true; + } + if (showEnvironmentProperties) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(sun, new GUIContent("Sun", "The main directional light that will cast indirect light into the scene (sunlight or moonlight).")); + EditorGUILayout.PropertyField(softSunlight, new GUIContent("Soft Sunlight", "The amount of soft diffuse sunlight that will be added to the scene. Use this to simulate the effect of clouds/haze scattering soft sunlight onto the scene.")); + EditorGUILayout.PropertyField(skyColor, new GUIContent("Sky Color", "The color of the light scattered onto the scene coming from the sky.")); + EditorGUILayout.PropertyField(skyIntensity, new GUIContent("Sky Intensity", "The brightness of the sky light.")); + EditorGUILayout.PropertyField(sphericalSkylight, new GUIContent("Spherical Skylight", "If enabled, light from the sky will come from all directions. If disabled, light from the sky will only come from the top hemisphere.")); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + + //Tracing properties + showTracingProperties = EditorGUILayout.Foldout(showTracingProperties, new GUIContent("Tracing Properties")); + if (showTracingProperties) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(temporalBlendWeight, new GUIContent("Temporal Blend Weight", "The lower the value, the more previous frames will be blended with the current frame. Lower values result in smoother GI that updates less quickly.")); + EditorGUILayout.PropertyField(useBilateralFiltering, new GUIContent("Bilateral Filtering", "Enables filtering of the GI result to reduce noise.")); + EditorGUILayout.PropertyField(halfResolution, new GUIContent("Half Resolution", "If enabled, GI tracing will be done at half screen resolution. Improves speed of GI tracing.")); + EditorGUILayout.PropertyField(stochasticSampling, new GUIContent("Stochastic Sampling", "If enabled, uses random jitter to reduce banding and discontinuities during GI tracing.")); + + EditorGUILayout.PropertyField(cones, new GUIContent("Cones", "The number of cones that will be traced in different directions for diffuse GI tracing. More cones result in a smoother result at the cost of performance.")); + EditorGUILayout.PropertyField(coneTraceSteps, new GUIContent("Cone Trace Steps", "The number of tracing steps for each cone. Too few results in skipping thin features. Higher values result in more accuracy at the cost of performance.")); + EditorGUILayout.PropertyField(coneLength, new GUIContent("Cone length", "The number of cones that will be traced in different directions for diffuse GI tracing. More cones result in a smoother result at the cost of performance.")); + EditorGUILayout.PropertyField(coneWidth, new GUIContent("Cone Width", "The width of each cone. Wider cones cause a softer and smoother result but affect accuracy and incrase over-occlusion. Thinner cones result in more accurate tracing with less coherent (more noisy) results and a higher tracing cost.")); + EditorGUILayout.PropertyField(coneTraceBias, new GUIContent("Cone Trace Bias", "The amount of offset above a surface that cone tracing begins. Higher values reduce \"voxel acne\" (similar to \"shadow acne\"). Values that are too high result in light-leaking.")); + EditorGUILayout.PropertyField(occlusionStrength, new GUIContent("Occlusion Strength", "The strength of shadowing solid objects will cause. Affects the strength of all indirect shadows.")); + EditorGUILayout.PropertyField(nearOcclusionStrength, new GUIContent("Near Occlusion Strength", "The strength of shadowing nearby solid objects will cause. Only affects the strength of very close blockers.")); + EditorGUILayout.PropertyField(farOcclusionStrength, new GUIContent("Far Occlusion Strength", "How much light far occluders block. This value gives additional light blocking proportional to the width of the cone at each trace step.")); + EditorGUILayout.PropertyField(farthestOcclusionStrength, new GUIContent("Farthest Occlusion Strength", "How much light the farthest occluders block. This value gives additional light blocking proportional to (cone width)^2 at each trace step.")); + EditorGUILayout.PropertyField(occlusionPower, new GUIContent("Occlusion Power", "The strength of shadowing far solid objects will cause. Only affects the strength of far blockers. Decrease this value if wide cones are causing over-occlusion.")); + EditorGUILayout.PropertyField(nearLightGain, new GUIContent("Near Light Gain", "Affects the attenuation of indirect light. Higher values allow for more close-proximity indirect light. Lower values reduce close-proximity indirect light, sometimes resulting in a cleaner result.")); + EditorGUILayout.PropertyField(giGain, new GUIContent("GI Gain", "The overall brightness of indirect light. For Near Light Gain values around 1, a value of 1 for this property is recommended for a physically-accurate result.")); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(secondaryBounceGain, new GUIContent("Secondary Bounce Gain", "Affects the strength of secondary/infinite bounces. Be careful, values above 1 can cause runaway light bouncing and flood areas with extremely bright light!")); + EditorGUILayout.PropertyField(secondaryCones, new GUIContent("Secondary Cones", "The number of secondary cones that will be traced for calculating infinte bounces. Increasing this value improves the accuracy of secondary bounces at the cost of performance. Note: the performance cost of this scales with voxelized scene complexity.")); + EditorGUILayout.PropertyField(secondaryOcclusionStrength, new GUIContent("Secondary Occlusion Strength", "The strength of light blocking during secondary bounce tracing. Be careful, a value too low can cause runaway light bouncing and flood areas with extremely bright light!")); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + /* + showReflectionProperties = EditorGUILayout.Foldout(showReflectionProperties, new GUIContent("Reflection Properties")); + if (showReflectionProperties) + { + EditorGUI.indentLevel++; + //EditorGUILayout.PropertyField(doReflections, new GUIContent("Do Reflections", "Enable this for cone-traced reflections.")); + EditorGUILayout.PropertyField(reflectionSteps, new GUIContent("Reflection Steps", "Number of reflection trace steps.")); + EditorGUILayout.PropertyField(reflectionOcclusionPower, new GUIContent("Reflection Occlusion Power", "Strength of light blocking during reflection tracing.")); + EditorGUILayout.PropertyField(skyReflectionIntensity, new GUIContent("Sky Reflection Intensity", "Intensity of sky reflections.")); + EditorGUI.indentLevel--; + } + */ + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + //Debug tools + showDebugTools = EditorGUILayout.Foldout(showDebugTools, new GUIContent("Debug Tools")); + if (showDebugTools) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(visualizeSunDepthTexture, new GUIContent("Visualize Sun Depth Texture", "Visualize the depth texture used to render proper shadows while injecting sunlight into voxel data.")); + EditorGUILayout.PropertyField(visualizeGI, new GUIContent("Visualize GI", "Visualize GI result only (no textures).")); + EditorGUILayout.PropertyField(visualizeVoxels, new GUIContent("Visualize Voxels", "Directly view the voxels in the scene.")); + EditorGUI.indentLevel--; + } + + + serObj.ApplyModifiedProperties(); + } + + void SavePreset(string name) + { + if (name == "") + { + Debug.LogWarning("SEGI: Type in a name for the preset to be saved!"); + return; + } + + //SEGIPreset preset = new SEGIPreset(); + SEGICascadedPreset preset = ScriptableObject.CreateInstance(); + + preset.voxelResolution = instance.voxelResolution; + preset.voxelAA = instance.voxelAA; + preset.innerOcclusionLayers = instance.innerOcclusionLayers; + preset.infiniteBounces = instance.infiniteBounces; + + preset.temporalBlendWeight = instance.temporalBlendWeight; + preset.useBilateralFiltering = instance.useBilateralFiltering; + preset.halfResolution = instance.halfResolution; + preset.stochasticSampling = instance.stochasticSampling; + //preset.doReflections = instance.doReflections; + preset.doReflections = false; + + preset.cones = instance.cones; + preset.coneTraceSteps = instance.coneTraceSteps; + preset.coneLength = instance.coneLength; + preset.coneWidth = instance.coneWidth; + preset.coneTraceBias = instance.coneTraceBias; + preset.occlusionStrength = instance.occlusionStrength; + preset.nearOcclusionStrength = instance.nearOcclusionStrength; + preset.occlusionPower = instance.occlusionPower; + preset.nearLightGain = instance.nearLightGain; + preset.giGain = instance.giGain; + preset.secondaryBounceGain = instance.secondaryBounceGain; + + preset.reflectionSteps = instance.reflectionSteps; + preset.reflectionOcclusionPower = instance.reflectionOcclusionPower; + preset.skyReflectionIntensity = instance.skyReflectionIntensity; + preset.gaussianMipFilter = instance.gaussianMipFilter; + + preset.farOcclusionStrength = instance.farOcclusionStrength; + preset.farthestOcclusionStrength = instance.farthestOcclusionStrength; + preset.secondaryCones = instance.secondaryCones; + preset.secondaryOcclusionStrength = instance.secondaryOcclusionStrength; + + string path = presetPath + "/"; + + AssetDatabase.CreateAsset(preset, path + name + ".asset"); + + AssetDatabase.SaveAssets(); + } + + void LoadPreset() + { + + } +} diff --git a/Assets/SEGI/Editor/SEGICascadedEditor.cs.meta b/Assets/SEGI/Editor/SEGICascadedEditor.cs.meta new file mode 100644 index 0000000..b5f8ad1 --- /dev/null +++ b/Assets/SEGI/Editor/SEGICascadedEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e6bc7acb42bdd0041a9dc82bf8e9fe6c +timeCreated: 1465468083 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Editor/SEGIEditor.cs b/Assets/SEGI/Editor/SEGIEditor.cs new file mode 100644 index 0000000..9b0ea53 --- /dev/null +++ b/Assets/SEGI/Editor/SEGIEditor.cs @@ -0,0 +1,342 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; + +[CustomEditor(typeof(SEGI))] +public class SEGIEditor : Editor +{ + SerializedObject serObj; + + SerializedProperty voxelResolution; + SerializedProperty visualizeSunDepthTexture; + SerializedProperty visualizeGI; + SerializedProperty sun; + SerializedProperty giCullingMask; + SerializedProperty shadowSpaceSize; + SerializedProperty temporalBlendWeight; + SerializedProperty visualizeVoxels; + SerializedProperty updateGI; + SerializedProperty skyColor; + SerializedProperty voxelSpaceSize; + SerializedProperty useBilateralFiltering; + SerializedProperty halfResolution; + SerializedProperty stochasticSampling; + SerializedProperty infiniteBounces; + SerializedProperty followTransform; + SerializedProperty cones; + SerializedProperty coneTraceSteps; + SerializedProperty coneLength; + SerializedProperty coneWidth; + SerializedProperty occlusionStrength; + SerializedProperty nearOcclusionStrength; + SerializedProperty occlusionPower; + SerializedProperty coneTraceBias; + SerializedProperty nearLightGain; + SerializedProperty giGain; + SerializedProperty secondaryBounceGain; + SerializedProperty softSunlight; + SerializedProperty doReflections; + SerializedProperty voxelAA; + SerializedProperty reflectionSteps; + SerializedProperty skyReflectionIntensity; + SerializedProperty gaussianMipFilter; + SerializedProperty reflectionOcclusionPower; + SerializedProperty farOcclusionStrength; + SerializedProperty farthestOcclusionStrength; + SerializedProperty secondaryCones; + SerializedProperty secondaryOcclusionStrength; + SerializedProperty skyIntensity; + SerializedProperty sphericalSkylight; + SerializedProperty innerOcclusionLayers; + + SEGI instance; + + const string presetPath = "Assets/SEGI/Resources/Presets"; + + GUIStyle headerStyle; + GUIStyle vramLabelStyle + { + get + { + GUIStyle s = new GUIStyle(EditorStyles.boldLabel); + s.fontStyle = FontStyle.Italic; + return s; + } + } + + + bool showMainConfig = true; + bool showDebugTools = false; + bool showTracingProperties = true; + bool showEnvironmentProperties = true; + bool showPresets = true; + bool showReflectionProperties = true; + + string presetToSaveName; + + int presetPopupIndex; + + void OnEnable() + { + serObj = new SerializedObject(target); + + voxelResolution = serObj.FindProperty("voxelResolution"); + visualizeSunDepthTexture = serObj.FindProperty("visualizeSunDepthTexture"); + visualizeGI = serObj.FindProperty("visualizeGI"); + sun = serObj.FindProperty("sun"); + giCullingMask = serObj.FindProperty("giCullingMask"); + shadowSpaceSize = serObj.FindProperty("shadowSpaceSize"); + temporalBlendWeight = serObj.FindProperty("temporalBlendWeight"); + visualizeVoxels = serObj.FindProperty("visualizeVoxels"); + updateGI = serObj.FindProperty("updateGI"); + skyColor = serObj.FindProperty("skyColor"); + voxelSpaceSize = serObj.FindProperty("voxelSpaceSize"); + useBilateralFiltering = serObj.FindProperty("useBilateralFiltering"); + halfResolution = serObj.FindProperty("halfResolution"); + stochasticSampling = serObj.FindProperty("stochasticSampling"); + infiniteBounces = serObj.FindProperty("infiniteBounces"); + followTransform = serObj.FindProperty("followTransform"); + cones = serObj.FindProperty("cones"); + coneTraceSteps = serObj.FindProperty("coneTraceSteps"); + coneLength = serObj.FindProperty("coneLength"); + coneWidth = serObj.FindProperty("coneWidth"); + occlusionStrength = serObj.FindProperty("occlusionStrength"); + nearOcclusionStrength = serObj.FindProperty("nearOcclusionStrength"); + occlusionPower = serObj.FindProperty("occlusionPower"); + coneTraceBias = serObj.FindProperty("coneTraceBias"); + nearLightGain = serObj.FindProperty("nearLightGain"); + giGain = serObj.FindProperty("giGain"); + secondaryBounceGain = serObj.FindProperty("secondaryBounceGain"); + softSunlight = serObj.FindProperty("softSunlight"); + doReflections = serObj.FindProperty("doReflections"); + voxelAA = serObj.FindProperty("voxelAA"); + reflectionSteps = serObj.FindProperty("reflectionSteps"); + skyReflectionIntensity = serObj.FindProperty("skyReflectionIntensity"); + gaussianMipFilter = serObj.FindProperty("gaussianMipFilter"); + reflectionOcclusionPower = serObj.FindProperty("reflectionOcclusionPower"); + farOcclusionStrength = serObj.FindProperty("farOcclusionStrength"); + farthestOcclusionStrength = serObj.FindProperty("farthestOcclusionStrength"); + secondaryCones = serObj.FindProperty("secondaryCones"); + secondaryOcclusionStrength = serObj.FindProperty("secondaryOcclusionStrength"); + skyIntensity = serObj.FindProperty("skyIntensity"); + sphericalSkylight = serObj.FindProperty("sphericalSkylight"); + innerOcclusionLayers = serObj.FindProperty("innerOcclusionLayers"); + + + instance = target as SEGI; + } + + public override void OnInspectorGUI() + { + serObj.Update(); + + //Presets + showPresets = EditorGUILayout.Foldout(showPresets, new GUIContent("Presets")); + if (showPresets) + { + EditorGUI.indentLevel++; + string[] presetGUIDs = AssetDatabase.FindAssets("t:SEGIPreset", new string[1] { presetPath }); + string[] presetNames = new string[presetGUIDs.Length]; + string[] presetPaths = new string[presetGUIDs.Length]; + + for (int i = 0; i < presetGUIDs.Length; i++) + { + presetPaths[i] = AssetDatabase.GUIDToAssetPath(presetGUIDs[i]); + presetNames[i] = System.IO.Path.GetFileNameWithoutExtension(presetPaths[i]); + } + + EditorGUILayout.BeginHorizontal(); + presetPopupIndex = EditorGUILayout.Popup("", presetPopupIndex, presetNames); + + if (GUILayout.Button("Load")) + { + if (presetPaths.Length > 0) + { + SEGIPreset preset = AssetDatabase.LoadAssetAtPath(presetPaths[presetPopupIndex]); + Undo.RecordObject(target, "Loaded SEGI Preset"); + instance.ApplyPreset(preset); + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + presetToSaveName = EditorGUILayout.TextField(presetToSaveName); + + if (GUILayout.Button("Save")) + { + SavePreset(presetToSaveName); + } + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + //Main Configuration + showMainConfig = EditorGUILayout.Foldout(showMainConfig, new GUIContent("Main Configuration")); + if (showMainConfig) + { + EditorGUI.indentLevel++; + EditorGUILayout.BeginVertical(); + EditorGUILayout.PropertyField(voxelResolution, new GUIContent("Voxel Resolution", "The resolution of the voxel texture used to calculate GI.")); + EditorGUILayout.PropertyField(voxelAA, new GUIContent("Voxel AA", "Enables anti-aliasing during voxelization for higher precision voxels.")); + EditorGUILayout.PropertyField(innerOcclusionLayers, new GUIContent("Inner Occlusion Layers", "Enables the writing of additional black occlusion voxel layers on the back face of geometry. Can help with light leaking but may cause artifacts with small objects.")); + EditorGUILayout.PropertyField(gaussianMipFilter, new GUIContent("Gaussian Mip Filter", "Enables gaussian filtering during mipmap generation. This can improve visual smoothness and consistency, particularly with large moving objects.")); + EditorGUILayout.PropertyField(voxelSpaceSize, new GUIContent("Voxel Space Size", "The size of the voxel volume in world units. Everything inside the voxel volume will contribute to GI.")); + EditorGUILayout.PropertyField(shadowSpaceSize, new GUIContent("Shadow Space Size", "The size of the sun shadow texture used to inject sunlight with shadows into the voxels in world units. It is recommended to set this value similar to Voxel Space Size.")); + EditorGUILayout.PropertyField(giCullingMask, new GUIContent("GI Culling Mask", "Which layers should be voxelized and contribute to GI.")); + EditorGUILayout.PropertyField(updateGI, new GUIContent("Update GI", "Whether voxelization and multi-bounce rendering should update every frame. When disabled, GI tracing will use cached data from the last time this was enabled.")); + EditorGUILayout.PropertyField(infiniteBounces, new GUIContent("Infinite Bounces", "Enables infinite bounces. This is expensive for complex scenes and is still experimental.")); + EditorGUILayout.PropertyField(followTransform, new GUIContent("Follow Transform", "If provided, the voxel volume will follow and be centered on this object instead of the camera. Useful for top-down scenes.")); + EditorGUILayout.EndVertical(); + EditorGUILayout.Space(); + EditorGUILayout.LabelField("VRAM Usage: " + instance.vramUsage.ToString("F2") + " MB", vramLabelStyle); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + + + + //Environment + showEnvironmentProperties = EditorGUILayout.Foldout(showEnvironmentProperties, new GUIContent("Environment Properties")); + if (instance.sun == null) + { + showEnvironmentProperties = true; + } + if (showEnvironmentProperties) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(sun, new GUIContent("Sun", "The main directional light that will cast indirect light into the scene (sunlight or moonlight).")); + EditorGUILayout.PropertyField(softSunlight, new GUIContent("Soft Sunlight", "The amount of soft diffuse sunlight that will be added to the scene. Use this to simulate the effect of clouds/haze scattering soft sunlight onto the scene.")); + EditorGUILayout.PropertyField(skyColor, new GUIContent("Sky Color", "The color of the light scattered onto the scene coming from the sky.")); + EditorGUILayout.PropertyField(skyIntensity, new GUIContent("Sky Intensity", "The brightness of the sky light.")); + EditorGUILayout.PropertyField(sphericalSkylight, new GUIContent("Spherical Skylight", "If enabled, light from the sky will come from all directions. If disabled, light from the sky will only come from the top hemisphere.")); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + + //Tracing properties + showTracingProperties = EditorGUILayout.Foldout(showTracingProperties, new GUIContent("Tracing Properties")); + if (showTracingProperties) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(temporalBlendWeight, new GUIContent("Temporal Blend Weight", "The lower the value, the more previous frames will be blended with the current frame. Lower values result in smoother GI that updates less quickly.")); + EditorGUILayout.PropertyField(useBilateralFiltering, new GUIContent("Bilateral Filtering", "Enables filtering of the GI result to reduce noise.")); + EditorGUILayout.PropertyField(halfResolution, new GUIContent("Half Resolution", "If enabled, GI tracing will be done at half screen resolution. Improves speed of GI tracing.")); + EditorGUILayout.PropertyField(stochasticSampling, new GUIContent("Stochastic Sampling", "If enabled, uses random jitter to reduce banding and discontinuities during GI tracing.")); + + EditorGUILayout.PropertyField(cones, new GUIContent("Cones", "The number of cones that will be traced in different directions for diffuse GI tracing. More cones result in a smoother result at the cost of performance.")); + EditorGUILayout.PropertyField(coneTraceSteps, new GUIContent("Cone Trace Steps", "The number of tracing steps for each cone. Too few results in skipping thin features. Higher values result in more accuracy at the cost of performance.")); + EditorGUILayout.PropertyField(coneLength, new GUIContent("Cone length", "The number of cones that will be traced in different directions for diffuse GI tracing. More cones result in a smoother result at the cost of performance.")); + EditorGUILayout.PropertyField(coneWidth, new GUIContent("Cone Width", "The width of each cone. Wider cones cause a softer and smoother result but affect accuracy and incrase over-occlusion. Thinner cones result in more accurate tracing with less coherent (more noisy) results and a higher tracing cost.")); + EditorGUILayout.PropertyField(coneTraceBias, new GUIContent("Cone Trace Bias", "The amount of offset above a surface that cone tracing begins. Higher values reduce \"voxel acne\" (similar to \"shadow acne\"). Values that are too high result in light-leaking.")); + EditorGUILayout.PropertyField(occlusionStrength, new GUIContent("Occlusion Strength", "The strength of shadowing solid objects will cause. Affects the strength of all indirect shadows.")); + EditorGUILayout.PropertyField(nearOcclusionStrength, new GUIContent("Near Occlusion Strength", "The strength of shadowing nearby solid objects will cause. Only affects the strength of very close blockers.")); + EditorGUILayout.PropertyField(farOcclusionStrength, new GUIContent("Far Occlusion Strength", "How much light far occluders block. This value gives additional light blocking proportional to the width of the cone at each trace step.")); + EditorGUILayout.PropertyField(farthestOcclusionStrength, new GUIContent("Farthest Occlusion Strength", "How much light the farthest occluders block. This value gives additional light blocking proportional to (cone width)^2 at each trace step.")); + EditorGUILayout.PropertyField(occlusionPower, new GUIContent("Occlusion Power", "The strength of shadowing far solid objects will cause. Only affects the strength of far blockers. Decrease this value if wide cones are causing over-occlusion.")); + EditorGUILayout.PropertyField(nearLightGain, new GUIContent("Near Light Gain", "Affects the attenuation of indirect light. Higher values allow for more close-proximity indirect light. Lower values reduce close-proximity indirect light, sometimes resulting in a cleaner result.")); + EditorGUILayout.PropertyField(giGain, new GUIContent("GI Gain", "The overall brightness of indirect light. For Near Light Gain values around 1, a value of 1 for this property is recommended for a physically-accurate result.")); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(secondaryBounceGain, new GUIContent("Secondary Bounce Gain", "Affects the strength of secondary/infinite bounces. Be careful, values above 1 can cause runaway light bouncing and flood areas with extremely bright light!")); + EditorGUILayout.PropertyField(secondaryCones, new GUIContent("Secondary Cones", "The number of secondary cones that will be traced for calculating infinte bounces. Increasing this value improves the accuracy of secondary bounces at the cost of performance. Note: the performance cost of this scales with voxelized scene complexity.")); + EditorGUILayout.PropertyField(secondaryOcclusionStrength, new GUIContent("Secondary Occlusion Strength", "The strength of light blocking during secondary bounce tracing. Be careful, a value too low can cause runaway light bouncing and flood areas with extremely bright light!")); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + showReflectionProperties = EditorGUILayout.Foldout(showReflectionProperties, new GUIContent("Reflection Properties")); + if (showReflectionProperties) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(doReflections, new GUIContent("Do Reflections", "Enable this for cone-traced reflections.")); + EditorGUILayout.PropertyField(reflectionSteps, new GUIContent("Reflection Steps", "Number of reflection trace steps.")); + EditorGUILayout.PropertyField(reflectionOcclusionPower, new GUIContent("Reflection Occlusion Power", "Strength of light blocking during reflection tracing.")); + EditorGUILayout.PropertyField(skyReflectionIntensity, new GUIContent("Sky Reflection Intensity", "Intensity of sky reflections.")); + EditorGUI.indentLevel--; + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + //Debug tools + showDebugTools = EditorGUILayout.Foldout(showDebugTools, new GUIContent("Debug Tools")); + if (showDebugTools) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(visualizeSunDepthTexture, new GUIContent("Visualize Sun Depth Texture", "Visualize the depth texture used to render proper shadows while injecting sunlight into voxel data.")); + EditorGUILayout.PropertyField(visualizeGI, new GUIContent("Visualize GI", "Visualize GI result only (no textures).")); + EditorGUILayout.PropertyField(visualizeVoxels, new GUIContent("Visualize Voxels", "Directly view the voxels in the scene.")); + EditorGUI.indentLevel--; + } + + + serObj.ApplyModifiedProperties(); + } + + void SavePreset(string name) + { + if (name == "") + { + Debug.LogWarning("SEGI: Type in a name for the preset to be saved!"); + return; + } + + //SEGIPreset preset = new SEGIPreset(); + SEGIPreset preset = ScriptableObject.CreateInstance(); + + preset.voxelResolution = instance.voxelResolution; + preset.voxelAA = instance.voxelAA; + preset.innerOcclusionLayers = instance.innerOcclusionLayers; + preset.infiniteBounces = instance.infiniteBounces; + + preset.temporalBlendWeight = instance.temporalBlendWeight; + preset.useBilateralFiltering = instance.useBilateralFiltering; + preset.halfResolution = instance.halfResolution; + preset.stochasticSampling = instance.stochasticSampling; + preset.doReflections = instance.doReflections; + + preset.cones = instance.cones; + preset.coneTraceSteps = instance.coneTraceSteps; + preset.coneLength = instance.coneLength; + preset.coneWidth = instance.coneWidth; + preset.coneTraceBias = instance.coneTraceBias; + preset.occlusionStrength = instance.occlusionStrength; + preset.nearOcclusionStrength = instance.nearOcclusionStrength; + preset.occlusionPower = instance.occlusionPower; + preset.nearLightGain = instance.nearLightGain; + preset.giGain = instance.giGain; + preset.secondaryBounceGain = instance.secondaryBounceGain; + + preset.reflectionSteps = instance.reflectionSteps; + preset.reflectionOcclusionPower = instance.reflectionOcclusionPower; + preset.skyReflectionIntensity = instance.skyReflectionIntensity; + preset.gaussianMipFilter = instance.gaussianMipFilter; + + preset.farOcclusionStrength = instance.farOcclusionStrength; + preset.farthestOcclusionStrength = instance.farthestOcclusionStrength; + preset.secondaryCones = instance.secondaryCones; + preset.secondaryOcclusionStrength = instance.secondaryOcclusionStrength; + + string path = presetPath + "/"; + + AssetDatabase.CreateAsset(preset, path + name + ".asset"); + + AssetDatabase.SaveAssets(); + } + + void LoadPreset() + { + + } +} diff --git a/Assets/SEGI/Editor/SEGIEditor.cs.meta b/Assets/SEGI/Editor/SEGIEditor.cs.meta new file mode 100644 index 0000000..32ee7a7 --- /dev/null +++ b/Assets/SEGI/Editor/SEGIEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 015c117111fc9024dafd7459f149c700 +timeCreated: 1502920240 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Editor/segilogo.png b/Assets/SEGI/Editor/segilogo.png new file mode 100644 index 0000000..73935ab Binary files /dev/null and b/Assets/SEGI/Editor/segilogo.png differ diff --git a/Assets/SEGI/Editor/segilogo.png.meta b/Assets/SEGI/Editor/segilogo.png.meta new file mode 100644 index 0000000..12bd9b3 --- /dev/null +++ b/Assets/SEGI/Editor/segilogo.png.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: dbb032076c5c83c41bba0c204a2a970a +timeCreated: 1502923531 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/LICENSE b/Assets/SEGI/LICENSE new file mode 100644 index 0000000..fa19018 --- /dev/null +++ b/Assets/SEGI/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 sonicether + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/SEGI/README.md b/Assets/SEGI/README.md new file mode 100644 index 0000000..b4bb340 --- /dev/null +++ b/Assets/SEGI/README.md @@ -0,0 +1,23 @@ +

+ +

+ +# SEGI +A fully-dynamic voxel-based global illumination system for Unity. More details at http://www.sonicether.com/segi/ + +

+ + +

+ +# Installation +Check the [Releases](https://github.com/sonicether/SEGI/releases) section above to download a version of SEGI that is a simple .unitypackage file which is ready for you to import into your project. + +You can also click the "Clone or Download" button and select "Download Zip", then extract the contents to "Assets/SEGI" in your project to test out the latest unreleased versions of SEGI. + +All the scripts and files for SEGI must be in "Assets/SEGI" for SEGI to fully function properly in your project. + +Please refer to the User Guide.pdf for usage instructions. + +# Community +If you need some help, feel free to ask any questions in the [official thread](https://forum.unity.com/threads/segi-fully-dynamic-global-illumination.410310) on Unity forums. diff --git a/Assets/SEGI/Resources.meta b/Assets/SEGI/Resources.meta new file mode 100644 index 0000000..c4b08df --- /dev/null +++ b/Assets/SEGI/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 38f1ddad6fdb5944184d42eb02f56391 +folderAsset: yes +timeCreated: 1465533034 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Cascaded Presets.meta b/Assets/SEGI/Resources/Cascaded Presets.meta new file mode 100644 index 0000000..3844479 --- /dev/null +++ b/Assets/SEGI/Resources/Cascaded Presets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 788286a59045d4d4abd0a7863ee61096 +folderAsset: yes +timeCreated: 1502922185 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Cascaded Presets/Accurate 2.asset b/Assets/SEGI/Resources/Cascaded Presets/Accurate 2.asset new file mode 100644 index 0000000..3ec0171 --- /dev/null +++ b/Assets/SEGI/Resources/Cascaded Presets/Accurate 2.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 195d4ee8e5f057f4590c043b132f9c86, type: 3} + m_Name: Accurate 2 + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.103 + useBilateralFiltering: 0 + halfResolution: 0 + stochasticSampling: 1 + doReflections: 0 + cones: 4 + coneTraceSteps: 10 + coneLength: 1 + coneWidth: 2.21 + coneTraceBias: 2.9 + occlusionStrength: 0.148 + nearOcclusionStrength: 0.19 + occlusionPower: 0.63 + nearLightGain: 0.36 + giGain: 0.59 + secondaryBounceGain: 0.7 + reflectionSteps: 64 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 0.42 + farthestOcclusionStrength: 0.82 + secondaryCones: 6 + secondaryOcclusionStrength: 0.271 diff --git a/Assets/SEGI/Resources/Cascaded Presets/Accurate.asset b/Assets/SEGI/Resources/Cascaded Presets/Accurate.asset new file mode 100644 index 0000000..6ff5fd3 --- /dev/null +++ b/Assets/SEGI/Resources/Cascaded Presets/Accurate.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 195d4ee8e5f057f4590c043b132f9c86, type: 3} + m_Name: Accurate + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.103 + useBilateralFiltering: 0 + halfResolution: 0 + stochasticSampling: 1 + doReflections: 0 + cones: 11 + coneTraceSteps: 10 + coneLength: 1 + coneWidth: 2.21 + coneTraceBias: 2.9 + occlusionStrength: 0.148 + nearOcclusionStrength: 0.19 + occlusionPower: 0.63 + nearLightGain: 0.36 + giGain: 0.59 + secondaryBounceGain: 0.7 + reflectionSteps: 64 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 0.42 + farthestOcclusionStrength: 0.82 + secondaryCones: 6 + secondaryOcclusionStrength: 0.271 diff --git a/Assets/SEGI/Resources/Cascaded Presets/Accurate.asset.meta b/Assets/SEGI/Resources/Cascaded Presets/Accurate.asset.meta new file mode 100644 index 0000000..cf20847 --- /dev/null +++ b/Assets/SEGI/Resources/Cascaded Presets/Accurate.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c087adfe9a1e5724c8c5c1eade4011db +timeCreated: 1502920335 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Cascaded Presets/Lite.asset b/Assets/SEGI/Resources/Cascaded Presets/Lite.asset new file mode 100644 index 0000000..16804cb --- /dev/null +++ b/Assets/SEGI/Resources/Cascaded Presets/Lite.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 195d4ee8e5f057f4590c043b132f9c86, type: 3} + m_Name: Lite + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.103 + useBilateralFiltering: 0 + halfResolution: 0 + stochasticSampling: 1 + doReflections: 0 + cones: 4 + coneTraceSteps: 10 + coneLength: 1 + coneWidth: 3.91 + coneTraceBias: 2.9 + occlusionStrength: 0.148 + nearOcclusionStrength: 0.19 + occlusionPower: 0.63 + nearLightGain: 0.36 + giGain: 0.59 + secondaryBounceGain: 0.7 + reflectionSteps: 64 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 0.42 + farthestOcclusionStrength: 0.82 + secondaryCones: 6 + secondaryOcclusionStrength: 0.271 diff --git a/Assets/SEGI/Resources/Cascaded Presets/Standard.asset b/Assets/SEGI/Resources/Cascaded Presets/Standard.asset new file mode 100644 index 0000000..e31d6f9 --- /dev/null +++ b/Assets/SEGI/Resources/Cascaded Presets/Standard.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 195d4ee8e5f057f4590c043b132f9c86, type: 3} + m_Name: Standard + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.103 + useBilateralFiltering: 0 + halfResolution: 0 + stochasticSampling: 1 + doReflections: 0 + cones: 4 + coneTraceSteps: 10 + coneLength: 1 + coneWidth: 3.91 + coneTraceBias: 2.9 + occlusionStrength: 0.148 + nearOcclusionStrength: 0.19 + occlusionPower: 0.63 + nearLightGain: 0.36 + giGain: 1 + secondaryBounceGain: 0.7 + reflectionSteps: 64 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 0.42 + farthestOcclusionStrength: 0.82 + secondaryCones: 6 + secondaryOcclusionStrength: 0.271 diff --git a/Assets/SEGI/Resources/Cascaded Presets/Standard.asset.meta b/Assets/SEGI/Resources/Cascaded Presets/Standard.asset.meta new file mode 100644 index 0000000..9836778 --- /dev/null +++ b/Assets/SEGI/Resources/Cascaded Presets/Standard.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e5f5290292f2ce544bbb2d37c4df6e23 +timeCreated: 1502920335 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures.meta b/Assets/SEGI/Resources/Noise Textures.meta new file mode 100644 index 0000000..e230743 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 40f64b84e7b3b7f4aa2780907a31aa0f +folderAsset: yes +timeCreated: 1483943633 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_0.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_0.png new file mode 100644 index 0000000..5c1fc26 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_0.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_0.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_0.png.meta new file mode 100644 index 0000000..c9613ce --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_0.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 96c870314285da54283eb6c3b8bc1b10 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_1.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_1.png new file mode 100644 index 0000000..f41e4ed Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_1.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_1.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_1.png.meta new file mode 100644 index 0000000..cb03a06 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_1.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: aade91b501b84bc4985a37646fde9e65 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_10.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_10.png new file mode 100644 index 0000000..6a0b810 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_10.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_10.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_10.png.meta new file mode 100644 index 0000000..5cbd57f --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_10.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 94f56ffe561be004ea93bdb8880f91c2 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_11.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_11.png new file mode 100644 index 0000000..77a4179 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_11.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_11.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_11.png.meta new file mode 100644 index 0000000..7911dbf --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_11.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2cee3eda37710fb41aa4551d16cf6a22 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_12.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_12.png new file mode 100644 index 0000000..e27b5ae Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_12.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_12.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_12.png.meta new file mode 100644 index 0000000..66f2181 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_12.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e665f072618b4634582a358a9f8204bb +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_13.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_13.png new file mode 100644 index 0000000..0144bae Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_13.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_13.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_13.png.meta new file mode 100644 index 0000000..07de391 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_13.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 80b7e9ed2d7cd4f4bbc55d3e745fb6f4 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_14.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_14.png new file mode 100644 index 0000000..b4f4f82 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_14.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_14.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_14.png.meta new file mode 100644 index 0000000..1d42b8d --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_14.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1ecb5cdda7716384c89e716858c91a4b +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_15.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_15.png new file mode 100644 index 0000000..2cc165d Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_15.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_15.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_15.png.meta new file mode 100644 index 0000000..ff27db3 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_15.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d44b7b50f72e5934f9e4940e4d554156 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_16.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_16.png new file mode 100644 index 0000000..14b3619 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_16.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_16.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_16.png.meta new file mode 100644 index 0000000..3f3c8af --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_16.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: de1dc65191cf2cb44b9bf2400359feef +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_17.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_17.png new file mode 100644 index 0000000..942a3ec Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_17.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_17.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_17.png.meta new file mode 100644 index 0000000..8f59d58 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_17.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1259b2fc4614ab844973247fa4cbab4e +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_18.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_18.png new file mode 100644 index 0000000..d79b876 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_18.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_18.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_18.png.meta new file mode 100644 index 0000000..4793d63 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_18.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4a3854e93e2e7974b8fbde92ef5bfdaf +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_19.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_19.png new file mode 100644 index 0000000..db28dcc Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_19.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_19.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_19.png.meta new file mode 100644 index 0000000..fb3e6a3 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_19.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8359c343aa598ff44948065a13cc49f3 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_2.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_2.png new file mode 100644 index 0000000..cb40652 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_2.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_2.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_2.png.meta new file mode 100644 index 0000000..233b1e3 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_2.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ded952de1a99eec429c0204eb32c1a8b +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_20.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_20.png new file mode 100644 index 0000000..81cf178 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_20.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_20.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_20.png.meta new file mode 100644 index 0000000..1d4f50f --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_20.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 453f2854e69e0be4384e4e23dbec126f +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_21.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_21.png new file mode 100644 index 0000000..7642668 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_21.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_21.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_21.png.meta new file mode 100644 index 0000000..53d1f61 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_21.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9b155ec3bd1a0dd45b47be48a0dcf8b3 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_22.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_22.png new file mode 100644 index 0000000..c2b4441 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_22.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_22.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_22.png.meta new file mode 100644 index 0000000..d08dfd8 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_22.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9c7ef55c389f0294fa4cf887191ceaf2 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_23.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_23.png new file mode 100644 index 0000000..3859d12 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_23.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_23.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_23.png.meta new file mode 100644 index 0000000..6a871bf --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_23.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b82d80962bb121c4cb4ba1d15a4c92a6 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_24.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_24.png new file mode 100644 index 0000000..f7becb1 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_24.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_24.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_24.png.meta new file mode 100644 index 0000000..c74c678 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_24.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 09854c7a4f7c1b4408b36974ee3c6c4d +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_25.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_25.png new file mode 100644 index 0000000..776ab64 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_25.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_25.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_25.png.meta new file mode 100644 index 0000000..a5f80e9 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_25.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 0650700400a99b34580a210897469e7d +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_26.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_26.png new file mode 100644 index 0000000..ca75692 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_26.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_26.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_26.png.meta new file mode 100644 index 0000000..0140200 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_26.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b979dcf79274f8c4e9d963cae5fe30df +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_27.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_27.png new file mode 100644 index 0000000..1715769 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_27.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_27.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_27.png.meta new file mode 100644 index 0000000..9b82609 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_27.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 73278de0e3b838f43b665add25637672 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_28.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_28.png new file mode 100644 index 0000000..c112d65 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_28.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_28.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_28.png.meta new file mode 100644 index 0000000..eb95f7d --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_28.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 43acb110174b4434fb57be9ab6a81c1d +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_29.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_29.png new file mode 100644 index 0000000..eb4ebec Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_29.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_29.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_29.png.meta new file mode 100644 index 0000000..9a312f2 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_29.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b770737829cdcba4dbbdcdef96584b51 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_3.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_3.png new file mode 100644 index 0000000..6f2f2f4 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_3.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_3.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_3.png.meta new file mode 100644 index 0000000..ee94698 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_3.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ce965ea6198383a4a864526c5c68b211 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_30.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_30.png new file mode 100644 index 0000000..5e13aef Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_30.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_30.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_30.png.meta new file mode 100644 index 0000000..8bbc894 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_30.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: cd78a2b5fa93aa14b9b160ab2d136fe4 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_31.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_31.png new file mode 100644 index 0000000..a352c03 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_31.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_31.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_31.png.meta new file mode 100644 index 0000000..cf049f9 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_31.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 08b9de59fc178dc489010f5a325048cf +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_32.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_32.png new file mode 100644 index 0000000..7243fc9 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_32.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_32.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_32.png.meta new file mode 100644 index 0000000..fb2f048 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_32.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b576fc50f60269c4da0c2b8eeeae2034 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_33.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_33.png new file mode 100644 index 0000000..57be782 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_33.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_33.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_33.png.meta new file mode 100644 index 0000000..c390cbf --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_33.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 45d3bce508697e14ab649869bcc581ae +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_34.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_34.png new file mode 100644 index 0000000..da1f938 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_34.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_34.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_34.png.meta new file mode 100644 index 0000000..43e32df --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_34.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 79799e713833ac44e9da3789ee033ea8 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_35.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_35.png new file mode 100644 index 0000000..33b6603 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_35.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_35.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_35.png.meta new file mode 100644 index 0000000..e85a7e6 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_35.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 524e247831e1d14489e9475e20999bb9 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_36.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_36.png new file mode 100644 index 0000000..bdb81ce Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_36.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_36.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_36.png.meta new file mode 100644 index 0000000..6a6acb5 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_36.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b0728d72cfa4110488f0a935820ddb2b +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_37.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_37.png new file mode 100644 index 0000000..32ae4fd Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_37.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_37.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_37.png.meta new file mode 100644 index 0000000..2a1dc94 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_37.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 919ed70fcb4fc0d48900c83bcf38b854 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_38.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_38.png new file mode 100644 index 0000000..3b79e9c Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_38.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_38.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_38.png.meta new file mode 100644 index 0000000..5488852 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_38.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ac5e0126c043628418fdf3f965681e29 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_39.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_39.png new file mode 100644 index 0000000..20d643f Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_39.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_39.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_39.png.meta new file mode 100644 index 0000000..31e4508 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_39.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e4c7b645eb4082e4d89be5061c6df8d3 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_4.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_4.png new file mode 100644 index 0000000..1d5b4d5 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_4.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_4.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_4.png.meta new file mode 100644 index 0000000..c1876d3 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_4.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f7acad99b7075514c8a977de465c717f +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_40.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_40.png new file mode 100644 index 0000000..7e69870 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_40.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_40.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_40.png.meta new file mode 100644 index 0000000..f08eb95 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_40.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 03cd63b83a2b0af4cba4b21da566aea6 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_41.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_41.png new file mode 100644 index 0000000..dc49437 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_41.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_41.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_41.png.meta new file mode 100644 index 0000000..a18fc77 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_41.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2b6ef2b60c5de364dbad8f182944a26f +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_42.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_42.png new file mode 100644 index 0000000..54c8e64 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_42.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_42.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_42.png.meta new file mode 100644 index 0000000..25f81ba --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_42.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a7de65f0651506c44b478e3651b64e97 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_43.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_43.png new file mode 100644 index 0000000..c087fce Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_43.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_43.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_43.png.meta new file mode 100644 index 0000000..9b1f7bb --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_43.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 89b73632fd71bf34196f05ba02b3986b +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_44.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_44.png new file mode 100644 index 0000000..7d8f46f Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_44.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_44.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_44.png.meta new file mode 100644 index 0000000..3ede81b --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_44.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4c23bd54106214041b381d470238c795 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_45.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_45.png new file mode 100644 index 0000000..1f15197 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_45.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_45.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_45.png.meta new file mode 100644 index 0000000..8a41495 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_45.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f3a1fbc881b002446bbb65106cf47b03 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_46.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_46.png new file mode 100644 index 0000000..1a6806c Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_46.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_46.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_46.png.meta new file mode 100644 index 0000000..467f9dc --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_46.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d11a8897f91fd6d49863e9cd7d2a89b1 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_47.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_47.png new file mode 100644 index 0000000..077da76 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_47.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_47.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_47.png.meta new file mode 100644 index 0000000..80b7898 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_47.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 13de44bd7797b2c4cac12e00c65709ee +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_48.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_48.png new file mode 100644 index 0000000..394631f Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_48.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_48.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_48.png.meta new file mode 100644 index 0000000..48dd1b0 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_48.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 42fd2f0f892a263448efcb759529d56d +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_49.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_49.png new file mode 100644 index 0000000..cc6e590 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_49.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_49.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_49.png.meta new file mode 100644 index 0000000..a1af8ad --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_49.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e91aedb3f113ca94f9e59f9b0a34f75f +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_5.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_5.png new file mode 100644 index 0000000..4f146d3 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_5.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_5.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_5.png.meta new file mode 100644 index 0000000..86df7a4 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_5.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d2de9f250b9b30c46b30fe2f98acf2cf +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_50.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_50.png new file mode 100644 index 0000000..e10123f Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_50.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_50.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_50.png.meta new file mode 100644 index 0000000..cf0aabb --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_50.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8639ae91f8fa0db4e89928c8e3cf19b5 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_51.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_51.png new file mode 100644 index 0000000..870ca6b Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_51.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_51.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_51.png.meta new file mode 100644 index 0000000..cb8a9bc --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_51.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4f52b7a17d0a0224081b8193468af221 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_52.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_52.png new file mode 100644 index 0000000..38f1ff7 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_52.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_52.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_52.png.meta new file mode 100644 index 0000000..eedfde0 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_52.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 83ce85e396b6d0345ae2e99a162c208b +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_53.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_53.png new file mode 100644 index 0000000..7bac6dd Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_53.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_53.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_53.png.meta new file mode 100644 index 0000000..5651d5c --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_53.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 930cb0e4990e711418d1f34653e4c534 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_54.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_54.png new file mode 100644 index 0000000..207ca5e Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_54.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_54.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_54.png.meta new file mode 100644 index 0000000..f2088d6 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_54.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6e9f663787238144a93fa4ce25adc253 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_55.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_55.png new file mode 100644 index 0000000..e53c3ba Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_55.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_55.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_55.png.meta new file mode 100644 index 0000000..0bec4e1 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_55.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d24388cbf59140d428cf22416b06b802 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_56.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_56.png new file mode 100644 index 0000000..0d8edd7 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_56.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_56.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_56.png.meta new file mode 100644 index 0000000..3e8b38b --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_56.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3a8fe2b218d6cf544ac21d9dee12b10b +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_57.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_57.png new file mode 100644 index 0000000..0501a9a Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_57.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_57.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_57.png.meta new file mode 100644 index 0000000..01f476e --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_57.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 262503e57fef3e64fba2a23ccb0076c2 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_58.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_58.png new file mode 100644 index 0000000..77946d6 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_58.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_58.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_58.png.meta new file mode 100644 index 0000000..0d2c129 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_58.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 73742540a077654459ecde18a64bdb59 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_59.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_59.png new file mode 100644 index 0000000..655444e Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_59.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_59.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_59.png.meta new file mode 100644 index 0000000..cd0ecf1 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_59.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b46597948c739d04cba7fc53b6e8954d +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_6.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_6.png new file mode 100644 index 0000000..87517bb Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_6.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_6.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_6.png.meta new file mode 100644 index 0000000..2600da8 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_6.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 720483567bbee3442adc1b11d21b5e3a +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_60.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_60.png new file mode 100644 index 0000000..d58be6d Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_60.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_60.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_60.png.meta new file mode 100644 index 0000000..2f53bec --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_60.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 958e9776200114d4686caa51e5bfac4c +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_61.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_61.png new file mode 100644 index 0000000..9e886b1 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_61.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_61.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_61.png.meta new file mode 100644 index 0000000..9b40a41 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_61.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2847374087768a545b6d476f9e3e1128 +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_62.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_62.png new file mode 100644 index 0000000..6e2b59b Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_62.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_62.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_62.png.meta new file mode 100644 index 0000000..fa2eb99 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_62.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9da5210f2d657d243a596fa090f8b781 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_63.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_63.png new file mode 100644 index 0000000..5e556e6 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_63.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_63.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_63.png.meta new file mode 100644 index 0000000..7243336 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_63.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2210fee5167d5d14fa19fcfc16029a5a +timeCreated: 1497760282 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_7.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_7.png new file mode 100644 index 0000000..edf90a8 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_7.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_7.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_7.png.meta new file mode 100644 index 0000000..2129bac --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_7.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: fdf192cfaf90f154290d58bf09b02b71 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_8.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_8.png new file mode 100644 index 0000000..f320d3f Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_8.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_8.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_8.png.meta new file mode 100644 index 0000000..ec980ec --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_8.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: dc4847c2f4c8ebe4e8e7301f2ed856cb +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_9.png b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_9.png new file mode 100644 index 0000000..758aed0 Binary files /dev/null and b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_9.png differ diff --git a/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_9.png.meta b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_9.png.meta new file mode 100644 index 0000000..c22a2b5 --- /dev/null +++ b/Assets/SEGI/Resources/Noise Textures/LDR_RGBA_9.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 75d836198e1264540b1ee518768d8ba5 +timeCreated: 1497760283 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets.meta b/Assets/SEGI/Resources/Presets.meta new file mode 100644 index 0000000..0e9e5e9 --- /dev/null +++ b/Assets/SEGI/Resources/Presets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4d9af679b2ad6f14e85b9f7ecc5da4ae +folderAsset: yes +timeCreated: 1452429898 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Bright.asset b/Assets/SEGI/Resources/Presets/Bright.asset new file mode 100644 index 0000000..24dc6e5 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Bright.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Bright + m_EditorClassIdentifier: + voxelResolution: 256 + voxelAA: 1 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.13 + useBilateralFiltering: 0 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 1 + cones: 32 + coneTraceSteps: 11 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.64 + occlusionStrength: 0.69 + nearOcclusionStrength: 0.6 + occlusionPower: 0.6 + nearLightGain: 0 + giGain: 1.36 + secondaryBounceGain: 1.74 + reflectionSteps: 73 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 6 + secondaryOcclusionStrength: 0.7 diff --git a/Assets/SEGI/Resources/Presets/Bright.asset.meta b/Assets/SEGI/Resources/Presets/Bright.asset.meta new file mode 100644 index 0000000..5429046 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Bright.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6b2ebce223e6af54b91c11707007ac52 +timeCreated: 1502922273 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/High.asset b/Assets/SEGI/Resources/Presets/High.asset new file mode 100644 index 0000000..52dc396 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/High.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: High + m_EditorClassIdentifier: + voxelResolution: 256 + voxelAA: 1 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.13 + useBilateralFiltering: 1 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 1 + cones: 20 + coneTraceSteps: 8 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.64 + occlusionStrength: 0.69 + nearOcclusionStrength: 0.6 + occlusionPower: 1.06 + nearLightGain: 0 + giGain: 1.36 + secondaryBounceGain: 1.45 + reflectionSteps: 73 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 6 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/High.asset.meta b/Assets/SEGI/Resources/Presets/High.asset.meta new file mode 100644 index 0000000..b265bf8 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/High.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0d981da1c3fe167469bedb2d4051e4ce +timeCreated: 1502922277 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Insane.asset b/Assets/SEGI/Resources/Presets/Insane.asset new file mode 100644 index 0000000..406031a --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Insane.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Insane + m_EditorClassIdentifier: + voxelResolution: 256 + voxelAA: 1 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.13 + useBilateralFiltering: 0 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 1 + cones: 39 + coneTraceSteps: 22 + coneLength: 1 + coneWidth: 4.11 + coneTraceBias: 0.64 + occlusionStrength: 0.69 + nearOcclusionStrength: 0.6 + occlusionPower: 1.06 + nearLightGain: 0 + giGain: 1.36 + secondaryBounceGain: 1.45 + reflectionSteps: 73 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 6 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Insane.asset.meta b/Assets/SEGI/Resources/Presets/Insane.asset.meta new file mode 100644 index 0000000..d4aed1f --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Insane.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e4d4652d7db78254690fcdf6a60a9114 +timeCreated: 1502922282 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Low.asset b/Assets/SEGI/Resources/Presets/Low.asset new file mode 100644 index 0000000..432ceb4 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Low.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Low + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 1 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.13 + useBilateralFiltering: 1 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 0 + cones: 11 + coneTraceSteps: 8 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.64 + occlusionStrength: 0.56 + nearOcclusionStrength: 0.42 + occlusionPower: 0.62 + nearLightGain: 0 + giGain: 1.09 + secondaryBounceGain: 1.84 + reflectionSteps: 70 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 3 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Low.asset.meta b/Assets/SEGI/Resources/Presets/Low.asset.meta new file mode 100644 index 0000000..102fa3a --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Low.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 28519154347e6a044a59179298cba08f +timeCreated: 1502922289 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Medium.asset b/Assets/SEGI/Resources/Presets/Medium.asset new file mode 100644 index 0000000..09c5d26 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Medium.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Medium + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.13 + useBilateralFiltering: 1 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 1 + cones: 7 + coneTraceSteps: 9 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.64 + occlusionStrength: 0.69 + nearOcclusionStrength: 0.6 + occlusionPower: 1.06 + nearLightGain: 0 + giGain: 1.17 + secondaryBounceGain: 1.87 + reflectionSteps: 70 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 6 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Medium.asset.meta b/Assets/SEGI/Resources/Presets/Medium.asset.meta new file mode 100644 index 0000000..5dcb59c --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Medium.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b17028f848222554092a65f240008718 +timeCreated: 1502922294 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Sponza High.asset b/Assets/SEGI/Resources/Presets/Sponza High.asset new file mode 100644 index 0000000..4b5fd4e --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza High.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Sponza High + m_EditorClassIdentifier: + voxelResolution: 256 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 1 + useBilateralFiltering: 0 + halfResolution: 1 + stochasticSampling: 0 + doReflections: 1 + cones: 18 + coneTraceSteps: 10 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.64 + occlusionStrength: 0.82 + nearOcclusionStrength: 0.42 + occlusionPower: 0.71 + nearLightGain: 1.07 + giGain: 0.5 + secondaryBounceGain: 1.43 + reflectionSteps: 59 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 4 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Sponza High.asset.meta b/Assets/SEGI/Resources/Presets/Sponza High.asset.meta new file mode 100644 index 0000000..73d6111 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza High.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 700594f78da43ca4c830b17a66411cc2 +timeCreated: 1502922301 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Sponza Low.asset b/Assets/SEGI/Resources/Presets/Sponza Low.asset new file mode 100644 index 0000000..1c6b74e --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza Low.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Sponza Low + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.184 + useBilateralFiltering: 1 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 0 + cones: 8 + coneTraceSteps: 8 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 1.12 + occlusionStrength: 0.8 + nearOcclusionStrength: 0.39 + occlusionPower: 0.7 + nearLightGain: 0.1 + giGain: 0.7 + secondaryBounceGain: 1.56 + reflectionSteps: 26 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 1 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 4 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Sponza Low.asset.meta b/Assets/SEGI/Resources/Presets/Sponza Low.asset.meta new file mode 100644 index 0000000..174680b --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza Low.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 522fb0fd2b6bd1a4e82ed429418f0610 +timeCreated: 1502922309 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Sponza Medium.asset b/Assets/SEGI/Resources/Presets/Sponza Medium.asset new file mode 100644 index 0000000..01d4daf --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza Medium.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Sponza Medium + m_EditorClassIdentifier: + voxelResolution: 128 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.137 + useBilateralFiltering: 1 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 1 + cones: 13 + coneTraceSteps: 8 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.63 + occlusionStrength: 0.66 + nearOcclusionStrength: 0 + occlusionPower: 1 + nearLightGain: 0.1 + giGain: 0.75 + secondaryBounceGain: 1.4 + reflectionSteps: 64 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 1 + farOcclusionStrength: 1 + farthestOcclusionStrength: 0.94 + secondaryCones: 6 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Sponza Medium.asset.meta b/Assets/SEGI/Resources/Presets/Sponza Medium.asset.meta new file mode 100644 index 0000000..470814b --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza Medium.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 46e1185dc97905249ad901ae9a7c813e +timeCreated: 1502922316 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Sponza Ultra.asset b/Assets/SEGI/Resources/Presets/Sponza Ultra.asset new file mode 100644 index 0000000..fe2148a --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza Ultra.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Sponza Ultra + m_EditorClassIdentifier: + voxelResolution: 256 + voxelAA: 0 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.15 + useBilateralFiltering: 0 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 1 + cones: 31 + coneTraceSteps: 10 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.63 + occlusionStrength: 0.77 + nearOcclusionStrength: 0 + occlusionPower: 1 + nearLightGain: 0.26 + giGain: 0.77 + secondaryBounceGain: 1.19 + reflectionSteps: 64 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 0.89 + farthestOcclusionStrength: 0.53 + secondaryCones: 4 + secondaryOcclusionStrength: 0.7 diff --git a/Assets/SEGI/Resources/Presets/Sponza Ultra.asset.meta b/Assets/SEGI/Resources/Presets/Sponza Ultra.asset.meta new file mode 100644 index 0000000..2bd10b6 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Sponza Ultra.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 96db15ad24bf8dc49831aa4373a1472f +timeCreated: 1502922324 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Ultra Clean.asset b/Assets/SEGI/Resources/Presets/Ultra Clean.asset new file mode 100644 index 0000000..341d1f2 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Ultra Clean.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Ultra Clean + m_EditorClassIdentifier: + voxelResolution: 256 + voxelAA: 1 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 1 + useBilateralFiltering: 0 + halfResolution: 1 + stochasticSampling: 0 + doReflections: 1 + cones: 15 + coneTraceSteps: 11 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.64 + occlusionStrength: 0.46 + nearOcclusionStrength: 0.24 + occlusionPower: 0.96 + nearLightGain: 0 + giGain: 1.36 + secondaryBounceGain: 1.64 + reflectionSteps: 73 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 1 + farOcclusionStrength: 1 + farthestOcclusionStrength: 0.62 + secondaryCones: 6 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Ultra Clean.asset.meta b/Assets/SEGI/Resources/Presets/Ultra Clean.asset.meta new file mode 100644 index 0000000..deaf66f --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Ultra Clean.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6838f9c9a9789eb4ea0b6592dbd29932 +timeCreated: 1502922330 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/Presets/Ultra.asset b/Assets/SEGI/Resources/Presets/Ultra.asset new file mode 100644 index 0000000..2cd30c0 --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Ultra.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c7780f824b3fbed498c366c0f53ccef9, type: 3} + m_Name: Ultra + m_EditorClassIdentifier: + voxelResolution: 256 + voxelAA: 1 + innerOcclusionLayers: 1 + infiniteBounces: 1 + temporalBlendWeight: 0.13 + useBilateralFiltering: 0 + halfResolution: 1 + stochasticSampling: 1 + doReflections: 1 + cones: 32 + coneTraceSteps: 11 + coneLength: 1 + coneWidth: 6 + coneTraceBias: 0.64 + occlusionStrength: 0.69 + nearOcclusionStrength: 0.6 + occlusionPower: 1.06 + nearLightGain: 0 + giGain: 1.36 + secondaryBounceGain: 1.45 + reflectionSteps: 73 + reflectionOcclusionPower: 1 + skyReflectionIntensity: 1 + gaussianMipFilter: 0 + farOcclusionStrength: 1 + farthestOcclusionStrength: 1 + secondaryCones: 6 + secondaryOcclusionStrength: 1 diff --git a/Assets/SEGI/Resources/Presets/Ultra.asset.meta b/Assets/SEGI/Resources/Presets/Ultra.asset.meta new file mode 100644 index 0000000..6d4c95c --- /dev/null +++ b/Assets/SEGI/Resources/Presets/Ultra.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8296f7aff584a024ebbdd8d55c430449 +timeCreated: 1502922334 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGI.cginc b/Assets/SEGI/Resources/SEGI.cginc new file mode 100644 index 0000000..4a8156c --- /dev/null +++ b/Assets/SEGI/Resources/SEGI.cginc @@ -0,0 +1,287 @@ +float SEGIVoxelScaleFactor; + +int StochasticSampling; +int TraceDirections; +int TraceSteps; +float TraceLength; +float ConeSize; +float OcclusionStrength; +float OcclusionPower; +float ConeTraceBias; +float GIGain; +float NearLightGain; +float NearOcclusionStrength; +float SEGISoftSunlight; +float FarOcclusionStrength; +float FarthestOcclusionStrength; + + +half4 GISunColor; + +sampler3D SEGIVolumeLevel0; +sampler3D SEGIVolumeLevel1; +sampler3D SEGIVolumeLevel2; +sampler3D SEGIVolumeLevel3; +sampler3D SEGIVolumeLevel4; +sampler3D SEGIVolumeLevel5; +sampler3D SEGIVolumeLevel6; +sampler3D SEGIVolumeLevel7; +sampler3D VolumeTexture1; +sampler3D VolumeTexture2; +sampler3D VolumeTexture3; + +float4x4 SEGIVoxelProjection; +float4x4 SEGIWorldToVoxel; +float4x4 GIProjectionInverse; +float4x4 GIToWorld; + +float4x4 GIToVoxelProjection; + + +half4 SEGISkyColor; + +float4 SEGISunlightVector; + +int ReflectionSteps; + + +uniform half4 _MainTex_TexelSize; + +float4x4 ProjectionMatrixInverse; + +sampler2D _CameraDepthNormalsTexture; +sampler2D _CameraDepthTexture; +sampler2D _MainTex; +sampler2D PreviousGITexture; +sampler2D _CameraGBufferTexture0; +sampler2D _CameraMotionVectorsTexture; +float4x4 WorldToCamera; +float4x4 ProjectionMatrix; + +int SEGISphericalSkylight; + +float GetDepthTexture(float2 coord) +{ +#if defined(UNITY_REVERSED_Z) + return 1.0 - tex2Dlod(_CameraDepthTexture, float4(coord.x, coord.y, 0.0, 0.0)).x; +#else + return tex2Dlod(_CameraDepthTexture, float4(coord.x, coord.y, 0.0, 0.0)).x; +#endif +} + +float4 GetViewSpacePosition(float2 coord) +{ + float depth = GetDepthTexture(coord); + + float4 viewPosition = mul(ProjectionMatrixInverse, float4(coord.x * 2.0 - 1.0, coord.y * 2.0 - 1.0, 2.0 * depth - 1.0, 1.0)); + viewPosition /= viewPosition.w; + + return viewPosition; +} + +float3 ProjectBack(float4 viewPos) +{ + viewPos = mul(ProjectionMatrix, float4(viewPos.xyz, 0.0)); + viewPos.xyz /= viewPos.w; + viewPos.xyz = viewPos.xyz * 0.5 + 0.5; + return viewPos.xyz; +} + + +float2 rand(float2 coord) +{ + float noiseX = saturate(frac(sin(dot(coord, float2(12.9898, 78.223))) * 43758.5453)); + float noiseY = saturate(frac(sin(dot(coord, float2(12.9898, 78.223)*2.0)) * 43758.5453)); + + return float2(noiseX, noiseY); +} + +float4 ConeTrace(float3 voxelOrigin, float3 kernel, float3 worldNormal, float2 uv, float noise, int steps, float width, float lengthMult, float skyMult) +{ + float skyVisibility = 1.0; + + float3 gi = float3(0, 0, 0); + + int numSteps = (int)(steps * lerp(SEGIVoxelScaleFactor, 1.0, 0.5)); + + float3 adjustedKernel = normalize(kernel.xyz + worldNormal.xyz * 0.00 * width); + + + for (int i = 0; i < numSteps; i++) + { + float fi = ((float)i) / numSteps; + fi = lerp(fi, 1.0, 0.01); + + float coneDistance = (exp2(fi * 4.0) - 0.9) / 8.0; + + coneDistance -= 0.00; + + float coneSize = fi * width * lerp(SEGIVoxelScaleFactor, 1.0, 0.5); + + float3 voxelCheckCoord = voxelOrigin.xyz + adjustedKernel.xyz * (coneDistance * 0.12 * TraceLength * lengthMult + 0.001); + + float4 sample = float4(0.0, 0.0, 0.0, 0.0); + int mipLevel = floor(coneSize); + if (mipLevel == 0) + sample = tex3Dlod(SEGIVolumeLevel0, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 1) + sample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 2) + sample = tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 3) + sample = tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 4) + sample = tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 5) + sample = tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, coneSize)); + else + sample = float4(1, 1, 1, 0); + + + float occlusion = skyVisibility * skyVisibility; + + float falloffFix = pow(fi, 1.0) * 4.0 + NearLightGain; + + sample.a *= lerp(saturate(coneSize / 1.0), 1.0, NearOcclusionStrength); + gi.rgb += sample.rgb * (coneSize * 1.0 + 1.0) * occlusion * falloffFix; + + skyVisibility *= pow(saturate(1.0 - (sample.a) * (coneSize * 0.2 * FarOcclusionStrength + 1.0 + coneSize * coneSize * 0.05 * FarthestOcclusionStrength) * OcclusionStrength), lerp(0.014, 1.5 * OcclusionPower, min(1.0, coneSize / 5.0))); + } + + float NdotL = pow(saturate(dot(worldNormal, kernel) * 1.0 - 0.0), 0.5); + + gi *= NdotL; + skyVisibility *= NdotL; + if (StochasticSampling > 0) + { + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0 + 0.0), 1.0, SEGISphericalSkylight); + } + else + { + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0 + 0.0), 1.0, SEGISphericalSkylight); + } + + float3 skyColor = float3(0.0, 0.0, 0.0); + + float upGradient = saturate(dot(kernel, float3(0.0, 1.0, 0.0))); + float sunGradient = saturate(dot(kernel, -SEGISunlightVector.xyz)); + skyColor += lerp(SEGISkyColor.rgb * 1.0, SEGISkyColor.rgb * 0.5, pow(upGradient, (0.5).xxx)); + skyColor += GISunColor.rgb * pow(sunGradient, (4.0).xxx) * SEGISoftSunlight; + + gi.rgb *= GIGain * 0.25; + + gi += skyColor * skyVisibility * skyMult; + + return float4(gi.rgb * 0.8, 0.0f); +} + + + + +float ReflectionOcclusionPower; +float SkyReflectionIntensity; + +float4 SpecularConeTrace(float3 voxelOrigin, float3 kernel, float3 worldNormal, float smoothness, float2 uv, float dither) +{ + float skyVisibility = 1.0; + + float3 gi = float3(0, 0, 0); + + float coneLength = 6.0; + float coneSizeScalar = lerp(1.3, 0.05, smoothness) * coneLength; + + float3 adjustedKernel = normalize(kernel.xyz + worldNormal.xyz * 0.2 * (1.0 - smoothness)); + + int numSamples = (int)(lerp(uint(ReflectionSteps) / uint(5), ReflectionSteps, smoothness)); + + for (int i = 0; i < numSamples; i++) + { + float fi = ((float)i) / numSamples; + + float coneSize = fi * coneSizeScalar; + + float coneDistance = (exp2(fi * coneSizeScalar) - 0.998) / exp2(coneSizeScalar); + + float3 voxelCheckCoord = voxelOrigin.xyz + adjustedKernel.xyz * (coneDistance * 0.12 * coneLength + 0.001); + + float4 sample = float4(0.0, 0.0, 0.0, 0.0); + coneSize = pow(coneSize / 5.0, 2.0) * 5.0; + int mipLevel = floor(coneSize); + if (mipLevel == 0) + { + sample = tex3Dlod(SEGIVolumeLevel0, float4(voxelCheckCoord.xyz, coneSize)); + sample = lerp(sample, tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize + 1.0)), frac(coneSize)); + } + else if (mipLevel == 1) + { + sample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize)); + sample = lerp(sample, tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, coneSize + 1.0)), frac(coneSize)); + } + else if (mipLevel == 2) + { + sample = tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, coneSize)); + sample = lerp(sample, tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, coneSize + 1.0)), frac(coneSize)); + } + else if (mipLevel == 3) + { + sample = tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, coneSize)); + sample = lerp(sample, tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, coneSize + 1.0)), frac(coneSize)); + } + else if (mipLevel == 4) + { + sample = tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, coneSize)); + sample = lerp(sample, tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, coneSize + 1.0)), frac(coneSize)); + } + else if (mipLevel == 5) + sample = tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, coneSize)); + else + sample = float4(0, 0, 0, 0); + + float occlusion = skyVisibility; + + float falloffFix = fi * 6.0 + 0.6; + + gi.rgb += sample.rgb * (coneSize * 5.0 + 1.0) * occlusion * 0.5; + sample.a *= lerp(saturate(fi / 0.2), 1.0, NearOcclusionStrength); + skyVisibility *= pow(saturate(1.0 - sample.a * 0.5), (lerp(4.0, 1.0, smoothness) + coneSize * 0.5) * ReflectionOcclusionPower); + } + + skyVisibility *= saturate(dot(worldNormal, kernel) * 0.7 + 0.3); + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0), 1.0, SEGISphericalSkylight); + + gi *= saturate(dot(worldNormal, kernel) * 10.0); + + return float4(gi.rgb * 4.0, skyVisibility); +} + +float4 VisualConeTrace(float3 voxelOrigin, float3 kernel) +{ + float skyVisibility = 1.0; + + float3 gi = float3(0, 0, 0); + + float coneLength = 6.0; + float coneSizeScalar = 0.25 * coneLength; + + for (int i = 0; i < 423; i++) + { + float fi = ((float)i) / 423; + + float coneSize = fi * coneSizeScalar; + + float3 voxelCheckCoord = voxelOrigin.xyz + kernel.xyz * (0.12 * coneLength * fi * fi + 0.005); + + float4 sample = float4(0.0, 0.0, 0.0, 0.0); + + sample = tex3Dlod(SEGIVolumeLevel0, float4(voxelCheckCoord.xyz, coneSize)); + + float occlusion = skyVisibility; + + float falloffFix = fi * 6.0 + 0.6; + + gi.rgb += sample.rgb * (coneSize * 5.0 + 1.0) * occlusion * 0.5; + skyVisibility *= saturate(1.0 - sample.a); + } + + return float4(gi.rgb, skyVisibility); +} \ No newline at end of file diff --git a/Assets/SEGI/Resources/SEGI.cginc.meta b/Assets/SEGI/Resources/SEGI.cginc.meta new file mode 100644 index 0000000..1b92d90 --- /dev/null +++ b/Assets/SEGI/Resources/SEGI.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 714638d855f031b4aa4a5f418656d373 +timeCreated: 1502920243 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGI.shader b/Assets/SEGI/Resources/SEGI.shader new file mode 100644 index 0000000..54f40c5 --- /dev/null +++ b/Assets/SEGI/Resources/SEGI.shader @@ -0,0 +1,712 @@ +Shader "Hidden/SEGI" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +CGINCLUDE + #include "UnityCG.cginc" + #include "SEGI.cginc" + #pragma target 5.0 + + + struct v2f + { + float4 pos : SV_POSITION; + float4 uv : TEXCOORD0; + + #if UNITY_UV_STARTS_AT_TOP + half4 uv2 : TEXCOORD1; + #endif + }; + + v2f vert(appdata_img v) + { + v2f o; + + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = float4(v.texcoord.xy, 1, 1); + + #if UNITY_UV_STARTS_AT_TOP + o.uv2 = float4(v.texcoord.xy, 1, 1); + if (_MainTex_TexelSize.y < 0.0) + o.uv.y = 1.0 - o.uv.y; + #endif + + return o; + } + + #define PI 3.147159265 + + +ENDCG + + +SubShader +{ + ZTest Off + Cull Off + ZWrite Off + Fog { Mode off } + + Pass //0 + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4x4 CameraToWorld; + + sampler2D _CameraGBufferTexture2; + + + int FrameSwitch; + int HalfResolution; + + + sampler3D SEGIVolumeTexture1; + + sampler2D NoiseTexture; + + + float4 frag(v2f input) : SV_Target + { + #if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; + #else + float2 coord = input.uv.xy; + #endif + + //Get view space position and view vector + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + + //Get voxel space position + float4 voxelSpacePosition = mul(CameraToWorld, viewSpacePosition); + voxelSpacePosition = mul(SEGIWorldToVoxel, voxelSpacePosition); + voxelSpacePosition = mul(SEGIVoxelProjection, voxelSpacePosition); + voxelSpacePosition.xyz = voxelSpacePosition.xyz * 0.5 + 0.5; + + + //Prepare for cone trace + float2 dither = rand(coord + (float)FrameSwitch * 0.011734); + + float3 worldNormal = normalize(tex2D(_CameraGBufferTexture2, coord).rgb * 2.0 - 1.0); + + float3 voxelOrigin = voxelSpacePosition.xyz + worldNormal.xyz * 0.003 * ConeTraceBias * 1.25 / SEGIVoxelScaleFactor; + + float3 gi = float3(0.0, 0.0, 0.0); + float4 traceResult = float4(0,0,0,0); + + const float phi = 1.618033988; + const float gAngle = phi * PI * 1.0; + + //Get blue noise + float2 noiseCoord = (input.uv.xy * _MainTex_TexelSize.zw) / (64.0).xx; + float blueNoise = tex2Dlod(NoiseTexture, float4(noiseCoord, 0.0, 0.0)).x; + + //Trace GI cones + int numSamples = TraceDirections; + for (int i = 0; i < numSamples; i++) + { + float fi = (float)i + blueNoise * StochasticSampling; + float fiN = fi / numSamples; + float longitude = gAngle * fi; + float latitude = asin(fiN * 2.0 - 1.0); + + float3 kernel; + kernel.x = cos(latitude) * cos(longitude); + kernel.z = cos(latitude) * sin(longitude); + kernel.y = sin(latitude); + + kernel = normalize(kernel + worldNormal.xyz * 1.0); + + traceResult += ConeTrace(voxelOrigin.xyz, kernel.xyz, worldNormal.xyz, coord, dither.y, TraceSteps, ConeSize, 1.0, 1.0); + } + + traceResult /= numSamples; + gi = traceResult.rgb * 20.0; + + + float fadeout = saturate((distance(voxelSpacePosition.xyz, float3(0.5, 0.5, 0.5)) - 0.5f) * 5.0); + + float3 fakeGI = saturate(dot(worldNormal, float3(0, 1, 0)) * 0.5 + 0.5) * SEGISkyColor.rgb * 5.0; + + gi.rgb = lerp(gi.rgb, fakeGI, fadeout); + + gi *= 0.75 + (float)HalfResolution * 0.25; + + + return float4(gi, 1.0); + } + + ENDCG + } + + Pass //1 Bilateral Blur + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float2 Kernel; + + float DepthTolerance; + + sampler2D DepthNormalsLow; + sampler2D _CameraGBufferTexture2; + sampler2D DepthLow; + int SourceScale; + + + float4 frag(v2f input) : COLOR0 + { + float4 blurred = float4(0.0, 0.0, 0.0, 0.0); + float validWeights = 0.0; + float depth = LinearEyeDepth(tex2D(_CameraDepthTexture, input.uv.xy).x); + half3 normal = normalize(tex2D(_CameraGBufferTexture2, input.uv.xy).rgb * 2.0 - 1.0); + float thresh = 0.26; + + float3 viewPosition = GetViewSpacePosition(input.uv.xy).xyz; + float3 viewVector = normalize(viewPosition); + + float NdotV = 1.0 / (saturate(dot(-viewVector, normal.xyz)) + 0.1); + thresh *= 1.0 + NdotV * 2.0; + + for (int i = -4; i <= 4; i++) + { + float2 offs = Kernel.xy * (i) * _MainTex_TexelSize.xy * 1.0; + float sampleDepth = LinearEyeDepth(tex2Dlod(_CameraDepthTexture, float4(input.uv.xy + offs.xy * 1, 0, 0)).x); + half3 sampleNormal = normalize(tex2Dlod(_CameraGBufferTexture2, float4(input.uv.xy + offs.xy * 1, 0, 0)).rgb * 2.0 - 1.0); + + float weight = saturate(1.0 - abs(depth - sampleDepth) / thresh); + weight *= pow(saturate(dot(sampleNormal, normal)), 24.0); + + float4 blurSample = tex2Dlod(_MainTex, float4(input.uv.xy + offs.xy, 0, 0)).rgba; + blurred += blurSample * weight; + validWeights += weight; + } + + blurred /= validWeights + 0.001; + + return blurred; + } + + ENDCG + } + + Pass //2 Blend with scene + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + sampler2D _CameraGBufferTexture2; + sampler2D _CameraGBufferTexture1; + sampler2D GITexture; + sampler2D Reflections; + + + float4x4 CameraToWorld; + + int DoReflections; + + int HalfResolution; + + float4 frag(v2f input) : COLOR0 + { +#if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; +#else + float2 coord = input.uv.xy; +#endif + float4 albedoTex = tex2D(_CameraGBufferTexture0, input.uv.xy); + float3 albedo = albedoTex.rgb; + float3 gi = tex2D(GITexture, input.uv.xy).rgb; + float3 scene = tex2D(_MainTex, input.uv.xy).rgb; + float3 reflections = tex2D(Reflections, input.uv.xy).rgb; + + float3 result = scene + gi * albedoTex.a * albedoTex.rgb; + + if (DoReflections > 0) + { + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + float4 worldViewVector = mul(CameraToWorld, float4(viewVector.xyz, 0.0)); + + float4 spec = tex2D(_CameraGBufferTexture1, coord); + float smoothness = spec.a; + float3 specularColor = spec.rgb; + + float3 worldNormal = normalize(tex2D(_CameraGBufferTexture2, coord).rgb * 2.0 - 1.0); + float3 reflectionKernel = reflect(worldViewVector.xyz, worldNormal); + + float3 fresnel = pow(saturate(dot(worldViewVector.xyz, reflectionKernel.xyz)) * (smoothness * 0.5 + 0.5), 5.0); + fresnel = lerp(fresnel, (1.0).xxx, specularColor.rgb); + + fresnel *= saturate(smoothness * 4.0); + + result = lerp(result, reflections, fresnel); + } + + return float4(result, 1.0); + } + + ENDCG + } + + Pass //3 Temporal blend (with unity motion vectors) + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + sampler2D GITexture; + sampler2D PreviousDepth; + sampler2D CurrentDepth; + sampler2D PreviousLocalWorldPos; + + + float4 CameraPosition; + float4 CameraPositionPrev; + float4x4 ProjectionPrev; + float4x4 ProjectionPrevInverse; + float4x4 WorldToCameraPrev; + float4x4 CameraToWorldPrev; + float4x4 CameraToWorld; + float DeltaTime; + float BlendWeight; + + float4 frag(v2f input) : COLOR0 + { + float3 gi = tex2D(_MainTex, input.uv.xy).rgb; + + + float depth = GetDepthTexture(input.uv.xy); + + float4 currentPos = float4(input.uv.x * 2.0 - 1.0, input.uv.y * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); + + float4 fragpos = mul(ProjectionMatrixInverse, currentPos); + fragpos = mul(CameraToWorld, fragpos); + fragpos /= fragpos.w; + float4 thisWorldPosition = fragpos; + + + + + float2 motionVectors = tex2Dlod(_CameraMotionVectorsTexture, float4(input.uv.xy, 0.0, 0.0)).xy; + float2 reprojCoord = input.uv.xy - motionVectors.xy; + + + + float prevDepth = (tex2Dlod(PreviousDepth, float4(reprojCoord + _MainTex_TexelSize.xy * 0.0, 0.0, 0.0)).x); + #if defined(UNITY_REVERSED_Z) + prevDepth = 1.0 - prevDepth; + #endif + + float4 previousWorldPosition = mul(ProjectionPrevInverse, float4(reprojCoord.xy * 2.0 - 1.0, prevDepth * 2.0 - 1.0, 1.0)); + previousWorldPosition = mul(CameraToWorldPrev, previousWorldPosition); + previousWorldPosition /= previousWorldPosition.w; + + + float blendWeight = BlendWeight; + + float posSimilarity = saturate(1.0 - distance(previousWorldPosition.xyz, thisWorldPosition.xyz) * 1.0); + blendWeight = lerp(1.0, blendWeight, posSimilarity); + + + + + float3 minPrev = float3(10000, 10000, 10000); + float3 maxPrev = float3(0, 0, 0); + + float3 s0 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.5, 0.5), 0, 0)).rgb; + minPrev = s0; + maxPrev = s0; + s0 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.5, -0.5), 0, 0)).rgb; + minPrev = min(minPrev, s0); + maxPrev = max(maxPrev, s0); + s0 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(-0.5, 0.5), 0, 0)).rgb; + minPrev = min(minPrev, s0); + maxPrev = max(maxPrev, s0); + s0 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(-0.5, -0.5), 0, 0)).rgb; + minPrev = min(minPrev, s0); + maxPrev = max(maxPrev, s0); + + + + float3 prevGI = tex2Dlod(PreviousGITexture, float4(reprojCoord, 0.0, 0.0)).rgb; + prevGI = lerp(prevGI, clamp(prevGI, minPrev, maxPrev), 0.25); + + gi = lerp(prevGI, gi, float3(blendWeight, blendWeight, blendWeight)); + + float3 result = gi; + return float4(result, 1.0); + } + + ENDCG + } + + Pass //4 Specular/reflections trace + { + ZTest Always + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4x4 CameraToWorld; + + + sampler2D _CameraGBufferTexture1; + sampler2D _CameraGBufferTexture2; + + + + sampler3D SEGIVolumeTexture1; + + int FrameSwitch; + + + float4 frag(v2f input) : SV_Target + { + #if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; + #else + float2 coord = input.uv.xy; + #endif + + float4 spec = tex2D(_CameraGBufferTexture1, coord); + + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + float4 worldViewVector = mul(CameraToWorld, float4(viewVector.xyz, 0.0)); + + + float4 voxelSpacePosition = mul(CameraToWorld, viewSpacePosition); + float3 worldPosition = voxelSpacePosition.xyz; + voxelSpacePosition = mul(SEGIWorldToVoxel, voxelSpacePosition); + voxelSpacePosition = mul(SEGIVoxelProjection, voxelSpacePosition); + voxelSpacePosition.xyz = voxelSpacePosition.xyz * 0.5 + 0.5; + + float3 worldNormal = normalize(tex2D(_CameraGBufferTexture2, coord).rgb * 2.0 - 1.0); + + float3 voxelOrigin = voxelSpacePosition.xyz + worldNormal.xyz * 0.006 * ConeTraceBias * 1.25 / SEGIVoxelScaleFactor; + + float2 dither = rand(coord + (float)FrameSwitch * 0.11734); + + float smoothness = spec.a * 0.5; + float3 specularColor = spec.rgb; + + float4 reflection = (0.0).xxxx; + + float3 reflectionKernel = reflect(worldViewVector.xyz, worldNormal); + + float3 fresnel = pow(saturate(dot(worldViewVector.xyz, reflectionKernel.xyz)) * (smoothness * 0.5 + 0.5), 5.0); + fresnel = lerp(fresnel, (1.0).xxx, specularColor.rgb); + + voxelOrigin += worldNormal.xyz * 0.002 * 1.25 / SEGIVoxelScaleFactor; + reflection = SpecularConeTrace(voxelOrigin.xyz, reflectionKernel.xyz, worldNormal.xyz, smoothness, coord, dither.x); + + float3 skyReflection = (reflection.a * 1.0 * SEGISkyColor); + + reflection.rgb = reflection.rgb * 0.7 + skyReflection.rgb * 2.4015 * SkyReflectionIntensity; + + return float4(reflection.rgb, 1.0); + } + + ENDCG + } + + Pass //5 Get camera depth texture + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4 frag(v2f input) : COLOR0 + { + float2 coord = input.uv.xy; + float4 tex = tex2D(_CameraDepthTexture, coord); + return tex; + } + + ENDCG + } + + Pass //6 Get camera normals texture + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + + float4 frag(v2f input) : COLOR0 + { + float2 coord = input.uv.xy; + float4 tex = tex2D(_CameraDepthNormalsTexture, coord); + return tex; + } + + ENDCG + } + + + Pass //7 Visualize GI + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + sampler2D GITexture; + + float4 frag(v2f input) : COLOR0 + { + float4 albedoTex = tex2D(_CameraGBufferTexture0, input.uv.xy); + float3 albedo = albedoTex.rgb; + float3 gi = tex2D(GITexture, input.uv.xy).rgb; + return float4(gi, 1.0); + } + + ENDCG + } + + + + Pass //8 Write black + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4 frag(v2f input) : COLOR0 + { + return float4(0.0, 0.0, 0.0, 1.0); + } + + ENDCG + } + + Pass //9 Visualize slice of GI Volume (CURRENTLY UNUSED) + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float LayerToVisualize; + int MipLevelToVisualize; + + sampler3D SEGIVolumeTexture1; + + float4 frag(v2f input) : COLOR0 + { + return float4(tex3D(SEGIVolumeTexture1, float3(input.uv.xy, LayerToVisualize)).rgb, 1.0); + } + + ENDCG + } + + + Pass //10 Visualize voxels (trace through GI volumes) + { +ZTest Always + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4x4 CameraToWorld; + + sampler2D _CameraGBufferTexture2; + + float4 CameraPosition; + + float4 frag(v2f input) : SV_Target + { + #if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; + #else + float2 coord = input.uv.xy; + #endif + + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + float4 worldViewVector = mul(CameraToWorld, float4(viewVector.xyz, 0.0)); + + float4 voxelCameraPosition = mul(SEGIWorldToVoxel, float4(CameraPosition.xyz, 1.0)); + voxelCameraPosition = mul(SEGIVoxelProjection, voxelCameraPosition); + voxelCameraPosition.xyz = voxelCameraPosition.xyz * 0.5 + 0.5; + + float4 result = VisualConeTrace(voxelCameraPosition.xyz, worldViewVector.xyz); + + return float4(result.rgb, 1.0); + } + + ENDCG + } + + Pass //11 Bilateral upsample + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float2 Kernel; + + float DepthTolerance; + + sampler2D DepthNormalsLow; + sampler2D DepthLow; + int SourceScale; + sampler2D CurrentDepth; + sampler2D CurrentNormal; + + + float4 frag(v2f input) : COLOR0 + { + float4 blurred = float4(0.0, 0.0, 0.0, 0.0); + float4 blurredDumb = float4(0.0, 0.0, 0.0, 0.0); + float validWeights = 0.0; + float depth = LinearEyeDepth(tex2D(_CameraDepthTexture, input.uv.xy).x); + half3 normal = DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture, input.uv.xy)); + float thresh = 0.26; + + float3 viewPosition = GetViewSpacePosition(input.uv.xy).xyz; + float3 viewVector = normalize(viewPosition); + + float NdotV = 1.0 / (saturate(dot(-viewVector, normal.xyz)) + 0.1); + thresh *= 1.0 + NdotV * 2.0; + + float4 sample00 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 0.0) * 1.0, 0.0, 0.0)); + float4 sample10 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 0.0) * 1.0, 0.0, 0.0)); + float4 sample11 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 1.0) * 1.0, 0.0, 0.0)); + float4 sample01 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 1.0) * 1.0, 0.0, 0.0)); + + float4 depthSamples = float4(0,0,0,0); + depthSamples.x = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 0.0), 0, 0)).x); + depthSamples.y = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 0.0), 0, 0)).x); + depthSamples.z = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 1.0), 0, 0)).x); + depthSamples.w = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 1.0), 0, 0)).x); + + half3 normal00 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 0.0))); + half3 normal10 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 0.0))); + half3 normal11 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 1.0))); + half3 normal01 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 1.0))); + + float4 depthWeights = saturate(1.0 - abs(depthSamples - depth.xxxx) / thresh); + + float4 normalWeights = float4(0,0,0,0); + normalWeights.x = pow(saturate(dot(normal00, normal)), 24.0); + normalWeights.y = pow(saturate(dot(normal10, normal)), 24.0); + normalWeights.z = pow(saturate(dot(normal11, normal)), 24.0); + normalWeights.w = pow(saturate(dot(normal01, normal)), 24.0); + + float4 weights = depthWeights * normalWeights; + + float weightSum = dot(weights, float4(1.0, 1.0, 1.0, 1.0)); + + if (weightSum < 0.01) + { + weightSum = 4.0; + weights = (1.0).xxxx; + } + + weights /= weightSum; + + float2 fractCoord = frac(input.uv.xy * _MainTex_TexelSize.zw * 1.0); + + float4 filteredX0 = lerp(sample00 * weights.x, sample10 * weights.y, fractCoord.x); + float4 filteredX1 = lerp(sample01 * weights.w, sample11 * weights.z, fractCoord.x); + + float4 filtered = lerp(filteredX0, filteredX1, fractCoord.y); + + + return filtered * 3.0; + + return blurred; + } + + ENDCG + } + + Pass //12 Temporal blending without motion vectors (for legacy support) + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + sampler2D GITexture; + sampler2D PreviousDepth; + sampler2D CurrentDepth; + sampler2D PreviousLocalWorldPos; + + + float4 CameraPosition; + float4 CameraPositionPrev; + float4x4 ProjectionPrev; + float4x4 ProjectionPrevInverse; + float4x4 WorldToCameraPrev; + float4x4 CameraToWorldPrev; + float4x4 CameraToWorld; + float DeltaTime; + float BlendWeight; + + float4 frag(v2f input) : COLOR0 + { + float3 gi = tex2D(_MainTex, input.uv.xy).rgb; + + float2 depthLookupCoord = round(input.uv.xy * _MainTex_TexelSize.zw) * _MainTex_TexelSize.xy; + depthLookupCoord = input.uv.xy; + //float depth = tex2Dlod(_CameraDepthTexture, float4(depthLookupCoord, 0.0, 0.0)).x; + float depth = GetDepthTexture(depthLookupCoord); + + float4 currentPos = float4(input.uv.x * 2.0 - 1.0, input.uv.y * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); + + float4 fragpos = mul(ProjectionMatrixInverse, currentPos); + float4 thisViewPos = fragpos; + fragpos = mul(CameraToWorld, fragpos); + fragpos /= fragpos.w; + float4 thisWorldPosition = fragpos; + fragpos.xyz += CameraPosition.xyz * DeltaTime; + + float4 prevPos = fragpos; + prevPos.xyz -= CameraPositionPrev.xyz * DeltaTime; + prevPos = mul(WorldToCameraPrev, prevPos); + prevPos = mul(ProjectionPrev, prevPos); + prevPos /= prevPos.w; + + float2 diff = currentPos.xy - prevPos.xy; + + float2 reprojCoord = input.uv.xy - diff.xy * 0.5; + float2 previousTexcoord = input.uv.xy + diff.xy * 0.5; + + + float blendWeight = BlendWeight; + + float prevDepth = (tex2Dlod(PreviousDepth, float4(reprojCoord + _MainTex_TexelSize.xy * 0.0, 0.0, 0.0)).x); + + float4 previousWorldPosition = mul(ProjectionPrevInverse, float4(reprojCoord.xy * 2.0 - 1.0, prevDepth * 2.0 - 1.0, 1.0)); + previousWorldPosition = mul(CameraToWorldPrev, previousWorldPosition); + previousWorldPosition /= previousWorldPosition.w; + + if (distance(previousWorldPosition.xyz, thisWorldPosition.xyz) > 0.1 || reprojCoord.x > 1.0 || reprojCoord.x < 0.0 || reprojCoord.y > 1.0 || reprojCoord.y < 0.0) + { + blendWeight = 1.0; + } + + float3 prevGI = tex2D(PreviousGITexture, reprojCoord).rgb; + + gi = lerp(prevGI, gi, float3(blendWeight, blendWeight, blendWeight)); + + float3 result = gi; + return float4(result, 1.0); + } + + ENDCG + } + + +} + +Fallback off + +} \ No newline at end of file diff --git a/Assets/SEGI/Resources/SEGI.shader.meta b/Assets/SEGI/Resources/SEGI.shader.meta new file mode 100644 index 0000000..5547b52 --- /dev/null +++ b/Assets/SEGI/Resources/SEGI.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5a24b73d03cf92b41a3dd93d42bf3a8c +timeCreated: 1502920244 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIBlocker.shader b/Assets/SEGI/Resources/SEGIBlocker.shader new file mode 100644 index 0000000..aada81a --- /dev/null +++ b/Assets/SEGI/Resources/SEGIBlocker.shader @@ -0,0 +1,46 @@ +Shader "SEGI/GIBlocker" +{ + Properties + { + _BlockerValue ("Blocker Value", Range(0, 20)) = 5 + } + SubShader + { + Tags { "RenderType"="Opaque" } + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + }; + + float _BlockerValue; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + return fixed4(0.0, 0.0, 0.0, 1.0); + } + ENDCG + } + } +} diff --git a/Assets/SEGI/Resources/SEGIBlocker.shader.meta b/Assets/SEGI/Resources/SEGIBlocker.shader.meta new file mode 100644 index 0000000..4e8280e --- /dev/null +++ b/Assets/SEGI/Resources/SEGIBlocker.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9313768e78db9694bbe5e6a14ecbc4a6 +timeCreated: 1465468087 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIClear.compute b/Assets/SEGI/Resources/SEGIClear.compute new file mode 100644 index 0000000..25dac83 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIClear.compute @@ -0,0 +1,14 @@ +#pragma kernel CSMain + +RWTexture3D RG0; + +int Res; + +[numthreads(16,16,1)] +void CSMain (uint3 id : SV_DispatchThreadID) +{ + for (int i = 0; i < Res; i++) + { + RG0[uint3(id.xy, i)] = 0; + } +} diff --git a/Assets/SEGI/Resources/SEGIClear.compute.meta b/Assets/SEGI/Resources/SEGIClear.compute.meta new file mode 100644 index 0000000..525f65f --- /dev/null +++ b/Assets/SEGI/Resources/SEGIClear.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ac70f77818bb33543bc4b609eafe92d9 +timeCreated: 1502920244 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 131076 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIClear_C.compute b/Assets/SEGI/Resources/SEGIClear_C.compute new file mode 100644 index 0000000..25dac83 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIClear_C.compute @@ -0,0 +1,14 @@ +#pragma kernel CSMain + +RWTexture3D RG0; + +int Res; + +[numthreads(16,16,1)] +void CSMain (uint3 id : SV_DispatchThreadID) +{ + for (int i = 0; i < Res; i++) + { + RG0[uint3(id.xy, i)] = 0; + } +} diff --git a/Assets/SEGI/Resources/SEGIClear_C.compute.meta b/Assets/SEGI/Resources/SEGIClear_C.compute.meta new file mode 100644 index 0000000..84d0234 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIClear_C.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9b3935ce62e19fd4c8ad18e44a27b489 +timeCreated: 1501556287 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 131076 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIMipFilter.compute b/Assets/SEGI/Resources/SEGIMipFilter.compute new file mode 100644 index 0000000..96cf633 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIMipFilter.compute @@ -0,0 +1,67 @@ +#pragma kernel CSMain +#pragma kernel CSMainGaussian + +RWTexture3D Destination; +Texture3D Source; + +SamplerState _LinearClamp; +SamplerState _PointClamp; + +int destinationRes; + +[numthreads(8,8,1)] +void CSMain (uint3 id : SV_DispatchThreadID) +{ + for (int i = 0; i < destinationRes; i++) + { + float3 fcoord = float3((float)id.x / destinationRes, (float)id.y / destinationRes, (float)i / destinationRes); + float texel = 1.0 / destinationRes; + + float4 tex = Source.SampleLevel(_LinearClamp, fcoord + texel * 0.5, 0.0f); + + Destination[uint3(id.xy, i)] = tex; + } +} + +[numthreads(8,8,1)] +void CSMainGaussian (uint3 id : SV_DispatchThreadID) +{ + + float3 offsets[8] = + { + float3(1.0, 1.0, 1.0), + float3(1.0, 1.0, -1.0), + float3(1.0, -1.0, 1.0), + float3(1.0, -1.0, -1.0), + float3(-1.0, 1.0, 1.0), + float3(-1.0, 1.0, -1.0), + float3(-1.0, -1.0, 1.0), + float3(-1.0, -1.0, -1.0) + }; + + for (int i = 0; i < destinationRes; i++) + { + float3 fcoord = float3((float)id.x / destinationRes, (float)id.y / destinationRes, (float)i / destinationRes); + float texel = 1.0 / destinationRes; + + float4 tex = float4(0,0,0,0); + + + int c = 0; + + for (int j = 0; j < 8; j++) + { + float3 offset = float3(0, 0, 0); + + offset = offsets[j]; + + tex += Source.SampleLevel(_LinearClamp, fcoord + texel * 0.5 + offset * texel * 0.5, 0.0); + c++; + } + + tex /= c; + + + Destination[uint3(id.xy, i)] = tex; + } +} diff --git a/Assets/SEGI/Resources/SEGIMipFilter.compute.meta b/Assets/SEGI/Resources/SEGIMipFilter.compute.meta new file mode 100644 index 0000000..7afe754 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIMipFilter.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7f96e38292883d645b9d5857b32bd6c0 +timeCreated: 1502920244 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 131076 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIMipFilter_C.compute b/Assets/SEGI/Resources/SEGIMipFilter_C.compute new file mode 100644 index 0000000..fa75f87 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIMipFilter_C.compute @@ -0,0 +1,79 @@ +#pragma kernel CSMain +#pragma kernel CSMainGaussian + +RWTexture3D Destination; +Texture3D Source; + +SamplerState _LinearClamp; +SamplerState _PointClamp; + +int destinationRes; + +float4 ClipmapOverlap; + +[numthreads(8,8,1)] +void CSMain (uint3 id : SV_DispatchThreadID) +{ + for (uint i = 0; i < (uint)destinationRes / 2u; i++) + { + float3 fcoord = float3((float)id.x / destinationRes, (float)id.y / destinationRes, (float)i / destinationRes); + fcoord *= 2.0; + float texel = 1.0 / destinationRes; + + float3 sampleCoord = (fcoord) * 1.0 - 0.0 + ClipmapOverlap.xyz * 0.0; + + float4 tex = Source.SampleLevel(_LinearClamp, sampleCoord + texel * 1.0, 0.0); + tex.rgba *= 2.0; + + float3 writeCoord = fcoord; + writeCoord = writeCoord * 0.5 + 0.25; + writeCoord += ClipmapOverlap.xyz * 1.0; + writeCoord *= destinationRes; + uint3 writeCoordi = uint3(writeCoord.x, writeCoord.y, writeCoord.z); + + Destination[writeCoordi] = tex; + } +} + +[numthreads(8,8,1)] +void CSMainGaussian (uint3 id : SV_DispatchThreadID) +{ + + float3 offsets[8] = + { + float3(1.0, 1.0, 1.0), + float3(1.0, 1.0, -1.0), + float3(1.0, -1.0, 1.0), + float3(1.0, -1.0, -1.0), + float3(-1.0, 1.0, 1.0), + float3(-1.0, 1.0, -1.0), + float3(-1.0, -1.0, 1.0), + float3(-1.0, -1.0, -1.0) + }; + + for (int i = 0; i < destinationRes; i++) + { + float3 fcoord = float3((float)id.x / destinationRes, (float)id.y / destinationRes, (float)i / destinationRes); + float texel = 1.0 / destinationRes; + + float4 tex = float4(0,0,0,0); + + + int c = 0; + + for (int j = 0; j < 8; j++) + { + float3 offset = float3(0, 0, 0); + + offset = offsets[j]; + + tex += Source.SampleLevel(_LinearClamp, fcoord + texel * 0.5 + offset * texel * 0.5, 0.0); + c++; + } + + tex /= c; + + + Destination[uint3(id.xy, i)] = tex; + } +} diff --git a/Assets/SEGI/Resources/SEGIMipFilter_C.compute.meta b/Assets/SEGI/Resources/SEGIMipFilter_C.compute.meta new file mode 100644 index 0000000..e9f8779 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIMipFilter_C.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: eda55203fa561a64abccd5128dc70caa +timeCreated: 1501556288 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 131076 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIRenderSunDepth.shader b/Assets/SEGI/Resources/SEGIRenderSunDepth.shader new file mode 100644 index 0000000..75a2fa9 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIRenderSunDepth.shader @@ -0,0 +1,70 @@ +Shader "Hidden/SEGIRenderSunDepth" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB)", 2D) = "white" {} + _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333 +} +SubShader +{ + Pass + { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma target 5.0 + + #include "UnityCG.cginc" + + sampler2D _MainTex; + float4 _MainTex_ST; + fixed4 _Color; + float _Cutoff; + + + struct v2f + { + float4 pos : SV_POSITION; + float4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + half4 color : COLOR; + }; + + + v2f vert (appdata_full v) + { + v2f o; + + o.pos = UnityObjectToClipPos(v.vertex); + + float3 pos = o.pos; + + o.pos.xy = (o.pos.xy); + + + o.uv = float4(TRANSFORM_TEX(v.texcoord.xy, _MainTex), 1.0, 1.0); + o.normal = UnityObjectToWorldNormal(v.normal); + + o.color = v.color; + + return o; + } + + + sampler2D GILightCookie; + float4x4 GIProjection; + + float4 frag (v2f input) : SV_Target + { + float depth = input.pos.z; + + return depth; + } + + ENDCG + } +} + +Fallback "Legacy Shaders/VertexLit" +} diff --git a/Assets/SEGI/Resources/SEGIRenderSunDepth.shader.meta b/Assets/SEGI/Resources/SEGIRenderSunDepth.shader.meta new file mode 100644 index 0000000..f91c3fb --- /dev/null +++ b/Assets/SEGI/Resources/SEGIRenderSunDepth.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 794c850d415bc494b827f8fa67dd52ab +timeCreated: 1502920244 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIRenderSunDepth_C.shader b/Assets/SEGI/Resources/SEGIRenderSunDepth_C.shader new file mode 100644 index 0000000..0b087f7 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIRenderSunDepth_C.shader @@ -0,0 +1,70 @@ +Shader "Hidden/SEGIRenderSunDepth_C" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB)", 2D) = "white" {} + _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333 +} +SubShader +{ + Pass + { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma target 5.0 + + #include "UnityCG.cginc" + + sampler2D _MainTex; + float4 _MainTex_ST; + fixed4 _Color; + float _Cutoff; + + + struct v2f + { + float4 pos : SV_POSITION; + float4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + half4 color : COLOR; + }; + + + v2f vert (appdata_full v) + { + v2f o; + + o.pos = UnityObjectToClipPos(v.vertex); + + float3 pos = o.pos; + + o.pos.xy = (o.pos.xy); + + + o.uv = float4(TRANSFORM_TEX(v.texcoord.xy, _MainTex), 1.0, 1.0); + o.normal = UnityObjectToWorldNormal(v.normal); + + o.color = v.color; + + return o; + } + + + sampler2D GILightCookie; + float4x4 GIProjection; + + float4 frag (v2f input) : SV_Target + { + float depth = input.pos.z; + + return depth; + } + + ENDCG + } +} + +Fallback "Legacy Shaders/VertexLit" +} diff --git a/Assets/SEGI/Resources/SEGIRenderSunDepth_C.shader.meta b/Assets/SEGI/Resources/SEGIRenderSunDepth_C.shader.meta new file mode 100644 index 0000000..63bb3f2 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIRenderSunDepth_C.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 220244b857828dc4eb8b25dec475f7dc +timeCreated: 1501556287 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGITraceScene.shader b/Assets/SEGI/Resources/SEGITraceScene.shader new file mode 100644 index 0000000..504f56c --- /dev/null +++ b/Assets/SEGI/Resources/SEGITraceScene.shader @@ -0,0 +1,407 @@ +Shader "Hidden/SEGITraceScene" { + Properties + { + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB)", 2D) = "white" {} + _EmissionColor("Color", Color) = (0,0,0) + _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333 + } + SubShader + { + Cull Off + ZTest Always + + Pass + { + CGPROGRAM + + #pragma target 5.0 + #pragma vertex vert + #pragma fragment frag + #pragma geometry geom + #include "UnityCG.cginc" + + #define PI 3.14159265 + + RWTexture3D RG0; + + sampler3D SEGIVolumeLevel0; + sampler3D SEGIVolumeLevel1; + sampler3D SEGIVolumeLevel2; + sampler3D SEGIVolumeLevel3; + sampler3D SEGIVolumeLevel4; + sampler3D SEGIVolumeLevel5; + sampler3D SEGIVolumeLevel6; + sampler3D SEGIVolumeLevel7; + + float4x4 SEGIVoxelViewFront; + float4x4 SEGIVoxelViewLeft; + float4x4 SEGIVoxelViewTop; + + sampler2D _MainTex; + float4 _MainTex_ST; + half4 _EmissionColor; + float _Cutoff; + + struct v2g + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + struct g2f + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + half4 _Color; + float SEGISecondaryOcclusionStrength; + + v2g vert(appdata_full v) + { + v2g o; + UNITY_INITIALIZE_OUTPUT(v2g, o); + + float4 vertex = v.vertex; + + o.normal = UnityObjectToWorldNormal(v.normal); + float3 absNormal = abs(o.normal); + + o.pos = vertex; + + o.uv = float4(TRANSFORM_TEX(v.texcoord.xy, _MainTex), 1.0, 1.0); + + return o; + } + + int SEGIVoxelResolution; + + [maxvertexcount(3)] + void geom(triangle v2g input[3], inout TriangleStream triStream) + { + v2g p[3]; + int i = 0; + for (i = 0; i < 3; i++) + { + p[i] = input[i]; + p[i].pos = mul(unity_ObjectToWorld, p[i].pos); + } + + float3 realNormal = float3(0.0, 0.0, 0.0); + + float3 V = p[1].pos.xyz - p[0].pos.xyz; + float3 W = p[2].pos.xyz - p[0].pos.xyz; + + realNormal.x = (V.y * W.z) - (V.z * W.y); + realNormal.y = (V.z * W.x) - (V.x * W.z); + realNormal.z = (V.x * W.y) - (V.y * W.x); + + float3 absNormal = abs(realNormal); + + + + int angle = 0; + if (absNormal.z > absNormal.y && absNormal.z > absNormal.x) + { + angle = 0; + } + else if (absNormal.x > absNormal.y && absNormal.x > absNormal.z) + { + angle = 1; + } + else if (absNormal.y > absNormal.x && absNormal.y > absNormal.z) + { + angle = 2; + } + else + { + angle = 0; + } + + for (i = 0; i < 3; i ++) + { + if (angle == 0) + { + p[i].pos = mul(SEGIVoxelViewFront, p[i].pos); + } + else if (angle == 1) + { + p[i].pos = mul(SEGIVoxelViewLeft, p[i].pos); + } + else + { + p[i].pos = mul(SEGIVoxelViewTop, p[i].pos); + } + + p[i].pos = mul(UNITY_MATRIX_P, p[i].pos); + + #if defined(UNITY_REVERSED_Z) + p[i].pos.z = 1.0 - p[i].pos.z; + #else + p[i].pos.z *= -1.0; + #endif + + p[i].angle = (float)angle; + } + + triStream.Append(p[0]); + triStream.Append(p[1]); + triStream.Append(p[2]); + } + + + float4x4 SEGIVoxelToGIProjection; + float4x4 SEGIVoxelProjectionInverse; + sampler2D SEGIGIDepthNormalsTexture; + float4 SEGISunlightVector; + float4 GISunColor; + int SEGIFrameSwitch; + half4 SEGISkyColor; + float SEGISoftSunlight; + int SEGISecondaryCones; + + sampler3D SEGIVolumeTexture0; + float SEGIVoxelScaleFactor; + int SEGIVoxelAA; + int SEGISphericalSkylight; + + + #define VoxelResolution (SEGIVoxelResolution) + + float4 ConeTrace(float3 voxelOrigin, float3 kernel, float3 worldNormal) + { + float skyVisibility = 1.0; + + float3 gi = float3(0,0,0); + + int numSteps = (int)(7.0 * lerp(SEGIVoxelScaleFactor, 1.0, 0.5)); + + float3 adjustedKernel = normalize(kernel + worldNormal * 0.2); + + for (int i = 0; i < numSteps; i++) + { + float fi = ((float)i) / numSteps; + fi = lerp(fi, 1.0, 0.06); + + float coneDistance = (exp2(fi * 4.0) - 0.9) / 8.0; + + float coneSize = fi * 6.0 * lerp(SEGIVoxelScaleFactor, 1.0, 0.5); + float3 voxelCheckCoord = voxelOrigin.xyz + adjustedKernel.xyz * (coneDistance * 0.12 + 0.001); + float4 sample = float4(0.0, 0.0, 0.0, 0.0); + int mipLevel = floor(coneSize); + if (mipLevel == 0) + sample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 1) + sample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 2) + sample = tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 3) + sample = tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 4) + sample = tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, coneSize)); + else if (mipLevel == 5) + sample = tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, coneSize)); + else + sample = float4(1,1,1,0); + + float occlusion = skyVisibility * skyVisibility * skyVisibility; + + float falloffFix = pow(fi, 1.0) * 4.0 + 0.0456; + + gi.rgb += sample.rgb * (coneSize * 1.0 + 1.0) * occlusion * falloffFix; + + sample.a *= SEGISecondaryOcclusionStrength; + + skyVisibility *= pow(saturate(1.0 - (sample.a) * (coneSize * 0.2 + 1.0 + coneSize * coneSize * 0.08)), lerp(0.014, 1.0, min(1.0, coneSize / 5.0))); + + } + + skyVisibility *= saturate(dot(worldNormal, kernel)); + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0), 1.0, SEGISphericalSkylight); + + gi *= saturate(dot(worldNormal, kernel)); + + float3 skyColor = float3(0.0, 0.0, 0.0); + + float upGradient = saturate(dot(kernel, float3(0.0, 1.0, 0.0))); + float sunGradient = saturate(dot(kernel, -SEGISunlightVector.xyz)); + skyColor += lerp(SEGISkyColor.rgb * 2.0, SEGISkyColor.rgb, pow(upGradient, (0.5).xxx)); + skyColor += GISunColor.rgb * pow(sunGradient, (4.0).xxx) * SEGISoftSunlight; + + gi *= 0.5; + + gi += skyColor * skyVisibility; + + return float4(gi.rgb * 0.8, 0.0f); + } + + float2 rand(float3 coord) + { + float noiseX = saturate(frac(sin(dot(coord, float3(12.9898, 78.223, 35.3820))) * 43758.5453)); + float noiseY = saturate(frac(sin(dot(coord, float3(12.9898, 78.223, 35.2879)*2.0)) * 43758.5453)); + + return float2(noiseX, noiseY); + } + + float3 rgb2hsv(float3 c) + { + float4 k = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, k.wz), float4(c.gb, k.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float3 hsv2rgb(float3 c) + { + float4 k = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + k.xyz) * 6.0 - k.www); + return c.z * lerp(k.xxx, saturate(p - k.xxx), c.y); + } + + float4 DecodeRGBAuint(uint value) + { + uint ai = value & 0x0000007F; + uint vi = (value / 0x00000080) & 0x000007FF; + uint si = (value / 0x00040000) & 0x0000007F; + uint hi = value / 0x02000000; + + float h = float(hi) / 127.0; + float s = float(si) / 127.0; + float v = (float(vi) / 2047.0) * 10.0; + float a = ai * 2.0; + + v = pow(v, 3.0); + + float3 color = hsv2rgb(float3(h, s, v)); + + return float4(color.rgb, a); + } + + uint EncodeRGBAuint(float4 color) + { + //7[HHHHHHH] 7[SSSSSSS] 11[VVVVVVVVVVV] 7[AAAAAAAA] + float3 hsv = rgb2hsv(color.rgb); + hsv.z = pow(hsv.z, 1.0 / 3.0); + + uint result = 0; + + uint a = min(127, uint(color.a / 2.0)); + uint v = min(2047, uint((hsv.z / 10.0) * 2047)); + uint s = uint(hsv.y * 127); + uint h = uint(hsv.x * 127); + + result += a; + result += v * 0x00000080; // << 7 + result += s * 0x00040000; // << 18 + result += h * 0x02000000; // << 25 + + return result; + } + + void interlockedAddFloat4(RWTexture3D destination, int3 coord, float4 value) + { + uint writeValue = EncodeRGBAuint(value); + uint compareValue = 0; + uint originalValue; + + [allow_uav_condition] for (int i = 0; i < 12; i++) + { + InterlockedCompareExchange(destination[coord], compareValue, writeValue, originalValue); + if (compareValue == originalValue) + break; + compareValue = originalValue; + float4 originalValueFloats = DecodeRGBAuint(originalValue); + writeValue = EncodeRGBAuint(originalValueFloats + value); + } + } + + float4 frag (g2f input) : SV_TARGET + { + int3 coord = int3((int)(input.pos.x), (int)(input.pos.y), (int)(input.pos.z * VoxelResolution)); + + int angle = 0; + + angle = (int)input.angle; + + if (angle == 1) + { + coord.xyz = coord.zyx; + coord.z = VoxelResolution - coord.z - 1; + } + else if (angle == 2) + { + coord.xyz = coord.xzy; + coord.y = VoxelResolution - coord.y - 1; + } + + float3 fcoord = (float3)coord.xyz / VoxelResolution; + + float3 gi = (0.0).xxx; + + float3 worldNormal = input.normal; + + float3 voxelOrigin = (fcoord + worldNormal.xyz * 0.006 * 1.0); + + float4 traceResult = float4(0,0,0,0); + + float2 dither = rand(fcoord); + + const float phi = 1.618033988; + const float gAngle = phi * PI * 2.0; + + + const int numSamples = SEGISecondaryCones; + for (int i = 0; i < numSamples; i++) + { + float fi = (float)i; + float fiN = fi / numSamples; + float longitude = gAngle * fi; + float latitude = asin(fiN * 2.0 - 1.0); + + float3 kernel; + kernel.x = cos(latitude) * cos(longitude); + kernel.z = cos(latitude) * sin(longitude); + kernel.y = sin(latitude); + + kernel = normalize(kernel + worldNormal.xyz); + + if (i == 0) + { + kernel = float3(0.0, 1.0, 0.0); + } + + traceResult += ConeTrace(voxelOrigin.xyz, kernel.xyz, worldNormal.xyz); + } + + traceResult /= numSamples; + + + gi.rgb = traceResult.rgb; + + gi.rgb *= 4.3; + + gi.rgb += traceResult.a * 1.0 * SEGISkyColor; + + + float4 result = float4(gi.rgb, 2.0); + + + interlockedAddFloat4(RG0, coord, result); + + return float4(0.0, 0.0, 0.0, 0.0); + } + + ENDCG + } + } + FallBack Off +} diff --git a/Assets/SEGI/Resources/SEGITraceScene.shader.meta b/Assets/SEGI/Resources/SEGITraceScene.shader.meta new file mode 100644 index 0000000..1481c55 --- /dev/null +++ b/Assets/SEGI/Resources/SEGITraceScene.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6d8c4882b96fd92488c76c091e39b09f +timeCreated: 1502920244 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGITraceScene_C.shader b/Assets/SEGI/Resources/SEGITraceScene_C.shader new file mode 100644 index 0000000..8e6bb14 --- /dev/null +++ b/Assets/SEGI/Resources/SEGITraceScene_C.shader @@ -0,0 +1,528 @@ +Shader "Hidden/SEGITraceScene_C" { + Properties + { + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB)", 2D) = "white" {} + _EmissionColor("Color", Color) = (0,0,0) + _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333 + } + SubShader + { + Cull Off + ZTest Always + + Pass + { + CGPROGRAM + + #pragma target 5.0 + #pragma vertex vert + #pragma fragment frag + #pragma geometry geom + #include "UnityCG.cginc" + + #define PI 3.14159265 + + RWTexture3D RG0; + + sampler3D SEGIVolumeLevel0; + sampler3D SEGIVolumeLevel1; + sampler3D SEGIVolumeLevel2; + sampler3D SEGIVolumeLevel3; + sampler3D SEGIVolumeLevel4; + sampler3D SEGIVolumeLevel5; + + float4x4 SEGIVoxelViewFront; + float4x4 SEGIVoxelViewLeft; + float4x4 SEGIVoxelViewTop; + + sampler2D _MainTex; + float4 _MainTex_ST; + half4 _EmissionColor; + float _Cutoff; + + struct v2g + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + struct g2f + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + half4 _Color; + float SEGISecondaryOcclusionStrength; + + v2g vert(appdata_full v) + { + v2g o; + UNITY_INITIALIZE_OUTPUT(v2g, o); + + float4 vertex = v.vertex; + + o.normal = UnityObjectToWorldNormal(v.normal); + float3 absNormal = abs(o.normal); + + o.pos = vertex; + + o.uv = float4(TRANSFORM_TEX(v.texcoord.xy, _MainTex), 1.0, 1.0); + + return o; + } + + int SEGIVoxelResolution; + + [maxvertexcount(3)] + void geom(triangle v2g input[3], inout TriangleStream triStream) + { + v2g p[3]; + int i = 0; + + for (i = 0; i < 3; i++) + { + p[i] = input[i]; + p[i].pos = mul(unity_ObjectToWorld, p[i].pos); + } + + float3 realNormal = float3(0.0, 0.0, 0.0); + + float3 V = p[1].pos.xyz - p[0].pos.xyz; + float3 W = p[2].pos.xyz - p[0].pos.xyz; + + realNormal.x = (V.y * W.z) - (V.z * W.y); + realNormal.y = (V.z * W.x) - (V.x * W.z); + realNormal.z = (V.x * W.y) - (V.y * W.x); + + float3 absNormal = abs(realNormal); + + + + int angle = 0; + if (absNormal.z > absNormal.y && absNormal.z > absNormal.x) + { + angle = 0; + } + else if (absNormal.x > absNormal.y && absNormal.x > absNormal.z) + { + angle = 1; + } + else if (absNormal.y > absNormal.x && absNormal.y > absNormal.z) + { + angle = 2; + } + else + { + angle = 0; + } + + for (i = 0; i < 3; i ++) + { + if (angle == 0) + { + p[i].pos = mul(SEGIVoxelViewFront, p[i].pos); + } + else if (angle == 1) + { + p[i].pos = mul(SEGIVoxelViewLeft, p[i].pos); + } + else + { + p[i].pos = mul(SEGIVoxelViewTop, p[i].pos); + } + + p[i].pos = mul(UNITY_MATRIX_P, p[i].pos); + + + #if defined(UNITY_REVERSED_Z) + p[i].pos.z = 1.0 - p[i].pos.z; + #else + p[i].pos.z *= -1.0; + #endif + + p[i].angle = (float)angle; + } + + triStream.Append(p[0]); + triStream.Append(p[1]); + triStream.Append(p[2]); + } + + + float4x4 SEGIVoxelToGIProjection; + float4x4 SEGIVoxelProjectionInverse; + sampler2D SEGIGIDepthNormalsTexture; + float4 SEGISunlightVector; + float4 GISunColor; + int SEGIFrameSwitch; + half4 SEGISkyColor; + float SEGISoftSunlight; + int SEGISecondaryCones; + + sampler3D SEGIVolumeTexture0; + float SEGIVoxelScaleFactor; + int SEGIVoxelAA; + int SEGISphericalSkylight; + + + float4 SEGICurrentClipTransform; + float4 SEGIClipTransform0; + float4 SEGIClipTransform1; + float4 SEGIClipTransform2; + float4 SEGIClipTransform3; + float4 SEGIClipTransform4; + float4 SEGIClipTransform5; + + float4 SEGIClipmapOverlap; + + + #define VoxelResolution (SEGIVoxelResolution) + + float3 TransformClipSpaceInverse(float3 pos, float4 transform) + { + pos += transform.xyz; + pos = pos * 2.0 - 1.0; + pos /= transform.w; + pos = pos * 0.5 + 0.5; + + return pos; + } + + float3 TransformClipSpace(float3 pos, float4 transform) + { + pos = pos * 2.0 - 1.0; + pos *= transform.w; + pos = pos * 0.5 + 0.5; + pos -= transform.xyz; + + return pos; + } + + float3 TransformClipSpace1(float3 pos) + { + return TransformClipSpace(pos, SEGIClipTransform1); + } + + float3 TransformClipSpace2(float3 pos) + { + return TransformClipSpace(pos, SEGIClipTransform2); + } + + float3 TransformClipSpace3(float3 pos) + { + return TransformClipSpace(pos, SEGIClipTransform3); + } + + float3 TransformClipSpace4(float3 pos) + { + return TransformClipSpace(pos, SEGIClipTransform4); + } + + float3 TransformClipSpace5(float3 pos) + { + return TransformClipSpace(pos, SEGIClipTransform5); + } + + float GISampleWeight(float3 pos) + { + float weight = 1.0; + + if (pos.x < 0.0 || pos.x > 1.0 || + pos.y < 0.0 || pos.y > 1.0 || + pos.z < 0.0 || pos.z > 1.0) + { + weight = 0.0; + } + + return weight; + } + + + float4 ConeTrace(float3 voxelOrigin, float3 kernel, float3 worldNormal) + { + + + float skyVisibility = 1.0; + + float3 gi = float3(0,0,0); + + const int numSteps = 7; + + float3 adjustedKernel = normalize(kernel + worldNormal * 0.2); + + + + float dist = length(voxelOrigin * 2.0 - 1.0); + + int startMipLevel = 0; + + voxelOrigin = TransformClipSpaceInverse(voxelOrigin, SEGICurrentClipTransform); + voxelOrigin.xyz += worldNormal.xyz * 0.016; + + + const float width = 3.38; + const float farOcclusionStrength = 4.0; + const float occlusionPower = 1.05; + + + for (int i = 0; i < numSteps; i++) + { + float fi = ((float)i) / numSteps; + fi = lerp(fi, 1.0, 0.001); + + float coneDistance = (exp2(fi * 4.0) - 0.99) / 8.0; + + float coneSize = coneDistance * width * 10.3; + + float3 voxelCheckCoord = voxelOrigin.xyz + adjustedKernel.xyz * (coneDistance * 1.12 * 1.0); + + float4 sample = float4(0.0, 0.0, 0.0, 0.0); + int mipLevel = floor(coneSize); + + mipLevel = max(startMipLevel, log2(pow(fi, 1.3) * 24.0 * width + 1.0)); + + + + if (mipLevel == 0 || mipLevel == 1) + { + voxelCheckCoord = TransformClipSpace1(voxelCheckCoord); + sample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else if (mipLevel == 2) + { + voxelCheckCoord = TransformClipSpace2(voxelCheckCoord); + sample = tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else if (mipLevel == 3) + { + voxelCheckCoord = TransformClipSpace3(voxelCheckCoord); + sample = tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else if (mipLevel == 4) + { + voxelCheckCoord = TransformClipSpace4(voxelCheckCoord); + sample = tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else + { + voxelCheckCoord = TransformClipSpace5(voxelCheckCoord); + sample = tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + + float occlusion = skyVisibility; + + float falloffFix = pow(fi, 2.0) * 4.0 + 0.0; + + gi.rgb += sample.rgb * (coneSize * 1.0 + 1.0) * occlusion * falloffFix; + + skyVisibility *= pow(saturate(1.0 - sample.a * SEGISecondaryOcclusionStrength * (1.0 + coneDistance * farOcclusionStrength)), 1.0 * occlusionPower); + + + } + + + float NdotL = pow(saturate(dot(worldNormal, kernel) * 1.0 - 0.0), 1.0); + + gi *= NdotL; + skyVisibility *= NdotL; + + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0 + 0.0), 1.0, SEGISphericalSkylight); + + float3 skyColor = float3(0.0, 0.0, 0.0); + + float upGradient = saturate(dot(kernel, float3(0.0, 1.0, 0.0))); + float sunGradient = saturate(dot(kernel, -SEGISunlightVector.xyz)); + skyColor += lerp(SEGISkyColor.rgb * 1.0, SEGISkyColor.rgb * 0.5, pow(upGradient, (0.5).xxx)); + skyColor += GISunColor.rgb * pow(sunGradient, (4.0).xxx) * SEGISoftSunlight; + + + gi += skyColor * skyVisibility * 10.0; + + return float4(gi.rgb, 0.0f); + } + + float2 rand(float3 coord) + { + float noiseX = saturate(frac(sin(dot(coord, float3(12.9898, 78.223, 35.3820))) * 43758.5453)); + float noiseY = saturate(frac(sin(dot(coord, float3(12.9898, 78.223, 35.2879)*2.0)) * 43758.5453)); + + return float2(noiseX, noiseY); + } + + float3 rgb2hsv(float3 c) + { + float4 k = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, k.wz), float4(c.gb, k.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float3 hsv2rgb(float3 c) + { + float4 k = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + k.xyz) * 6.0 - k.www); + return c.z * lerp(k.xxx, saturate(p - k.xxx), c.y); + } + + float4 DecodeRGBAuint(uint value) + { + uint ai = value & 0x0000007F; + uint vi = (value / 0x00000080) & 0x000007FF; + uint si = (value / 0x00040000) & 0x0000007F; + uint hi = value / 0x02000000; + + float h = float(hi) / 127.0; + float s = float(si) / 127.0; + float v = (float(vi) / 2047.0) * 10.0; + float a = ai * 2.0; + + v = pow(v, 3.0); + + float3 color = hsv2rgb(float3(h, s, v)); + + return float4(color.rgb, a); + } + + uint EncodeRGBAuint(float4 color) + { + //7[HHHHHHH] 7[SSSSSSS] 11[VVVVVVVVVVV] 7[AAAAAAAA] + float3 hsv = rgb2hsv(color.rgb); + hsv.z = pow(hsv.z, 1.0 / 3.0); + + uint result = 0; + + uint a = min(127, uint(color.a / 2.0)); + uint v = min(2047, uint((hsv.z / 10.0) * 2047)); + uint s = uint(hsv.y * 127); + uint h = uint(hsv.x * 127); + + result += a; + result += v * 0x00000080; // << 7 + result += s * 0x00040000; // << 18 + result += h * 0x02000000; // << 25 + + return result; + } + + void interlockedAddFloat4(RWTexture3D destination, int3 coord, float4 value) + { + uint writeValue = EncodeRGBAuint(value); + uint compareValue = 0; + uint originalValue; + + [allow_uav_condition] for (int i = 0; i < 12; i++) + { + InterlockedCompareExchange(destination[coord], compareValue, writeValue, originalValue); + if (compareValue == originalValue) + break; + compareValue = originalValue; + float4 originalValueFloats = DecodeRGBAuint(originalValue); + writeValue = EncodeRGBAuint(originalValueFloats + value); + } + } + + float4 frag (g2f input) : SV_TARGET + { + int3 coord = int3((int)(input.pos.x), (int)(input.pos.y), (int)(input.pos.z * VoxelResolution)); + + int angle = 0; + + angle = (int)input.angle; + + if (angle == 1) + { + coord.xyz = coord.zyx; + coord.z = VoxelResolution - coord.z - 1; + } + else if (angle == 2) + { + coord.xyz = coord.xzy; + coord.y = VoxelResolution - coord.y - 1; + } + + float3 fcoord = (float3)coord.xyz / VoxelResolution; + + float3 minCoord = (SEGIClipmapOverlap.xyz * 1.0 + 0.5) - SEGIClipmapOverlap.w * 0.5; + minCoord += 16.0 / VoxelResolution; + float3 maxCoord = (SEGIClipmapOverlap.xyz * 1.0 + 0.5) + SEGIClipmapOverlap.w * 0.5; + maxCoord -= 16.0 / VoxelResolution; + + if (fcoord.x > minCoord.x && fcoord.x < maxCoord.x && + fcoord.y > minCoord.y && fcoord.y < maxCoord.y && + fcoord.z > minCoord.z && fcoord.z < maxCoord.z) + { + discard; + } + + + + float3 gi = (0.0).xxx; + + float3 worldNormal = input.normal; + + float3 voxelOrigin = (fcoord + worldNormal.xyz * 0.006 * 1.0); + + float4 traceResult = float4(0,0,0,0); + + float2 dither = rand(fcoord); + + const float phi = 1.618033988; + const float gAngle = phi * PI * 2.0; + + + const int numSamples = SEGISecondaryCones; + for (int i = 0; i < numSamples; i++) + { + float fi = (float)i; + float fiN = fi / numSamples; + float longitude = gAngle * fi; + float latitude = asin(fiN * 2.0 - 1.0); + + float3 kernel; + kernel.x = cos(latitude) * cos(longitude); + kernel.z = cos(latitude) * sin(longitude); + kernel.y = sin(latitude); + + kernel = normalize(kernel + worldNormal.xyz); + + if (i == 0) + { + kernel = float3(0.0, 1.0, 0.0); + } + + traceResult += ConeTrace(voxelOrigin.xyz, kernel.xyz, worldNormal.xyz); + } + + traceResult /= numSamples; + + + gi.rgb = traceResult.rgb; + + gi.rgb *= 4.3; + + gi.rgb += traceResult.a * 1.0 * SEGISkyColor; + + + float4 result = float4(gi.rgb, 2.0); + + + interlockedAddFloat4(RG0, coord, result); + + return float4(0.0, 0.0, 0.0, 0.0); + } + + ENDCG + } + } + FallBack Off +} diff --git a/Assets/SEGI/Resources/SEGITraceScene_C.shader.meta b/Assets/SEGI/Resources/SEGITraceScene_C.shader.meta new file mode 100644 index 0000000..c0014b4 --- /dev/null +++ b/Assets/SEGI/Resources/SEGITraceScene_C.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: be8733cee86782c4da1aa969e701158c +timeCreated: 1501556287 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGITransferInts.compute b/Assets/SEGI/Resources/SEGITransferInts.compute new file mode 100644 index 0000000..7b70840 --- /dev/null +++ b/Assets/SEGI/Resources/SEGITransferInts.compute @@ -0,0 +1,89 @@ +#pragma kernel CSMain +#pragma kernel CSMain2 + +RWTexture3D Result; +Texture3D PrevResult; + +Texture3D RG0; + +SamplerState _PointClamp; + +int Resolution; +int VoxelAA; + +float4 VoxelOriginDelta; + +float2 IntToFloats(uint intval) +{ + float value1 = f16tof32(intval); + float value2 = f16tof32(intval / 0x0000FFFF); + return float2(value1, value2); +} + +float3 hsv2rgb(float3 c) +{ + float4 k = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + k.xyz) * 6.0 - k.www); + return c.z * lerp(k.xxx, saturate(p - k.xxx), c.y); +} + +float4 DecodeRGBAuint(uint value) +{ + uint ai = value & 0x0000007F; + uint vi = (value / 0x00000080) & 0x000007FF; + uint si = (value / 0x00040000) & 0x0000007F; + uint hi = value / 0x02000000; + + float h = float(hi) / 127.0; + float s = float(si) / 127.0; + float v = (float(vi) / 2047.0) * 10.0; + float a = ai * 2.0; + + v = pow(v, 3.0); + + float3 color = hsv2rgb(float3(h, s, v)); + + return float4(color.rgb, a); +} + +[numthreads(16,16,1)] +void CSMain (uint3 id : SV_DispatchThreadID) +{ + for (int i = 0; i < Resolution; i++) + { + float4 result = float4(0,0,0,0); + + result.rgba = DecodeRGBAuint(RG0[uint3(id.x, id.y, i)]); + + result /= 1 + VoxelAA * 3; + + result.rgb /= max(result.a, 2.0); + + float blockerValue = 0.0; + + if (result.a > 20.0) + { + blockerValue = max(0.0, result.a - 20.0); + } + + result.a = min(result.a, 2.0) * 1.25; + result.a += blockerValue; + + Result[uint3(id.xy, i)] = result; + } +} + +[numthreads(16,16,1)] +void CSMain2 (uint3 id : SV_DispatchThreadID) +{ + for (int i = 0; i < Resolution; i++) + { + float4 result = float4(0,0,0,0); + + result.rgba = DecodeRGBAuint(RG0[uint3(id.x, id.y, i)]); + + result.rgb /= max(2.0, result.a); + + Result[uint3(id.xy, i)] = result; + } +} diff --git a/Assets/SEGI/Resources/SEGITransferInts.compute.meta b/Assets/SEGI/Resources/SEGITransferInts.compute.meta new file mode 100644 index 0000000..cb92af7 --- /dev/null +++ b/Assets/SEGI/Resources/SEGITransferInts.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 10aea0bf5f4e3034ab64534500806e89 +timeCreated: 1502920243 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 131076 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGITransferInts_C.compute b/Assets/SEGI/Resources/SEGITransferInts_C.compute new file mode 100644 index 0000000..743c136 --- /dev/null +++ b/Assets/SEGI/Resources/SEGITransferInts_C.compute @@ -0,0 +1,111 @@ +#pragma kernel CSMain +#pragma kernel CSMain2 + +RWTexture3D Result; +Texture3D PrevResult; + +Texture3D RG0; + +SamplerState _PointClamp; + +int Resolution; +int VoxelAA; + +float4 VoxelOriginDelta; + +float4 ClipmapOverlap; + +float2 IntToFloats(uint intval) +{ + float value1 = f16tof32(intval); + float value2 = f16tof32(intval / 0x0000FFFF); + return float2(value1, value2); +} + +float3 hsv2rgb(float3 c) +{ + float4 k = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + k.xyz) * 6.0 - k.www); + return c.z * lerp(k.xxx, saturate(p - k.xxx), c.y); +} + +float4 DecodeRGBAuint(uint value) +{ + uint ai = value & 0x0000007F; + uint vi = (value / 0x00000080) & 0x000007FF; + uint si = (value / 0x00040000) & 0x0000007F; + uint hi = value / 0x02000000; + + float h = float(hi) / 127.0; + float s = float(si) / 127.0; + float v = (float(vi) / 2047.0) * 10.0; + float a = ai * 2.0; + + v = pow(v, 3.0); + + float3 color = hsv2rgb(float3(h, s, v)); + + return float4(color.rgb, a); +} + +[numthreads(16,16,1)] +void CSMain (uint3 id : SV_DispatchThreadID) +{ + for (int i = 0; i < Resolution; i++) + { + float4 result = float4(0,0,0,0); + + result.rgba = DecodeRGBAuint(RG0[uint3(id.x, id.y, i)]); + + result /= 1 + VoxelAA * 3; + + result.rgb /= max(result.a, 2.0); + + float blockerValue = 0.0; + + if (result.a > 20.0) + { + blockerValue = max(0.0, result.a - 20.0); + } + + result.a = min(result.a, 2.0) * 1.0; + result.a += blockerValue; + + /* + uint3 writeCoord = uint3(id.xy, i); + + float3 fcoord = float3((float)id.x / Resolution, (float)id.y / Resolution, (float)i / Resolution); + float3 refcoord = fcoord * 0.5 + 0.25; + refcoord += ClipmapOverlap.xyz * 1.0; + float minCoord = 0.0; + float maxCoord = 1.0; + + //if (refcoord.x > maxCoord || refcoord.x < minCoord || refcoord.y > maxCoord || refcoord.y < minCoord || refcoord.z > maxCoord || refcoord.z < minCoord) + */ + + /* + if (id.x == 0 || id.x == Resolution - 1 || id.y == 0 || id.y == Resolution - 1 || i == 0 || i == Resolution - 1) + { + //result = float4(0.0, 0.0, 0.0, 0.0); + } + */ + + Result[uint3(id.xy, i)] = result; + + } +} + +[numthreads(16,16,1)] +void CSMain2 (uint3 id : SV_DispatchThreadID) +{ + for (int i = 0; i < Resolution; i++) + { + float4 result = float4(0,0,0,0); + + result.rgba = DecodeRGBAuint(RG0[uint3(id.x, id.y, i)]); + + result.rgb /= max(2.0, result.a); + + Result[uint3(id.xy, i)] = result; + } +} diff --git a/Assets/SEGI/Resources/SEGITransferInts_C.compute.meta b/Assets/SEGI/Resources/SEGITransferInts_C.compute.meta new file mode 100644 index 0000000..1ed3250 --- /dev/null +++ b/Assets/SEGI/Resources/SEGITransferInts_C.compute.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2070a5530c303444ab76ad8146f96703 +timeCreated: 1501556287 +licenseType: Pro +ComputeShaderImporter: + currentAPIMask: 131076 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIVoxelizeScene.shader b/Assets/SEGI/Resources/SEGIVoxelizeScene.shader new file mode 100644 index 0000000..f6c80cf --- /dev/null +++ b/Assets/SEGI/Resources/SEGIVoxelizeScene.shader @@ -0,0 +1,355 @@ +Shader "Hidden/SEGIVoxelizeScene" { + Properties + { + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB)", 2D) = "white" {} + _EmissionColor("Color", Color) = (0,0,0) + _EmissionMap("Emission", 2D) = "white" {} + _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333 + _BlockerValue ("Blocker Value", Range(0, 10)) = 0 + } + SubShader + { + Cull Off + ZTest Always + + Pass + { + CGPROGRAM + + #pragma target 5.0 + #pragma vertex vert + #pragma fragment frag + #pragma geometry geom + #include "UnityCG.cginc" + + RWTexture3D RG0; + + int LayerToVisualize; + + float4x4 SEGIVoxelViewFront; + float4x4 SEGIVoxelViewLeft; + float4x4 SEGIVoxelViewTop; + + sampler2D _MainTex; + sampler2D _EmissionMap; + float _Cutoff; + float4 _MainTex_ST; + half4 _EmissionColor; + + float SEGISecondaryBounceGain; + + float _BlockerValue; + + + struct v2g + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + struct g2f + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + half4 _Color; + + v2g vert(appdata_full v) + { + v2g o; + UNITY_INITIALIZE_OUTPUT(v2g, o); + + float4 vertex = v.vertex; + + o.normal = UnityObjectToWorldNormal(v.normal); + float3 absNormal = abs(o.normal); + + o.pos = vertex; + + o.uv = float4(TRANSFORM_TEX(v.texcoord.xy, _MainTex), 1.0, 1.0); + + + return o; + } + + int SEGIVoxelResolution; + + [maxvertexcount(3)] + void geom(triangle v2g input[3], inout TriangleStream triStream) + { + v2g p[3]; + int i = 0; + for (i = 0; i < 3; i++) + { + p[i] = input[i]; + p[i].pos = mul(unity_ObjectToWorld, p[i].pos); + } + + + float3 realNormal = float3(0.0, 0.0, 0.0); + + float3 V = p[1].pos.xyz - p[0].pos.xyz; + float3 W = p[2].pos.xyz - p[0].pos.xyz; + + realNormal.x = (V.y * W.z) - (V.z * W.y); + realNormal.y = (V.z * W.x) - (V.x * W.z); + realNormal.z = (V.x * W.y) - (V.y * W.x); + + float3 absNormal = abs(realNormal); + + + + int angle = 0; + if (absNormal.z > absNormal.y && absNormal.z > absNormal.x) + { + angle = 0; + } + else if (absNormal.x > absNormal.y && absNormal.x > absNormal.z) + { + angle = 1; + } + else if (absNormal.y > absNormal.x && absNormal.y > absNormal.z) + { + angle = 2; + } + else + { + angle = 0; + } + + for (i = 0; i < 3; i ++) + { + ///* + if (angle == 0) + { + p[i].pos = mul(SEGIVoxelViewFront, p[i].pos); + } + else if (angle == 1) + { + p[i].pos = mul(SEGIVoxelViewLeft, p[i].pos); + } + else + { + p[i].pos = mul(SEGIVoxelViewTop, p[i].pos); + } + + p[i].pos = mul(UNITY_MATRIX_P, p[i].pos); + + #if defined(UNITY_REVERSED_Z) + p[i].pos.z = 1.0 - p[i].pos.z; + #else + p[i].pos.z *= -1.0; + #endif + + p[i].angle = (float)angle; + } + + triStream.Append(p[0]); + triStream.Append(p[1]); + triStream.Append(p[2]); + } + + float3 rgb2hsv(float3 c) + { + float4 k = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, k.wz), float4(c.gb, k.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float3 hsv2rgb(float3 c) + { + float4 k = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + k.xyz) * 6.0 - k.www); + return c.z * lerp(k.xxx, saturate(p - k.xxx), c.y); + } + + float4 DecodeRGBAuint(uint value) + { + uint ai = value & 0x0000007F; + uint vi = (value / 0x00000080) & 0x000007FF; + uint si = (value / 0x00040000) & 0x0000007F; + uint hi = value / 0x02000000; + + float h = float(hi) / 127.0; + float s = float(si) / 127.0; + float v = (float(vi) / 2047.0) * 10.0; + float a = ai * 2.0; + + v = pow(v, 3.0); + + float3 color = hsv2rgb(float3(h, s, v)); + + return float4(color.rgb, a); + } + + uint EncodeRGBAuint(float4 color) + { + //7[HHHHHHH] 7[SSSSSSS] 11[VVVVVVVVVVV] 7[AAAAAAAA] + float3 hsv = rgb2hsv(color.rgb); + hsv.z = pow(hsv.z, 1.0 / 3.0); + + uint result = 0; + + uint a = min(127, uint(color.a / 2.0)); + uint v = min(2047, uint((hsv.z / 10.0) * 2047)); + uint s = uint(hsv.y * 127); + uint h = uint(hsv.x * 127); + + result += a; + result += v * 0x00000080; // << 7 + result += s * 0x00040000; // << 18 + result += h * 0x02000000; // << 25 + + return result; + } + + void interlockedAddFloat4(RWTexture3D destination, int3 coord, float4 value) + { + uint writeValue = EncodeRGBAuint(value); + uint compareValue = 0; + uint originalValue; + + [allow_uav_condition] + while (true) + { + InterlockedCompareExchange(destination[coord], compareValue, writeValue, originalValue); + if (compareValue == originalValue) + break; + compareValue = originalValue; + float4 originalValueFloats = DecodeRGBAuint(originalValue); + writeValue = EncodeRGBAuint(originalValueFloats + value); + } + } + + void interlockedAddFloat4b(RWTexture3D destination, int3 coord, float4 value) + { + uint writeValue = EncodeRGBAuint(value); + uint compareValue = 0; + uint originalValue; + + [allow_uav_condition] + while (true) + { + InterlockedCompareExchange(destination[coord], compareValue, writeValue, originalValue); + if (compareValue == originalValue) + break; + compareValue = originalValue; + float4 originalValueFloats = DecodeRGBAuint(originalValue); + writeValue = EncodeRGBAuint(originalValueFloats + value); + } + } + + float4x4 SEGIVoxelToGIProjection; + float4x4 SEGIVoxelProjectionInverse; + sampler2D SEGISunDepth; + float4 SEGISunlightVector; + float4 GISunColor; + float4 SEGIVoxelSpaceOriginDelta; + + sampler3D SEGIVolumeTexture1; + + int SEGIInnerOcclusionLayers; + + #define VoxelResolution (SEGIVoxelResolution * (1 + SEGIVoxelAA)) + + int SEGIVoxelAA; + + float4 frag (g2f input) : SV_TARGET + { + int3 coord = int3((int)(input.pos.x), (int)(input.pos.y), (int)(input.pos.z * VoxelResolution)); + + float3 absNormal = abs(input.normal); + + int angle = 0; + + angle = (int)input.angle; + + if (angle == 1) + { + coord.xyz = coord.zyx; + coord.z = VoxelResolution - coord.z - 1; + } + else if (angle == 2) + { + coord.xyz = coord.xzy; + coord.y = VoxelResolution - coord.y - 1; + } + + float3 fcoord = (float3)(coord.xyz) / VoxelResolution; + + float4 shadowPos = mul(SEGIVoxelProjectionInverse, float4(fcoord * 2.0 - 1.0, 0.0)); + shadowPos = mul(SEGIVoxelToGIProjection, shadowPos); + shadowPos.xyz = shadowPos.xyz * 0.5 + 0.5; + + float sunDepth = tex2Dlod(SEGISunDepth, float4(shadowPos.xy, 0, 0)).x; + #if defined(UNITY_REVERSED_Z) + sunDepth = 1.0 - sunDepth; + #endif + + float sunVisibility = saturate((sunDepth - shadowPos.z + 0.2525) * 1000.0); + + + float sunNdotL = saturate(dot(input.normal, -SEGISunlightVector.xyz)); + + float4 tex = tex2D(_MainTex, input.uv.xy); + float4 emissionTex = tex2D(_EmissionMap, input.uv.xy); + + float4 color = _Color; + + if (length(_Color.rgb) < 0.0001) + { + color.rgb = float3(1, 1, 1); + } + + + float3 col = sunVisibility.xxx * sunNdotL * color.rgb * tex.rgb * GISunColor.rgb * GISunColor.a + _EmissionColor.rgb * 0.9 * emissionTex.rgb; + + float4 prevBounce = tex3D(SEGIVolumeTexture1, fcoord + SEGIVoxelSpaceOriginDelta.xyz); + col.rgb += prevBounce.rgb * 1.6 * SEGISecondaryBounceGain * tex.rgb * color.rgb; + + float4 result = float4(col.rgb, 2.0); + + + const float sqrt2 = sqrt(2.0) * 1.0; + + coord /= (uint)SEGIVoxelAA + 1u; + + + if (_BlockerValue > 0.01) + { + result.a += 20.0; + result.a += _BlockerValue; + result.rgb = float3(0.0, 0.0, 0.0); + } + + interlockedAddFloat4(RG0, coord, result); + + if (SEGIInnerOcclusionLayers > 0) + { + interlockedAddFloat4b(RG0, coord - int3((int)(input.normal.x * sqrt2 * 1.0), (int)(input.normal.y * sqrt2 * 1.0), (int)(input.normal.z * sqrt2 * 1.0)), float4(0.0, 0.0, 0.0, 8.0)); + } + + if (SEGIInnerOcclusionLayers > 1) + { + interlockedAddFloat4b(RG0, coord - int3((int)(input.normal.x * sqrt2 * 2.0), (int)(input.normal.y * sqrt2 * 2.0), (int)(input.normal.z * sqrt2 * 2.0)), float4(0.0, 0.0, 0.0, 22.0)); + } + + return float4(0.0, 0.0, 0.0, 0.0); + } + + ENDCG + } + } + FallBack Off +} diff --git a/Assets/SEGI/Resources/SEGIVoxelizeScene.shader.meta b/Assets/SEGI/Resources/SEGIVoxelizeScene.shader.meta new file mode 100644 index 0000000..29d6ef4 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIVoxelizeScene.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bfaf9382002dbc848a5c0dfe0bfe794f +timeCreated: 1502920244 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGIVoxelizeScene_C.shader b/Assets/SEGI/Resources/SEGIVoxelizeScene_C.shader new file mode 100644 index 0000000..9a11570 --- /dev/null +++ b/Assets/SEGI/Resources/SEGIVoxelizeScene_C.shader @@ -0,0 +1,383 @@ +Shader "Hidden/SEGIVoxelizeScene_C" { + Properties + { + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB)", 2D) = "white" {} + _EmissionColor("Color", Color) = (0,0,0) + _EmissionMap("Emission", 2D) = "white" {} + _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.333 + _BlockerValue ("Blocker Value", Range(0, 10)) = 0 + } + SubShader + { + Cull Off + ZTest Always + + Pass + { + CGPROGRAM + + #pragma target 5.0 + #pragma vertex vert + #pragma fragment frag + #pragma geometry geom + #include "UnityCG.cginc" + + RWTexture3D RG0; + + int LayerToVisualize; + + float4x4 SEGIVoxelViewFront; + float4x4 SEGIVoxelViewLeft; + float4x4 SEGIVoxelViewTop; + + sampler2D _MainTex; + sampler2D _EmissionMap; + float _Cutoff; + float4 _MainTex_ST; + half4 _EmissionColor; + + float SEGISecondaryBounceGain; + + float _BlockerValue; + + + struct v2g + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + struct g2f + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + float3 normal : TEXCOORD1; + float angle : TEXCOORD2; + }; + + half4 _Color; + + v2g vert(appdata_full v) + { + v2g o; + UNITY_INITIALIZE_OUTPUT(v2g, o); + + float4 vertex = v.vertex; + + o.normal = UnityObjectToWorldNormal(v.normal); + float3 absNormal = abs(o.normal); + + o.pos = vertex; + + o.uv = float4(TRANSFORM_TEX(v.texcoord.xy, _MainTex), 1.0, 1.0); + + + return o; + } + + int SEGIVoxelResolution; + int SEGIVoxelAA; + #define VoxelResolution (SEGIVoxelResolution * (1 + SEGIVoxelAA)) + + float4x4 SEGIVoxelVPFront; + float4x4 SEGIVoxelVPLeft; + float4x4 SEGIVoxelVPTop; + + [maxvertexcount(3)] + void geom(triangle v2g input[3], inout TriangleStream triStream) + { + v2g p[3]; + int i = 0; + for (i = 0; i < 3; i++) + { + p[i] = input[i]; + p[i].pos = UnityObjectToClipPos(p[i].pos); + } + + + + float3 realNormal = float3(0.0, 0.0, 0.0); + + float3 V = p[1].pos.xyz - p[0].pos.xyz; + float3 W = p[2].pos.xyz - p[0].pos.xyz; + + realNormal.x = (V.y * W.z) - (V.z * W.y); + realNormal.y = (V.z * W.x) - (V.x * W.z); + realNormal.z = (V.x * W.y) - (V.y * W.x); + + float3 absNormal = abs(realNormal); + + + + int angle = 0; + if (absNormal.z > absNormal.y && absNormal.z > absNormal.x) + { + angle = 0; + } + else if (absNormal.x > absNormal.y && absNormal.x > absNormal.z) + { + angle = 1; + } + else if (absNormal.y > absNormal.x && absNormal.y > absNormal.z) + { + angle = 2; + } + else + { + angle = 0; + } + + for (i = 0; i < 3; i ++) + { + float3 op = p[i].pos.xyz * float3(1.0, 1.0, 1.0); + op.z = op.z * 2.0 - 1.0; + + if (angle == 0) + { + p[i].pos.xyz = op.xyz; + } + else if (angle == 1) + { + p[i].pos.xyz = op.zyx * float3(1.0, 1.0, -1.0); + } + else + { + p[i].pos.xyz = op.xzy * float3(1.0, 1.0, -1.0); + } + + p[i].pos.z = p[i].pos.z * 0.5 + 0.5; + + #if defined(UNITY_REVERSED_Z) + p[i].pos.z = 1.0 - p[i].pos.z; + #else + p[i].pos.z *= -1.0; + #endif + + p[i].angle = (float)angle; + } + + triStream.Append(p[0]); + triStream.Append(p[1]); + triStream.Append(p[2]); + } + + float3 rgb2hsv(float3 c) + { + float4 k = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, k.wz), float4(c.gb, k.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float3 hsv2rgb(float3 c) + { + float4 k = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + k.xyz) * 6.0 - k.www); + return c.z * lerp(k.xxx, saturate(p - k.xxx), c.y); + } + + float4 DecodeRGBAuint(uint value) + { + uint ai = value & 0x0000007F; + uint vi = (value / 0x00000080) & 0x000007FF; + uint si = (value / 0x00040000) & 0x0000007F; + uint hi = value / 0x02000000; + + float h = float(hi) / 127.0; + float s = float(si) / 127.0; + float v = (float(vi) / 2047.0) * 10.0; + float a = ai * 2.0; + + v = pow(v, 3.0); + + float3 color = hsv2rgb(float3(h, s, v)); + + return float4(color.rgb, a); + } + + uint EncodeRGBAuint(float4 color) + { + //7[HHHHHHH] 7[SSSSSSS] 11[VVVVVVVVVVV] 7[AAAAAAAA] + float3 hsv = rgb2hsv(color.rgb); + hsv.z = pow(hsv.z, 1.0 / 3.0); + + uint result = 0; + + uint a = min(127, uint(color.a / 2.0)); + uint v = min(2047, uint((hsv.z / 10.0) * 2047)); + uint s = uint(hsv.y * 127); + uint h = uint(hsv.x * 127); + + result += a; + result += v * 0x00000080; // << 7 + result += s * 0x00040000; // << 18 + result += h * 0x02000000; // << 25 + + return result; + } + + void interlockedAddFloat4(RWTexture3D destination, int3 coord, float4 value) + { + uint writeValue = EncodeRGBAuint(value); + uint compareValue = 0; + uint originalValue; + + [allow_uav_condition] + while (true) + { + InterlockedCompareExchange(destination[coord], compareValue, writeValue, originalValue); + if (compareValue == originalValue) + break; + compareValue = originalValue; + float4 originalValueFloats = DecodeRGBAuint(originalValue); + writeValue = EncodeRGBAuint(originalValueFloats + value); + } + } + + void interlockedAddFloat4b(RWTexture3D destination, int3 coord, float4 value) + { + uint writeValue = EncodeRGBAuint(value); + uint compareValue = 0; + uint originalValue; + + [allow_uav_condition] + while (true) + { + InterlockedCompareExchange(destination[coord], compareValue, writeValue, originalValue); + if (compareValue == originalValue) + break; + compareValue = originalValue; + float4 originalValueFloats = DecodeRGBAuint(originalValue); + writeValue = EncodeRGBAuint(originalValueFloats + value); + } + } + + float4x4 SEGIVoxelToGIProjection; + float4x4 SEGIVoxelProjectionInverse; + sampler2D SEGISunDepth; + float4 SEGISunlightVector; + float4 GISunColor; + float4 SEGIVoxelSpaceOriginDelta; + + sampler3D SEGICurrentIrradianceVolume; + int SEGIInnerOcclusionLayers; + + + + + float4 SEGIClipmapOverlap; + + float4 frag (g2f input) : SV_TARGET + { + int3 coord = int3((int)(input.pos.x), (int)(input.pos.y), (int)(input.pos.z * VoxelResolution)); + + float3 absNormal = abs(input.normal); + + int angle = 0; + + angle = (int)round(input.angle); + + if (angle == 1) + { + coord.xyz = coord.zyx; + coord.z = VoxelResolution - coord.z - 1; + } + else if (angle == 2) + { + coord.xyz = coord.xzy; + coord.y = VoxelResolution - coord.y - 1; + } + + float3 fcoord = (float3)(coord.xyz) / VoxelResolution; + + float3 minCoord = (SEGIClipmapOverlap.xyz * 1.0 + 0.5) - SEGIClipmapOverlap.w * 0.5; + minCoord += 16.0 / VoxelResolution; + float3 maxCoord = (SEGIClipmapOverlap.xyz * 1.0 + 0.5) + SEGIClipmapOverlap.w * 0.5; + maxCoord -= 16.0 / VoxelResolution; + + + if (fcoord.x > minCoord.x && fcoord.x < maxCoord.x && + fcoord.y > minCoord.y && fcoord.y < maxCoord.y && + fcoord.z > minCoord.z && fcoord.z < maxCoord.z) + { + discard; + } + + + float4 shadowPos = mul(SEGIVoxelProjectionInverse, float4(fcoord * 2.0 - 1.0, 0.0)); + shadowPos = mul(SEGIVoxelToGIProjection, shadowPos); + shadowPos.xyz = shadowPos.xyz * 0.5 + 0.5; + + float sunDepth = tex2Dlod(SEGISunDepth, float4(shadowPos.xy, 0, 0)).x; + #if defined(UNITY_REVERSED_Z) + sunDepth = 1.0 - sunDepth; + #endif + + float sunVisibility = saturate((sunDepth - shadowPos.z + 0.2525) * 1000.0); + + + float sunNdotL = saturate(dot(input.normal, -SEGISunlightVector.xyz)); + + float4 tex = tex2D(_MainTex, input.uv.xy); + float4 emissionTex = tex2D(_EmissionMap, input.uv.xy); + + float4 color = _Color; + + if (length(_Color.rgb) < 0.0001) + { + color.rgb = float3(1, 1, 1); + } + else + { + color.rgb *= color.a; + } + + + float3 col = sunVisibility.xxx * sunNdotL * color.rgb * tex.rgb * GISunColor.rgb * GISunColor.a + _EmissionColor.rgb * 0.9 * emissionTex.rgb; + + float4 prevBounce = tex3D(SEGICurrentIrradianceVolume, fcoord + SEGIVoxelSpaceOriginDelta.xyz); + col.rgb += prevBounce.rgb * 0.2 * SEGISecondaryBounceGain * tex.rgb * color.rgb; + + + float4 result = float4(col.rgb, 2.0); + + + const float sqrt2 = sqrt(2.0) * 1.2; + + coord /= (uint)SEGIVoxelAA + 1u; + + + if (_BlockerValue > 0.01) + { + result.a += 20.0; + result.a += _BlockerValue; + result.rgb = float3(0.0, 0.0, 0.0); + } + + interlockedAddFloat4(RG0, coord, result); + + if (SEGIInnerOcclusionLayers > 0) + { + interlockedAddFloat4b(RG0, coord - int3((int)(input.normal.x * sqrt2 * 1.0), (int)(input.normal.y * sqrt2 * 1.0), (int)(input.normal.z * sqrt2 * 1.0)), float4(0.0, 0.0, 0.0, 14.0)); + } + + if (SEGIInnerOcclusionLayers > 1) + { + interlockedAddFloat4b(RG0, coord - int3((int)(input.normal.x * sqrt2 * 2.0), (int)(input.normal.y * sqrt2 * 2.0), (int)(input.normal.z * sqrt2 * 2.0)), float4(0.0, 0.0, 0.0, 22.0)); + } + + return float4(0.0, 0.0, 0.0, 0.0); + } + + ENDCG + } + } + FallBack Off +} diff --git a/Assets/SEGI/Resources/SEGIVoxelizeScene_C.shader.meta b/Assets/SEGI/Resources/SEGIVoxelizeScene_C.shader.meta new file mode 100644 index 0000000..25d3b7d --- /dev/null +++ b/Assets/SEGI/Resources/SEGIVoxelizeScene_C.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2071d35fc095996408b580e9906adb5b +timeCreated: 1501556287 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGI_C.cginc b/Assets/SEGI/Resources/SEGI_C.cginc new file mode 100644 index 0000000..12d02d5 --- /dev/null +++ b/Assets/SEGI/Resources/SEGI_C.cginc @@ -0,0 +1,392 @@ +float SEGIVoxelScaleFactor; + +int StochasticSampling; +int TraceDirections; +int TraceSteps; +float TraceLength; +float ConeSize; +float OcclusionStrength; +float OcclusionPower; +float ConeTraceBias; +float GIGain; +float NearLightGain; +float NearOcclusionStrength; +float SEGISoftSunlight; +float FarOcclusionStrength; +float FarthestOcclusionStrength; + + +half4 GISunColor; + +sampler3D SEGIVolumeLevel0; +sampler3D SEGIVolumeLevel1; +sampler3D SEGIVolumeLevel2; +sampler3D SEGIVolumeLevel3; +sampler3D SEGIVolumeLevel4; +sampler3D SEGIVolumeLevel5; +sampler3D SEGIVolumeLevel6; +sampler3D SEGIVolumeLevel7; +sampler3D VolumeTexture1; +sampler3D VolumeTexture2; +sampler3D VolumeTexture3; + +float4x4 SEGIVoxelProjection; +float4x4 SEGIVoxelProjection0; +float4x4 SEGIVoxelProjection1; +float4x4 SEGIVoxelProjection2; +float4x4 SEGIVoxelProjection3; +float4x4 SEGIVoxelProjection4; +float4x4 SEGIVoxelProjection5; +float4x4 SEGIWorldToVoxel; +float4x4 SEGIWorldToVoxel0; +float4x4 SEGIWorldToVoxel1; +float4x4 SEGIWorldToVoxel2; +float4x4 SEGIWorldToVoxel3; +float4x4 SEGIWorldToVoxel4; +float4x4 SEGIWorldToVoxel5; +float4x4 GIProjectionInverse; +float4x4 GIToWorld; + +float4x4 GIToVoxelProjection; + + +half4 SEGISkyColor; + +float4 SEGISunlightVector; +float4 SEGIClipTransform0; +float4 SEGIClipTransform1; +float4 SEGIClipTransform2; +float4 SEGIClipTransform3; +float4 SEGIClipTransform4; +float4 SEGIClipTransform5; + +int ReflectionSteps; + + +uniform half4 _MainTex_TexelSize; + +float4x4 ProjectionMatrixInverse; + +sampler2D _CameraDepthNormalsTexture; +sampler2D _CameraDepthTexture; +sampler2D _MainTex; +sampler2D PreviousGITexture; +sampler2D _CameraGBufferTexture0; +sampler2D _CameraMotionVectorsTexture; +float4x4 WorldToCamera; +float4x4 ProjectionMatrix; + +int SEGISphericalSkylight; + +float3 TransformClipSpace(float3 pos, float4 transform) +{ + pos = pos * 2.0 - 1.0; + pos *= transform.w; + pos = pos * 0.5 + 0.5; + pos -= transform.xyz; + + return pos; +} + +float3 TransformClipSpace1(float3 pos) +{ + return TransformClipSpace(pos, SEGIClipTransform1); +} + +float3 TransformClipSpace2(float3 pos) +{ + return TransformClipSpace(pos, SEGIClipTransform2); +} + +float3 TransformClipSpace3(float3 pos) +{ + return TransformClipSpace(pos, SEGIClipTransform3); +} + +float3 TransformClipSpace4(float3 pos) +{ + return TransformClipSpace(pos, SEGIClipTransform4); +} + +float3 TransformClipSpace5(float3 pos) +{ + return TransformClipSpace(pos, SEGIClipTransform5); +} + +float4 GetViewSpacePosition(float2 coord) +{ + float depth = tex2Dlod(_CameraDepthTexture, float4(coord.x, coord.y, 0.0, 0.0)).x; + + #if defined(UNITY_REVERSED_Z) + depth = 1.0 - depth; + #endif + + float4 viewPosition = mul(ProjectionMatrixInverse, float4(coord.x * 2.0 - 1.0, coord.y * 2.0 - 1.0, 2.0 * depth - 1.0, 1.0)); + viewPosition /= viewPosition.w; + + return viewPosition; +} + +float3 ProjectBack(float4 viewPos) +{ + viewPos = mul(ProjectionMatrix, float4(viewPos.xyz, 0.0)); + viewPos.xyz /= viewPos.w; + viewPos.xyz = viewPos.xyz * 0.5 + 0.5; + return viewPos.xyz; +} + + +float2 rand(float2 coord) +{ + float noiseX = saturate(frac(sin(dot(coord, float2(12.9898, 78.223))) * 43758.5453)); + float noiseY = saturate(frac(sin(dot(coord, float2(12.9898, 78.223)*2.0)) * 43758.5453)); + + return float2(noiseX, noiseY); +} + +float GISampleWeight(float3 pos) +{ + float weight = 1.0; + + if (pos.x < 0.0 || pos.x > 1.0 || + pos.y < 0.0 || pos.y > 1.0 || + pos.z < 0.0 || pos.z > 1.0) + { + weight = 0.0; + } + + return weight; +} + +float4 ConeTrace(float3 voxelOrigin, float3 kernel, float3 worldNormal, float2 uv, float dither, int steps, float width, float lengthMult, float skyMult) +{ + float skyVisibility = 1.0; + + float3 gi = float3(0, 0, 0); + + int numSteps = (int)(steps * lerp(SEGIVoxelScaleFactor, 1.0, 0.5)); + + float3 adjustedKernel = normalize(kernel.xyz + worldNormal.xyz * 0.00 * width); + + float dist = length(voxelOrigin * 2.0 - 1.0); + + + int startMipLevel = 0; + + voxelOrigin.xyz += worldNormal.xyz * 0.016 * (exp2(startMipLevel) - 1); + + for (int i = 0; i < numSteps; i++) + { + float fi = ((float)i + dither) / numSteps; + fi = lerp(fi, 1.0, 0.0); + + + float coneDistance = (exp2(fi * 4.0) - 0.99) / 8.0; + + + float coneSize = coneDistance * width * 10.3; + + float3 voxelCheckCoord = voxelOrigin.xyz + adjustedKernel.xyz * (coneDistance * 1.12 * TraceLength * lengthMult + 0.000); + + + float4 giSample = float4(0.0, 0.0, 0.0, 0.0); + int mipLevel = max(startMipLevel, log2(pow(fi, 1.3) * 24.0 * width + 1.0)); + //if (mipLevel == 0) + //{ + // sample = tex3Dlod(SEGIVolumeLevel0, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + //} + if (mipLevel == 1 || mipLevel == 0) + { + voxelCheckCoord = TransformClipSpace1(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else if (mipLevel == 2) + { + voxelCheckCoord = TransformClipSpace2(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else if (mipLevel == 3) + { + voxelCheckCoord = TransformClipSpace3(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else if (mipLevel == 4) + { + voxelCheckCoord = TransformClipSpace4(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + else + { + voxelCheckCoord = TransformClipSpace5(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, coneSize)) * GISampleWeight(voxelCheckCoord); + } + + float occlusion = skyVisibility; + + float falloffFix = pow(fi, 1.0) * 4.0 + NearLightGain; + + giSample.a *= lerp(saturate(coneSize / 1.0), 1.0, NearOcclusionStrength); + giSample.a *= (0.8 / (fi * fi * 2.0 + 0.15)); + gi.rgb += giSample.rgb * occlusion * (coneDistance + NearLightGain) * 80.0 * (1.0 - fi * fi); + + skyVisibility *= pow(saturate(1.0 - giSample.a * OcclusionStrength * (1.0 + coneDistance * FarOcclusionStrength)), 1.0 * OcclusionPower); + } + float NdotL = pow(saturate(dot(worldNormal, kernel) * 1.0 - 0.0), 0.5); + + gi *= NdotL; + skyVisibility *= NdotL; + if (StochasticSampling > 0) + { + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0 + 0.0), 1.0, SEGISphericalSkylight); + } + else + { + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0 + 0.0), 1.0, SEGISphericalSkylight); + } + + float3 skyColor = float3(0.0, 0.0, 0.0); + + float upGradient = saturate(dot(kernel, float3(0.0, 1.0, 0.0))); + float sunGradient = saturate(dot(kernel, -SEGISunlightVector.xyz)); + skyColor += lerp(SEGISkyColor.rgb * 1.0, SEGISkyColor.rgb * 0.5, pow(upGradient, (0.5).xxx)); + skyColor += GISunColor.rgb * pow(sunGradient, (4.0).xxx) * SEGISoftSunlight; + + gi.rgb *= GIGain * 0.15; + + gi += skyColor * skyVisibility * skyMult * 10.0; + + return float4(gi.rgb * 0.8, 0.0f); +} + + + + +float ReflectionOcclusionPower; +float SkyReflectionIntensity; + +float4 SpecularConeTrace(float3 voxelOrigin, float3 kernel, float3 worldNormal, float smoothness, float2 uv, float dither) +{ + float skyVisibility = 1.0; + + float3 gi = float3(0, 0, 0); + + float coneLength = 6.0; + float coneSizeScalar = lerp(1.3, 0.05, smoothness) * coneLength; + + float3 adjustedKernel = normalize(kernel.xyz + worldNormal.xyz * 0.2 * (1.0 - smoothness)); + + int numSamples = (int)(lerp(uint(ReflectionSteps) / uint(5), ReflectionSteps, smoothness)); + + for (int i = 0; i < numSamples; i++) + { + float fi = ((float)i) / numSamples; + + float coneSize = fi * coneSizeScalar; + + float coneDistance = (exp2(fi * coneSizeScalar) - 0.998) / exp2(coneSizeScalar); + + float3 voxelCheckCoord = voxelOrigin.xyz + adjustedKernel.xyz * (coneDistance * 0.12 * coneLength + 0.001); + + float4 giSample = float4(0.0, 0.0, 0.0, 0.0); + coneSize = pow(coneSize / 5.0, 2.0) * 5.0; + int mipLevel = floor(coneSize); + if (mipLevel == 0) + { + giSample = tex3Dlod(SEGIVolumeLevel0, float4(voxelCheckCoord.xyz, coneSize)); + } + else if (mipLevel == 1) + { + voxelCheckCoord = TransformClipSpace1(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, coneSize)); + } + else if (mipLevel == 2) + { + voxelCheckCoord = TransformClipSpace2(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, coneSize)); + } + else if (mipLevel == 3) + { + voxelCheckCoord = TransformClipSpace3(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, coneSize)); + } + else if (mipLevel == 4) + { + voxelCheckCoord = TransformClipSpace4(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, coneSize)); + } + else + { + voxelCheckCoord = TransformClipSpace5(voxelCheckCoord); + giSample = tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, coneSize)); + } + + float occlusion = skyVisibility; + + float falloffFix = fi * 6.0 + 0.6; + + gi.rgb += giSample.rgb * (coneSize * 5.0 + 1.0) * occlusion * 0.5; + giSample.a *= lerp(saturate(fi / 0.2), 1.0, NearOcclusionStrength); + skyVisibility *= pow(saturate(1.0 - giSample.a * 0.5), (lerp(4.0, 1.0, smoothness) + coneSize * 0.5) * ReflectionOcclusionPower); + } + + skyVisibility *= saturate(dot(worldNormal, kernel) * 0.7 + 0.3); + skyVisibility *= lerp(saturate(dot(kernel, float3(0.0, 1.0, 0.0)) * 10.0), 1.0, SEGISphericalSkylight); + + gi *= saturate(dot(worldNormal, kernel) * 10.0); + + return float4(gi.rgb * 4.0, skyVisibility); +} + +float4 VisualConeTrace(float3 voxelOrigin, float3 kernel, float skyVisibility, int volumeLevel) +{ + float3 gi = float3(0, 0, 0); + + float coneLength = 6.0; + float coneSizeScalar = 0.25 * coneLength; + + for (int i = 0; i < 200; i++) + { + float fi = ((float)i) / 200; + + if (skyVisibility <= 0.0) + break; + + float coneSize = fi * coneSizeScalar; + + float3 voxelCheckCoord = voxelOrigin.xyz + kernel.xyz * (0.18 * coneLength * fi * fi + 0.05); + + float4 giSample = float4(0.0, 0.0, 0.0, 0.0); + + + if (volumeLevel == 0) + giSample = tex3Dlod(SEGIVolumeLevel0, float4(voxelCheckCoord.xyz, 0.0)); + else if (volumeLevel == 1) + giSample = tex3Dlod(SEGIVolumeLevel1, float4(voxelCheckCoord.xyz, 0.0)); + else if (volumeLevel == 2) + giSample = tex3Dlod(SEGIVolumeLevel2, float4(voxelCheckCoord.xyz, 0.0)); + else if (volumeLevel == 3) + giSample = tex3Dlod(SEGIVolumeLevel3, float4(voxelCheckCoord.xyz, 0.0)); + else if (volumeLevel == 4) + giSample = tex3Dlod(SEGIVolumeLevel4, float4(voxelCheckCoord.xyz, 0.0)); + else + giSample = tex3Dlod(SEGIVolumeLevel5, float4(voxelCheckCoord.xyz, 0.0)); + + + if (voxelCheckCoord.x < 0.0 || voxelCheckCoord.x > 1.0 || + voxelCheckCoord.y < 0.0 || voxelCheckCoord.y > 1.0 || + voxelCheckCoord.z < 0.0 || voxelCheckCoord.z > 1.0) + { + giSample = float4(0, 0, 0, 0); + } + + + float occlusion = skyVisibility; + + float falloffFix = fi * 6.0 + 0.6; + + gi.rgb += giSample.rgb * (coneSize * 5.0 + 1.0) * occlusion * 0.5; + skyVisibility *= saturate(1.0 - giSample.a); + } + + return float4(gi.rgb, skyVisibility); +} \ No newline at end of file diff --git a/Assets/SEGI/Resources/SEGI_C.cginc.meta b/Assets/SEGI/Resources/SEGI_C.cginc.meta new file mode 100644 index 0000000..9d5d87a --- /dev/null +++ b/Assets/SEGI/Resources/SEGI_C.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9e1c985087740f2479cb65b6ef7dcff3 +timeCreated: 1501556287 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/Resources/SEGI_C.shader b/Assets/SEGI/Resources/SEGI_C.shader new file mode 100644 index 0000000..2fd6b15 --- /dev/null +++ b/Assets/SEGI/Resources/SEGI_C.shader @@ -0,0 +1,685 @@ +Shader "Hidden/SEGI_C" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +CGINCLUDE + #include "UnityCG.cginc" + #include "SEGI_C.cginc" + #pragma target 5.0 + + + struct v2f + { + float4 pos : SV_POSITION; + float4 uv : TEXCOORD0; + + #if UNITY_UV_STARTS_AT_TOP + half4 uv2 : TEXCOORD1; + #endif + }; + + v2f vert(appdata_img v) + { + v2f o; + + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = float4(v.texcoord.xy, 1, 1); + + #if UNITY_UV_STARTS_AT_TOP + o.uv2 = float4(v.texcoord.xy, 1, 1); + if (_MainTex_TexelSize.y < 0.0) + o.uv.y = 1.0 - o.uv.y; + #endif + + return o; + } + + #define PI 3.147159265 + + +ENDCG + + +SubShader +{ + ZTest Off + Cull Off + ZWrite Off + Fog { Mode off } + + Pass //0 diffuse GI trace + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4x4 CameraToWorld; + + sampler2D _CameraGBufferTexture2; + + + sampler2D NoiseTexture; + + + float4 frag(v2f input) : SV_Target + { + #if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; + #else + float2 coord = input.uv.xy; + #endif + + //Get view space position and view vector + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + + //Get voxel space position + float4 voxelSpacePosition = mul(CameraToWorld, viewSpacePosition); + voxelSpacePosition = mul(SEGIWorldToVoxel0, voxelSpacePosition); + voxelSpacePosition = mul(SEGIVoxelProjection0, voxelSpacePosition); + voxelSpacePosition.xyz = voxelSpacePosition.xyz * 0.5 + 0.5; + + + //Prepare for cone trace + float3 worldNormal = normalize(tex2D(_CameraGBufferTexture2, coord).rgb * 2.0 - 1.0); + + float3 voxelOrigin = voxelSpacePosition.xyz + worldNormal.xyz * 0.003 * ConeTraceBias * 1.25 / SEGIVoxelScaleFactor; //Apply bias of cone trace origin towards the surface normal to avoid self-occlusion artifacts + + float3 gi = float3(0.0, 0.0, 0.0); + float4 traceResult = float4(0,0,0,0); + + const float phi = 1.618033988; + const float gAngle = phi * PI * 1.0; + + + //Get blue noise + float2 noiseCoord = (input.uv.xy * _MainTex_TexelSize.zw) / (64.0).xx; + float4 blueNoise = tex2Dlod(NoiseTexture, float4(noiseCoord, 0.0, 0.0)); + + //Trace GI cones + int numSamples = TraceDirections; + for (int i = 0; i < numSamples; i++) + { + float fi = (float)i + blueNoise.x * StochasticSampling; + float fiN = fi / numSamples; + float longitude = gAngle * fi; + float latitude = (fiN * 2.0 - 1.0); + latitude += (blueNoise.y * 2.0 - 1.0) * 0.25; + latitude = asin(latitude); + + float3 kernel; + kernel.x = cos(latitude) * cos(longitude); + kernel.z = cos(latitude) * sin(longitude); + kernel.y = sin(latitude); + + kernel = normalize(kernel + worldNormal.xyz * 1.0); + + + traceResult += ConeTrace(voxelOrigin.xyz, kernel.xyz, worldNormal.xyz, coord, blueNoise.z, TraceSteps, ConeSize, 1.0, 1.0); + } + + traceResult /= numSamples; + gi = traceResult.rgb * 1.18; + + + return float4(gi, 1.0); + } + + ENDCG + } + + Pass //1 Bilateral Blur + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float2 Kernel; + + float4 frag(v2f input) : COLOR0 + { + float4 blurred = float4(0.0, 0.0, 0.0, 0.0); + float validWeights = 0.0; + float depth = LinearEyeDepth(tex2D(_CameraDepthTexture, input.uv.xy).x); + half3 normal = DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture, input.uv.xy)); + float thresh = 0.26; + + float3 viewPosition = GetViewSpacePosition(input.uv.xy).xyz; + float3 viewVector = normalize(viewPosition); + + float NdotV = 1.0 / (saturate(dot(-viewVector, normal.xyz)) + 0.1); + thresh *= 1.0 + NdotV * 2.0; + + for (int i = -4; i <= 4; i++) + { + float2 offs = Kernel.xy * (i) * _MainTex_TexelSize.xy * 1.0; + float sampleDepth = LinearEyeDepth(tex2Dlod(_CameraDepthTexture, float4(input.uv.xy + offs.xy * 1, 0, 0)).x); + half3 sampleNormal = DecodeViewNormalStereo(tex2Dlod(_CameraDepthNormalsTexture, float4(input.uv.xy + offs.xy * 1, 0, 0))); + + float weight = saturate(1.0 - abs(depth - sampleDepth) / thresh); + weight *= pow(saturate(dot(sampleNormal, normal)), 14.0); + + float4 blurSample = tex2Dlod(_MainTex, float4(input.uv.xy + offs.xy, 0, 0)).rgba; + blurred += blurSample * weight; + validWeights += weight; + } + + blurred /= validWeights + 0.0001; + + return blurred; + } + + ENDCG + } + + Pass //2 Blend with scene + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + sampler2D _CameraGBufferTexture2; + sampler2D _CameraGBufferTexture1; + sampler2D GITexture; + sampler2D Reflections; + + + float4x4 CameraToWorld; + + int DoReflections; + + int HalfResolution; + + float4 frag(v2f input) : COLOR0 + { +#if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; +#else + float2 coord = input.uv.xy; +#endif + + float4 albedoTex = tex2D(_CameraGBufferTexture0, input.uv.xy); + float3 albedo = albedoTex.rgb; + float3 gi = tex2D(GITexture, input.uv.xy).rgb; + float3 scene = tex2D(_MainTex, input.uv.xy).rgb; + float3 reflections = tex2D(Reflections, input.uv.xy).rgb; + + gi *= 0.75 + (float)HalfResolution * 0.25; + + float3 result = scene + gi * albedoTex.a * albedoTex.rgb; + + if (DoReflections > 0) + { + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + float4 worldViewVector = mul(CameraToWorld, float4(viewVector.xyz, 0.0)); + + float4 spec = tex2D(_CameraGBufferTexture1, coord); + float smoothness = spec.a; + float3 specularColor = spec.rgb; + + float3 worldNormal = normalize(tex2D(_CameraGBufferTexture2, coord).rgb * 2.0 - 1.0); + float3 reflectionKernel = reflect(worldViewVector.xyz, worldNormal); + + float3 fresnel = pow(saturate(dot(worldViewVector.xyz, reflectionKernel.xyz)) * (smoothness * 0.5 + 0.5), 5.0); + fresnel = lerp(fresnel, (1.0).xxx, specularColor.rgb); + + fresnel *= saturate(smoothness * 4.0); + + result = lerp(result, reflections, fresnel); + } + + return float4(result, 1.0); + } + + ENDCG + } + + Pass //3 Temporal blend (with unity motion vectors) + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + sampler2D GITexture; + sampler2D PreviousDepth; + sampler2D CurrentDepth; + sampler2D PreviousLocalWorldPos; + + + float4 CameraPosition; + float4 CameraPositionPrev; + float4x4 ProjectionPrev; + float4x4 ProjectionPrevInverse; + float4x4 WorldToCameraPrev; + float4x4 CameraToWorldPrev; + float4x4 CameraToWorld; + float DeltaTime; + float BlendWeight; + + sampler2D BlurredGI; + + float4 frag(v2f input) : COLOR0 + { + float3 gi = tex2D(_MainTex, input.uv.xy).rgb; + + //Calculate moments and width of color deviation of neighbors for color clamping + float3 m1, m2 = (0.0).xxx; + { + float width = 0.7; + float3 samp = tex2D(_MainTex, input.uv.xy + float2(width, width) * _MainTex_TexelSize.xy).rgb; + m1 = samp; + m2 = samp * samp; + samp = tex2D(_MainTex, input.uv.xy + float2(width, -width) * _MainTex_TexelSize.xy).rgb; + m1 += samp; + m2 += samp * samp; + samp = tex2D(_MainTex, input.uv.xy + float2(-width, width) * _MainTex_TexelSize.xy).rgb; + m1 += samp; + m2 += samp * samp; + samp = tex2D(_MainTex, input.uv.xy + float2(-width, -width) * _MainTex_TexelSize.xy).rgb; + m1 += samp; + m2 += samp * samp; + } + + float3 mu = m1 * 0.25; + float3 sigma = sqrt(max((0.0).xxx, m2 * 0.25 - mu * mu)); + float errorWindow = 0.2 / BlendWeight; + float3 minc = mu - (errorWindow) * sigma; + float3 maxc = mu + (errorWindow) * sigma; + + + + + //Calculate world space position for current frame + float depth = tex2Dlod(_CameraDepthTexture, float4(input.uv.xy, 0.0, 0.0)).x; + + #if defined(UNITY_REVERSED_Z) + depth = 1.0 - depth; + #endif + + float4 currentPos = float4(input.uv.x * 2.0 - 1.0, input.uv.y * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); + + float4 fragpos = mul(ProjectionMatrixInverse, currentPos); + float4 thisViewPos = fragpos; + fragpos = mul(CameraToWorld, fragpos); + fragpos /= fragpos.w; + float4 thisWorldPosition = fragpos; + + + //Get motion vectors and calculate reprojection coord + float2 motionVectors = tex2Dlod(_CameraMotionVectorsTexture, float4(input.uv.xy, 0.0, 0.0)).xy; + float2 reprojCoord = input.uv.xy - motionVectors.xy; + + + //Calculate world space position for the previous frame reprojected to the current frame + float prevDepth = (tex2Dlod(PreviousDepth, float4(reprojCoord + _MainTex_TexelSize.xy * 0.0, 0.0, 0.0)).x); + + #if defined(UNITY_REVERSED_Z) + prevDepth = 1.0 - prevDepth; + #endif + + float4 previousWorldPosition = mul(ProjectionPrevInverse, float4(reprojCoord.xy * 2.0 - 1.0, prevDepth * 2.0 - 1.0, 1.0)); + previousWorldPosition = mul(CameraToWorldPrev, previousWorldPosition); + previousWorldPosition /= previousWorldPosition.w; + + + //Apply blending + float blendWeight = BlendWeight; + + float3 blurredGI = tex2D(BlurredGI, input.uv.xy).rgb; + + if (reprojCoord.x > 1.0 || reprojCoord.x < 0.0 || reprojCoord.y > 1.0 || reprojCoord.y < 0.0) + { + blendWeight = 1.0; + gi = blurredGI; + } + + float posSimilarity = saturate(1.0 - distance(previousWorldPosition.xyz, thisWorldPosition.xyz) * 2.0); + blendWeight = lerp(1.0, blendWeight, posSimilarity); + gi = lerp(blurredGI, gi, posSimilarity); + + + float3 prevGI = tex2D(PreviousGITexture, reprojCoord).rgb; + prevGI = clamp(prevGI, minc, maxc); + gi = lerp(prevGI, gi, float3(blendWeight, blendWeight, blendWeight)); + + float3 result = gi; + return float4(result, 1.0); + } + + ENDCG + } + + Pass //4 Specular/reflections trace (CURRENTLY UNUSED) + { + ZTest Always + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4x4 CameraToWorld; + + + sampler2D _CameraGBufferTexture1; + sampler2D _CameraGBufferTexture2; + + + + + int FrameSwitch; + + + float4 frag(v2f input) : SV_Target + { + #if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; + #else + float2 coord = input.uv.xy; + #endif + + float4 spec = tex2D(_CameraGBufferTexture1, coord); + + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + float4 worldViewVector = mul(CameraToWorld, float4(viewVector.xyz, 0.0)); + + + /* + float4 voxelSpacePosition = mul(CameraToWorld, viewSpacePosition); + float3 worldPosition = voxelSpacePosition.xyz; + voxelSpacePosition = mul(SEGIWorldToVoxel, voxelSpacePosition); + voxelSpacePosition = mul(SEGIVoxelProjection, voxelSpacePosition); + voxelSpacePosition.xyz = voxelSpacePosition.xyz * 0.5 + 0.5; + */ + + float4 voxelSpacePosition = mul(CameraToWorld, viewSpacePosition); + voxelSpacePosition = mul(SEGIWorldToVoxel0, voxelSpacePosition); + voxelSpacePosition = mul(SEGIVoxelProjection0, voxelSpacePosition); + voxelSpacePosition.xyz = voxelSpacePosition.xyz * 0.5 + 0.5; + + float3 worldNormal = normalize(tex2D(_CameraGBufferTexture2, coord).rgb * 2.0 - 1.0); + + float3 voxelOrigin = voxelSpacePosition.xyz + worldNormal.xyz * 0.006 * ConeTraceBias; + + float2 dither = rand(coord + (float)FrameSwitch * 0.11734); + + float smoothness = spec.a * 0.5; + float3 specularColor = spec.rgb; + + float4 reflection = (0.0).xxxx; + + float3 reflectionKernel = reflect(worldViewVector.xyz, worldNormal); + + float3 fresnel = pow(saturate(dot(worldViewVector.xyz, reflectionKernel.xyz)) * (smoothness * 0.5 + 0.5), 5.0); + fresnel = lerp(fresnel, (1.0).xxx, specularColor.rgb); + + voxelOrigin += worldNormal.xyz * 0.002; + reflection = SpecularConeTrace(voxelOrigin.xyz, reflectionKernel.xyz, worldNormal.xyz, smoothness, coord, dither.x); + //reflection = ConeTrace(voxelOrigin.xyz, reflectionKernel.xyz, worldNormal.xyz, input.uv.xy, 0.0, 12, 0.1, 1.0, 1.0, 1.0); + + //reflection = tex3D(SEGIVolumeLevel0, voxelOrigin.xyz) * 10.0; + //reflection = float4(1.0, 1.0, 1.0, 1.0); + + float3 skyReflection = (reflection.a * 1.0 * SEGISkyColor); + + reflection.rgb = reflection.rgb * 0.7 + skyReflection.rgb * 2.4015 * SkyReflectionIntensity; + + return float4(reflection.rgb, 1.0); + } + + ENDCG + } + + Pass //5 Get camera depth texture + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4 frag(v2f input) : COLOR0 + { + float2 coord = input.uv.xy; + float4 tex = tex2D(_CameraDepthTexture, coord); + return tex; + } + + ENDCG + } + + Pass //6 Get cmmera normals texture + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + + float4 frag(v2f input) : COLOR0 + { + float2 coord = input.uv.xy; + float4 tex = tex2D(_CameraDepthNormalsTexture, coord); + return tex; + } + + ENDCG + } + + + Pass //7 Visualize GI + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + sampler2D GITexture; + + float4 frag(v2f input) : COLOR0 + { + float4 albedoTex = tex2D(_CameraGBufferTexture0, input.uv.xy); + float3 albedo = albedoTex.rgb; + float3 gi = tex2D(GITexture, input.uv.xy).rgb; + return float4(gi, 1.0); + } + + ENDCG + } + + + + Pass //8 Write black + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4 frag(v2f input) : COLOR0 + { + return float4(0.0, 0.0, 0.0, 1.0); + } + + ENDCG + } + + Pass //9 Visualize slice of GI Volume (CURRENTLY UNUSED) + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float LayerToVisualize; + int MipLevelToVisualize; + + sampler3D SEGIVolumeTexture1; + + float4 frag(v2f input) : COLOR0 + { + return float4(tex3D(SEGIVolumeTexture1, float3(input.uv.xy, LayerToVisualize)).rgb, 1.0); + } + + ENDCG + } + + + Pass //10 Visualize voxels (trace through GI volumes) + { +ZTest Always + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float4x4 CameraToWorld; + + sampler2D _CameraGBufferTexture2; + + float4 CameraPosition; + + float4 frag(v2f input) : SV_Target + { + #if UNITY_UV_STARTS_AT_TOP + float2 coord = input.uv2.xy; + #else + float2 coord = input.uv.xy; + #endif + + float4 viewSpacePosition = GetViewSpacePosition(coord); + float3 viewVector = normalize(viewSpacePosition.xyz); + float4 worldViewVector = mul(CameraToWorld, float4(viewVector.xyz, 0.0)); + + float4 voxelCameraPosition0 = mul(SEGIWorldToVoxel0, float4(CameraPosition.xyz, 1.0)); + voxelCameraPosition0 = mul(SEGIVoxelProjection0, voxelCameraPosition0); + voxelCameraPosition0.xyz = voxelCameraPosition0.xyz * 0.5 + 0.5; + + float3 voxelCameraPosition1 = TransformClipSpace1(voxelCameraPosition0); + float3 voxelCameraPosition2 = TransformClipSpace2(voxelCameraPosition0); + float3 voxelCameraPosition3 = TransformClipSpace3(voxelCameraPosition0); + float3 voxelCameraPosition4 = TransformClipSpace4(voxelCameraPosition0); + float3 voxelCameraPosition5 = TransformClipSpace5(voxelCameraPosition0); + + + float4 result = float4(0,0,0,1); + float4 trace; + + + trace = VisualConeTrace(voxelCameraPosition0.xyz, worldViewVector.xyz, 1.0, 0); + result.rgb += trace.rgb; + result.a *= trace.a; + + trace = VisualConeTrace(voxelCameraPosition1.xyz, worldViewVector.xyz, result.a, 1); + result.rgb += trace.rgb; + result.a *= trace.a; + + trace = VisualConeTrace(voxelCameraPosition2.xyz, worldViewVector.xyz, result.a, 2); + result.rgb += trace.rgb; + result.a *= trace.a; + + trace = VisualConeTrace(voxelCameraPosition3.xyz, worldViewVector.xyz, result.a, 3); + result.rgb += trace.rgb; + result.a *= trace.a; + + trace = VisualConeTrace(voxelCameraPosition4.xyz, worldViewVector.xyz, result.a, 4); + result.rgb += trace.rgb; + result.a *= trace.a; + + trace = VisualConeTrace(voxelCameraPosition5.xyz, worldViewVector.xyz, result.a, 5); + result.rgb += trace.rgb; + result.a *= trace.a; + + return float4(result.rgb, 1.0); + } + + ENDCG + } + + Pass //11 Bilateral upsample + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + float2 Kernel; + + float DepthTolerance; + + sampler2D DepthNormalsLow; + sampler2D DepthLow; + int SourceScale; + sampler2D CurrentDepth; + sampler2D CurrentNormal; + + + float4 frag(v2f input) : COLOR0 + { + float4 blurred = float4(0.0, 0.0, 0.0, 0.0); + float4 blurredDumb = float4(0.0, 0.0, 0.0, 0.0); + float validWeights = 0.0; + float depth = LinearEyeDepth(tex2D(_CameraDepthTexture, input.uv.xy).x); + + half3 normal = DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture, input.uv.xy)); + float thresh = 0.26; + + float3 viewPosition = GetViewSpacePosition(input.uv.xy).xyz; + float3 viewVector = normalize(viewPosition); + + float NdotV = 1.0 / (saturate(dot(-viewVector, normal.xyz)) + 0.1); + thresh *= 1.0 + NdotV * 2.0; + + float4 sample00 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 0.0) * 1.0, 0.0, 0.0)); + float4 sample10 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 0.0) * 1.0, 0.0, 0.0)); + float4 sample11 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 1.0) * 1.0, 0.0, 0.0)); + float4 sample01 = tex2Dlod(_MainTex, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 1.0) * 1.0, 0.0, 0.0)); + + float4 depthSamples = float4(0,0,0,0); + depthSamples.x = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 0.0), 0, 0)).x); + depthSamples.y = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 0.0), 0, 0)).x); + depthSamples.z = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 1.0), 0, 0)).x); + depthSamples.w = LinearEyeDepth(tex2Dlod(CurrentDepth, float4(input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 1.0), 0, 0)).x); + + half3 normal00 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 0.0))); + half3 normal10 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 0.0))); + half3 normal11 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(1.0, 1.0))); + half3 normal01 = DecodeViewNormalStereo(tex2D(CurrentNormal, input.uv.xy + _MainTex_TexelSize.xy * float2(0.0, 1.0))); + + float4 depthWeights = saturate(1.0 - abs(depthSamples - depth.xxxx) / thresh); + + float4 normalWeights = float4(0,0,0,0); + normalWeights.x = pow(saturate(dot(normal00, normal)), 24.0); + normalWeights.y = pow(saturate(dot(normal10, normal)), 24.0); + normalWeights.z = pow(saturate(dot(normal11, normal)), 24.0); + normalWeights.w = pow(saturate(dot(normal01, normal)), 24.0); + + float4 weights = depthWeights * normalWeights; + + float weightSum = dot(weights, float4(1.0, 1.0, 1.0, 1.0)); + + if (weightSum < 0.01) + { + weightSum = 4.0; + weights = (1.0).xxxx; + } + + weights /= weightSum; + + float2 fractCoord = frac(input.uv.xy * _MainTex_TexelSize.zw * 1.0); + + float4 filteredX0 = lerp(sample00 * weights.x, sample10 * weights.y, fractCoord.x); + float4 filteredX1 = lerp(sample01 * weights.w, sample11 * weights.z, fractCoord.x); + + float4 filtered = lerp(filteredX0, filteredX1, fractCoord.y); + + + return filtered * 3.0; + + return blurred; + } + + ENDCG + } + + +} + +Fallback off + +} \ No newline at end of file diff --git a/Assets/SEGI/Resources/SEGI_C.shader.meta b/Assets/SEGI/Resources/SEGI_C.shader.meta new file mode 100644 index 0000000..e7d4d7f --- /dev/null +++ b/Assets/SEGI/Resources/SEGI_C.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6402fdc852df24042bad1dd3d693feba +timeCreated: 1501556287 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/SEGI.cs b/Assets/SEGI/SEGI.cs new file mode 100644 index 0000000..12c5f91 --- /dev/null +++ b/Assets/SEGI/SEGI.cs @@ -0,0 +1,1261 @@ +using UnityEngine; +using UnityEngine.Rendering; +using System.Collections; +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; + + +[ExecuteInEditMode] +#if UNITY_5_4_OR_NEWER +[ImageEffectAllowedInSceneView] +#endif +[RequireComponent(typeof(Camera))] +[AddComponentMenu("Image Effects/Sonic Ether/SEGI")] +public class SEGI : MonoBehaviour +{ + +#region Parameters + [Serializable] + public enum VoxelResolution + { + low = 128, + high = 256 + } + + public bool updateGI = true; + public LayerMask giCullingMask = 2147483647; + public float shadowSpaceSize = 50.0f; + public Light sun; + + public Color skyColor; + + public float voxelSpaceSize = 25.0f; + + public bool useBilateralFiltering = false; + + [Range(0, 2)] + public int innerOcclusionLayers = 1; + + + [Range(0.01f, 1.0f)] + public float temporalBlendWeight = 0.1f; + + + public VoxelResolution voxelResolution = VoxelResolution.high; + + public bool visualizeSunDepthTexture = false; + public bool visualizeGI = false; + public bool visualizeVoxels = false; + + public bool halfResolution = true; + public bool stochasticSampling = true; + public bool infiniteBounces = false; + public Transform followTransform; + [Range(1, 128)] + public int cones = 6; + [Range(1, 32)] + public int coneTraceSteps = 14; + [Range(0.1f, 2.0f)] + public float coneLength = 1.0f; + [Range(0.5f, 6.0f)] + public float coneWidth = 5.5f; + [Range(0.0f, 4.0f)] + public float occlusionStrength = 1.0f; + [Range(0.0f, 4.0f)] + public float nearOcclusionStrength = 0.5f; + [Range(0.001f, 4.0f)] + public float occlusionPower = 1.5f; + [Range(0.0f, 4.0f)] + public float coneTraceBias = 1.0f; + [Range(0.0f, 4.0f)] + public float nearLightGain = 1.0f; + [Range(0.0f, 4.0f)] + public float giGain = 1.0f; + [Range(0.0f, 4.0f)] + public float secondaryBounceGain = 1.0f; + [Range(0.0f, 16.0f)] + public float softSunlight = 0.0f; + + [Range(0.0f, 8.0f)] + public float skyIntensity = 1.0f; + + public bool doReflections = true; + [Range(12, 128)] + public int reflectionSteps = 64; + [Range(0.001f, 4.0f)] + public float reflectionOcclusionPower = 1.0f; + [Range(0.0f, 1.0f)] + public float skyReflectionIntensity = 1.0f; + + public bool voxelAA = false; + + public bool gaussianMipFilter = false; + + + [Range(0.1f, 4.0f)] + public float farOcclusionStrength = 1.0f; + [Range(0.1f, 4.0f)] + public float farthestOcclusionStrength = 1.0f; + + [Range(3, 16)] + public int secondaryCones = 6; + [Range(0.1f, 4.0f)] + public float secondaryOcclusionStrength = 1.0f; + + public bool sphericalSkylight = false; + +#endregion + + + + + + +#region InternalVariables + object initChecker; + Material material; + Camera attachedCamera; + Transform shadowCamTransform; + Camera shadowCam; + GameObject shadowCamGameObject; + Texture2D[] blueNoise; + + int sunShadowResolution = 256; + int prevSunShadowResolution; + + Shader sunDepthShader; + + float shadowSpaceDepthRatio = 10.0f; + + int frameCounter = 0; + + + RenderTexture sunDepthTexture; + RenderTexture previousGIResult; + RenderTexture previousCameraDepth; + + ///This is a volume texture that is immediately written to in the voxelization shader. The RInt format enables atomic writes to avoid issues where multiple fragments are trying to write to the same voxel in the volume. + RenderTexture integerVolume; + + ///An array of volume textures where each element is a mip/LOD level. Each volume is half the resolution of the previous volume. Separate textures for each mip level are required for manual mip-mapping of the main GI volume texture. + RenderTexture[] volumeTextures; + + ///The secondary volume texture that holds irradiance calculated during the in-volume GI tracing that occurs when Infinite Bounces is enabled. + RenderTexture secondaryIrradianceVolume; + + ///The alternate mip level 0 main volume texture needed to avoid simultaneous read/write errors while performing temporal stabilization on the main voxel volume. + RenderTexture volumeTextureB; + + ///The current active volume texture that holds GI information to be read during GI tracing. + RenderTexture activeVolume; + + ///The volume texture that holds GI information to be read during GI tracing that was used in the previous frame. + RenderTexture previousActiveVolume; + + ///A 2D texture with the size of [voxel resolution, voxel resolution] that must be used as the active render texture when rendering the scene for voxelization. This texture scales depending on whether Voxel AA is enabled to ensure correct voxelization. + RenderTexture dummyVoxelTextureAAScaled; + + ///A 2D texture with the size of [voxel resolution, voxel resolution] that must be used as the active render texture when rendering the scene for voxelization. This texture is always the same size whether Voxel AA is enabled or not. + RenderTexture dummyVoxelTextureFixed; + + bool notReadyToRender = false; + + Shader voxelizationShader; + Shader voxelTracingShader; + + ComputeShader clearCompute; + ComputeShader transferIntsCompute; + ComputeShader mipFilterCompute; + + const int numMipLevels = 6; + + Camera voxelCamera; + GameObject voxelCameraGO; + GameObject leftViewPoint; + GameObject topViewPoint; + + float voxelScaleFactor + { + get + { + return (float)voxelResolution / 256.0f; + } + } + + Vector3 voxelSpaceOrigin; + Vector3 previousVoxelSpaceOrigin; + Vector3 voxelSpaceOriginDelta; + + + Quaternion rotationFront = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); + Quaternion rotationLeft = new Quaternion(0.0f, 0.7f, 0.0f, 0.7f); + Quaternion rotationTop = new Quaternion(0.7f, 0.0f, 0.0f, 0.7f); + + int voxelFlipFlop = 0; + + + enum RenderState + { + Voxelize, + Bounce + } + + RenderState renderState = RenderState.Voxelize; +#endregion + + + + + +#region SupportingObjectsAndProperties + struct Pass + { + public static int DiffuseTrace = 0; + public static int BilateralBlur = 1; + public static int BlendWithScene = 2; + public static int TemporalBlend = 3; + public static int SpecularTrace = 4; + public static int GetCameraDepthTexture = 5; + public static int GetWorldNormals = 6; + public static int VisualizeGI = 7; + public static int WriteBlack = 8; + public static int VisualizeVoxels = 10; + public static int BilateralUpsample = 11; + } + + public struct SystemSupported + { + public bool hdrTextures; + public bool rIntTextures; + public bool dx11; + public bool volumeTextures; + public bool postShader; + public bool sunDepthShader; + public bool voxelizationShader; + public bool tracingShader; + + public bool fullFunctionality + { + get + { + return hdrTextures && rIntTextures && dx11 && volumeTextures && postShader && sunDepthShader && voxelizationShader && tracingShader; + } + } + } + + /// + /// Contains info on system compatibility of required hardware functionality + /// + public SystemSupported systemSupported; + + /// + /// Estimates the VRAM usage of all the render textures used to render GI. + /// + public float vramUsage + { + get + { + long v = 0; + + if (sunDepthTexture != null) + v += sunDepthTexture.width * sunDepthTexture.height * 16; + + if (previousGIResult != null) + v += previousGIResult.width * previousGIResult.height * 16 * 4; + + if (previousCameraDepth != null) + v += previousCameraDepth.width * previousCameraDepth.height * 32; + + if (integerVolume != null) + v += integerVolume.width * integerVolume.height * integerVolume.volumeDepth * 32; + + if (volumeTextures != null) + { + for (int i = 0; i < volumeTextures.Length; i++) + { + if (volumeTextures[i] != null) + v += volumeTextures[i].width * volumeTextures[i].height * volumeTextures[i].volumeDepth * 16 * 4; + } + } + + if (secondaryIrradianceVolume != null) + v += secondaryIrradianceVolume.width * secondaryIrradianceVolume.height * secondaryIrradianceVolume.volumeDepth * 16 * 4; + + if (volumeTextureB != null) + v += volumeTextureB.width * volumeTextureB.height * volumeTextureB.volumeDepth * 16 * 4; + + if (dummyVoxelTextureAAScaled != null) + v += dummyVoxelTextureAAScaled.width * dummyVoxelTextureAAScaled.height * 8; + + if (dummyVoxelTextureFixed != null) + v += dummyVoxelTextureFixed.width * dummyVoxelTextureFixed.height * 8; + + float vram = (v / 8388608.0f); + + return vram; + } + } + + int mipFilterKernel + { + get + { + return gaussianMipFilter ? 1 : 0; + } + } + + int dummyVoxelResolution + { + get + { + return (int)voxelResolution * (voxelAA ? 2 : 1); + } + } + + int giRenderRes + { + get + { + return halfResolution ? 2 : 1; + } + } + +#endregion + + + ///Applies an SEGIPreset to this instance of SEGI. + public void ApplyPreset(SEGIPreset preset) + { + voxelResolution = preset.voxelResolution; + voxelAA = preset.voxelAA; + innerOcclusionLayers = preset.innerOcclusionLayers; + infiniteBounces = preset.infiniteBounces; + + temporalBlendWeight = preset.temporalBlendWeight; + useBilateralFiltering = preset.useBilateralFiltering; + halfResolution = preset.halfResolution; + stochasticSampling = preset.stochasticSampling; + doReflections = preset.doReflections; + + cones = preset.cones; + coneTraceSteps = preset.coneTraceSteps; + coneLength = preset.coneLength; + coneWidth = preset.coneWidth; + coneTraceBias = preset.coneTraceBias; + occlusionStrength = preset.occlusionStrength; + nearOcclusionStrength = preset.nearOcclusionStrength; + occlusionPower = preset.occlusionPower; + nearLightGain = preset.nearLightGain; + giGain = preset.giGain; + secondaryBounceGain = preset.secondaryBounceGain; + + reflectionSteps = preset.reflectionSteps; + reflectionOcclusionPower = preset.reflectionOcclusionPower; + skyReflectionIntensity = preset.skyReflectionIntensity; + gaussianMipFilter = preset.gaussianMipFilter; + + farOcclusionStrength = preset.farOcclusionStrength; + farthestOcclusionStrength = preset.farthestOcclusionStrength; + secondaryCones = preset.secondaryCones; + secondaryOcclusionStrength = preset.secondaryOcclusionStrength; + } + + void Start() + { + InitCheck(); + } + + void InitCheck() + { + if (initChecker == null) + { + Init(); + } + } + + void CreateVolumeTextures() + { + if (volumeTextures != null) + { + for (int i = 0; i < numMipLevels; i++) + { + if (volumeTextures[i] != null) { + volumeTextures[i].DiscardContents(); + volumeTextures[i].Release(); + DestroyImmediate(volumeTextures[i]); + } + } + } + + volumeTextures = new RenderTexture[numMipLevels]; + + for (int i = 0; i < numMipLevels; i++) + { + int resolution = (int)voxelResolution / Mathf.RoundToInt(Mathf.Pow((float)2, (float)i)); + volumeTextures[i] = new RenderTexture(resolution, resolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); + #if UNITY_5_4_OR_NEWER + volumeTextures[i].dimension = TextureDimension.Tex3D; + #else + volumeTextures[i].isVolume = true; + #endif + volumeTextures[i].volumeDepth = resolution; + volumeTextures[i].enableRandomWrite = true; + volumeTextures[i].filterMode = FilterMode.Bilinear; + #if UNITY_5_4_OR_NEWER + volumeTextures[i].autoGenerateMips = false; + #else + volumeTextures[i].generateMips = false; + #endif + volumeTextures[i].useMipMap = false; + volumeTextures[i].Create(); + volumeTextures[i].hideFlags = HideFlags.HideAndDontSave; + } + + if (volumeTextureB) + { + volumeTextureB.DiscardContents(); + volumeTextureB.Release(); + DestroyImmediate(volumeTextureB); + } + volumeTextureB = new RenderTexture((int)voxelResolution, (int)voxelResolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); + #if UNITY_5_4_OR_NEWER + volumeTextureB.dimension = TextureDimension.Tex3D; + #else + volumeTextureB.isVolume = true; + #endif + volumeTextureB.volumeDepth = (int)voxelResolution; + volumeTextureB.enableRandomWrite = true; + volumeTextureB.filterMode = FilterMode.Bilinear; + #if UNITY_5_4_OR_NEWER + volumeTextureB.autoGenerateMips = false; + #else + volumeTextureB.generateMips = false; + #endif + volumeTextureB.useMipMap = false; + volumeTextureB.Create(); + volumeTextureB.hideFlags = HideFlags.HideAndDontSave; + + if (secondaryIrradianceVolume) + { + secondaryIrradianceVolume.DiscardContents(); + secondaryIrradianceVolume.Release(); + DestroyImmediate(secondaryIrradianceVolume); + } + secondaryIrradianceVolume = new RenderTexture((int)voxelResolution, (int)voxelResolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); + #if UNITY_5_4_OR_NEWER + secondaryIrradianceVolume.dimension = TextureDimension.Tex3D; + #else + secondaryIrradianceVolume.isVolume = true; + #endif + secondaryIrradianceVolume.volumeDepth = (int)voxelResolution; + secondaryIrradianceVolume.enableRandomWrite = true; + secondaryIrradianceVolume.filterMode = FilterMode.Point; + #if UNITY_5_4_OR_NEWER + secondaryIrradianceVolume.autoGenerateMips = false; + #else + secondaryIrradianceVolume.generateMips = false; + #endif + secondaryIrradianceVolume.useMipMap = false; + secondaryIrradianceVolume.antiAliasing = 1; + secondaryIrradianceVolume.Create(); + secondaryIrradianceVolume.hideFlags = HideFlags.HideAndDontSave; + + + + if (integerVolume) + { + integerVolume.DiscardContents(); + integerVolume.Release(); + DestroyImmediate(integerVolume); + } + integerVolume = new RenderTexture((int)voxelResolution, (int)voxelResolution, 0, RenderTextureFormat.RInt, RenderTextureReadWrite.Linear); + #if UNITY_5_4_OR_NEWER + integerVolume.dimension = TextureDimension.Tex3D; + #else + integerVolume.isVolume = true; + #endif + integerVolume.volumeDepth = (int)voxelResolution; + integerVolume.enableRandomWrite = true; + integerVolume.filterMode = FilterMode.Point; + integerVolume.Create(); + integerVolume.hideFlags = HideFlags.HideAndDontSave; + + ResizeDummyTexture(); + + } + + void ResizeDummyTexture() + { + if (dummyVoxelTextureAAScaled) + { + dummyVoxelTextureAAScaled.DiscardContents(); + dummyVoxelTextureAAScaled.Release(); + DestroyImmediate(dummyVoxelTextureAAScaled); + } + dummyVoxelTextureAAScaled = new RenderTexture(dummyVoxelResolution, dummyVoxelResolution, 0, RenderTextureFormat.R8); + dummyVoxelTextureAAScaled.Create(); + dummyVoxelTextureAAScaled.hideFlags = HideFlags.HideAndDontSave; + + if (dummyVoxelTextureFixed) + { + dummyVoxelTextureFixed.DiscardContents(); + dummyVoxelTextureFixed.Release(); + DestroyImmediate(dummyVoxelTextureFixed); + } + dummyVoxelTextureFixed = new RenderTexture((int)voxelResolution, (int)voxelResolution, 0, RenderTextureFormat.R8); + dummyVoxelTextureFixed.Create(); + dummyVoxelTextureFixed.hideFlags = HideFlags.HideAndDontSave; + } + + void Init() + { + //Setup shaders and materials + sunDepthShader = Shader.Find("Hidden/SEGIRenderSunDepth"); + + clearCompute = Resources.Load("SEGIClear") as ComputeShader; + transferIntsCompute = Resources.Load("SEGITransferInts") as ComputeShader; + mipFilterCompute = Resources.Load("SEGIMipFilter") as ComputeShader; + + voxelizationShader = Shader.Find("Hidden/SEGIVoxelizeScene"); + voxelTracingShader = Shader.Find("Hidden/SEGITraceScene"); + + if (!material) { + material = new Material(Shader.Find("Hidden/SEGI")); + material.hideFlags = HideFlags.HideAndDontSave; + } + + //Get the camera attached to this game object + attachedCamera = this.GetComponent(); + attachedCamera.depthTextureMode |= DepthTextureMode.Depth; + #if UNITY_5_4_OR_NEWER + attachedCamera.depthTextureMode |= DepthTextureMode.MotionVectors; + #endif + + + //Find the proxy shadow rendering camera if it exists + GameObject scgo = GameObject.Find("SEGI_SHADOWCAM"); + + //If not, create it + if (!scgo) + { + shadowCamGameObject = new GameObject("SEGI_SHADOWCAM"); + shadowCam = shadowCamGameObject.AddComponent(); + shadowCamGameObject.hideFlags = HideFlags.HideAndDontSave; + + + shadowCam.enabled = false; + shadowCam.depth = attachedCamera.depth - 1; + shadowCam.orthographic = true; + shadowCam.orthographicSize = shadowSpaceSize; + shadowCam.clearFlags = CameraClearFlags.SolidColor; + shadowCam.backgroundColor = new Color(0.0f, 0.0f, 0.0f, 1.0f); + shadowCam.farClipPlane = shadowSpaceSize * 2.0f * shadowSpaceDepthRatio; + shadowCam.cullingMask = giCullingMask; + shadowCam.useOcclusionCulling = false; + + shadowCamTransform = shadowCamGameObject.transform; + } + else //Otherwise, it already exists, just get it + { + shadowCamGameObject = scgo; + shadowCam = scgo.GetComponent(); + shadowCamTransform = shadowCamGameObject.transform; + } + + + + //Create the proxy camera objects responsible for rendering the scene to voxelize the scene. If they already exist, destroy them + GameObject vcgo = GameObject.Find("SEGI_VOXEL_CAMERA"); + + if (!vcgo) { + voxelCameraGO = new GameObject("SEGI_VOXEL_CAMERA"); + voxelCameraGO.hideFlags = HideFlags.HideAndDontSave; + + voxelCamera = voxelCameraGO.AddComponent(); + voxelCamera.enabled = false; + voxelCamera.orthographic = true; + voxelCamera.orthographicSize = voxelSpaceSize * 0.5f; + voxelCamera.nearClipPlane = 0.0f; + voxelCamera.farClipPlane = voxelSpaceSize; + voxelCamera.depth = -2; + voxelCamera.renderingPath = RenderingPath.Forward; + voxelCamera.clearFlags = CameraClearFlags.Color; + voxelCamera.backgroundColor = Color.black; + voxelCamera.useOcclusionCulling = false; + } + else + { + voxelCameraGO = vcgo; + voxelCamera = vcgo.GetComponent(); + } + + GameObject lvp = GameObject.Find("SEGI_LEFT_VOXEL_VIEW"); + + if (!lvp) { + leftViewPoint = new GameObject("SEGI_LEFT_VOXEL_VIEW"); + leftViewPoint.hideFlags = HideFlags.HideAndDontSave; + } + else + { + leftViewPoint = lvp; + } + + GameObject tvp = GameObject.Find("SEGI_TOP_VOXEL_VIEW"); + + if (!tvp) { + topViewPoint = new GameObject("SEGI_TOP_VOXEL_VIEW"); + topViewPoint.hideFlags = HideFlags.HideAndDontSave; + } + else + { + topViewPoint = tvp; + } + + //Get blue noise textures + blueNoise = null; + blueNoise = new Texture2D[64]; + for (int i = 0; i < 64; i++) + { + string fileName = "LDR_RGBA_" + i.ToString(); + Texture2D blueNoiseTexture = Resources.Load("Noise Textures/" + fileName) as Texture2D; + + if (blueNoiseTexture == null) + { + Debug.LogWarning("Unable to find noise texture \"Assets/SEGI/Resources/Noise Textures/" + fileName + "\" for SEGI!"); + } + + blueNoise[i] = blueNoiseTexture; + + } + + //Setup sun depth texture + if (sunDepthTexture) + { + sunDepthTexture.DiscardContents(); + sunDepthTexture.Release(); + DestroyImmediate(sunDepthTexture); + } + sunDepthTexture = new RenderTexture(sunShadowResolution, sunShadowResolution, 16, RenderTextureFormat.RHalf, RenderTextureReadWrite.Linear); + sunDepthTexture.wrapMode = TextureWrapMode.Clamp; + sunDepthTexture.filterMode = FilterMode.Point; + sunDepthTexture.Create(); + sunDepthTexture.hideFlags = HideFlags.HideAndDontSave; + + + //Create the volume textures + CreateVolumeTextures(); + + + initChecker = new object(); + } + + void CheckSupport() + { + systemSupported.hdrTextures = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf); + systemSupported.rIntTextures = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RInt); + systemSupported.dx11 = SystemInfo.graphicsShaderLevel >= 50 && SystemInfo.supportsComputeShaders; + systemSupported.volumeTextures = SystemInfo.supports3DTextures; + + systemSupported.postShader = material.shader.isSupported; + systemSupported.sunDepthShader = sunDepthShader.isSupported; + systemSupported.voxelizationShader = voxelizationShader.isSupported; + systemSupported.tracingShader = voxelTracingShader.isSupported; + + if (!systemSupported.fullFunctionality) + { + Debug.LogWarning("SEGI is not supported on the current platform. Check for shader compile errors in SEGI/Resources"); + enabled = false; + } + } + + void OnDrawGizmosSelected() + { + if (!enabled) + return; + + Color prevColor = Gizmos.color; + Gizmos.color = new Color(1.0f, 0.25f, 0.0f, 0.5f); + + Gizmos.DrawCube(voxelSpaceOrigin, new Vector3(voxelSpaceSize, voxelSpaceSize, voxelSpaceSize)); + + Gizmos.color = new Color(1.0f, 0.0f, 0.0f, 0.1f); + + Gizmos.color = prevColor; + } + + void CleanupTexture(ref RenderTexture texture) + { + if (texture) + { + texture.DiscardContents(); + texture.Release(); + DestroyImmediate(texture); + } + } + + void CleanupTextures() + { + CleanupTexture(ref sunDepthTexture); + CleanupTexture(ref previousGIResult); + CleanupTexture(ref previousCameraDepth); + CleanupTexture(ref integerVolume); + for (int i = 0; i < volumeTextures.Length; i++) + { + CleanupTexture(ref volumeTextures[i]); + } + CleanupTexture(ref secondaryIrradianceVolume); + CleanupTexture(ref volumeTextureB); + CleanupTexture(ref dummyVoxelTextureAAScaled); + CleanupTexture(ref dummyVoxelTextureFixed); + } + + void Cleanup() + { + DestroyImmediate(material); + DestroyImmediate(voxelCameraGO); + DestroyImmediate(leftViewPoint); + DestroyImmediate(topViewPoint); + DestroyImmediate(shadowCamGameObject); + initChecker = null; + + CleanupTextures(); + } + + void OnEnable() + { + InitCheck(); + ResizeRenderTextures(); + + CheckSupport(); + } + + void OnDisable() + { + Cleanup(); + } + + void ResizeRenderTextures() + { + if (previousGIResult) + { + previousGIResult.DiscardContents(); + previousGIResult.Release(); + DestroyImmediate(previousGIResult); + } + + int width = attachedCamera.pixelWidth == 0 ? 2 : attachedCamera.pixelWidth; + int height = attachedCamera.pixelHeight == 0 ? 2 : attachedCamera.pixelHeight; + + previousGIResult = new RenderTexture(width, height, 0, RenderTextureFormat.ARGBHalf); + previousGIResult.wrapMode = TextureWrapMode.Clamp; + previousGIResult.filterMode = FilterMode.Bilinear; + previousGIResult.useMipMap = true; + //#if UNITY_5_4_OR_NEWER + previousGIResult.autoGenerateMips = false; + // #else + // previousResult.generateMips = false; + // #endif + previousGIResult.Create(); + previousGIResult.hideFlags = HideFlags.HideAndDontSave; + + if (previousCameraDepth) + { + previousCameraDepth.DiscardContents(); + previousCameraDepth.Release(); + DestroyImmediate(previousCameraDepth); + } + previousCameraDepth = new RenderTexture(width, height, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear); + previousCameraDepth.wrapMode = TextureWrapMode.Clamp; + previousCameraDepth.filterMode = FilterMode.Bilinear; + previousCameraDepth.Create(); + previousCameraDepth.hideFlags = HideFlags.HideAndDontSave; + } + + void ResizeSunShadowBuffer() + { + + if (sunDepthTexture) + { + sunDepthTexture.DiscardContents(); + sunDepthTexture.Release(); + DestroyImmediate(sunDepthTexture); + } + sunDepthTexture = new RenderTexture(sunShadowResolution, sunShadowResolution, 16, RenderTextureFormat.RHalf, RenderTextureReadWrite.Linear); + sunDepthTexture.wrapMode = TextureWrapMode.Clamp; + sunDepthTexture.filterMode = FilterMode.Point; + sunDepthTexture.Create(); + sunDepthTexture.hideFlags = HideFlags.HideAndDontSave; + } + + void Update() + { + if (notReadyToRender) + return; + + if (previousGIResult == null) + { + ResizeRenderTextures(); + } + + if (previousGIResult.width != attachedCamera.pixelWidth || previousGIResult.height != attachedCamera.pixelHeight) + { + ResizeRenderTextures(); + } + + if ((int)sunShadowResolution != prevSunShadowResolution) + { + ResizeSunShadowBuffer(); + } + + prevSunShadowResolution = (int)sunShadowResolution; + + if (volumeTextures[0].width != (int)voxelResolution) + { + CreateVolumeTextures(); + } + + if (dummyVoxelTextureAAScaled.width != dummyVoxelResolution) + { + ResizeDummyTexture(); + } + } + + Matrix4x4 TransformViewMatrix(Matrix4x4 mat) + { + //Since the third column of the view matrix needs to be reversed if using reversed z-buffer, do so here +#if UNITY_5_5_OR_NEWER + if (SystemInfo.usesReversedZBuffer) + { + mat[2, 0] = -mat[2, 0]; + mat[2, 1] = -mat[2, 1]; + mat[2, 2] = -mat[2, 2]; + mat[2, 3] = -mat[2, 3]; + } +#endif + return mat; + } + + void OnPreRender() + { + //Force reinitialization to make sure that everything is working properly if one of the cameras was unexpectedly destroyed + if (!voxelCamera || !shadowCam) + initChecker = null; + + InitCheck(); + + if (notReadyToRender) + return; + + if (!updateGI) + { + return; + } + + //Cache the previous active render texture to avoid issues with other Unity rendering going on + RenderTexture previousActive = RenderTexture.active; + + Shader.SetGlobalInt("SEGIVoxelAA", voxelAA ? 1 : 0); + + + + //Main voxelization work + if (renderState == RenderState.Voxelize) + { + activeVolume = voxelFlipFlop == 0 ? volumeTextures[0] : volumeTextureB; //Flip-flopping volume textures to avoid simultaneous read and write errors in shaders + previousActiveVolume = voxelFlipFlop == 0 ? volumeTextureB : volumeTextures[0]; + + //float voxelTexel = (1.0f * voxelSpaceSize) / (int)voxelResolution * 0.5f; //Calculate the size of a voxel texel in world-space units + + + + //Setup the voxel volume origin position + float interval = voxelSpaceSize / 8.0f; //The interval at which the voxel volume will be "locked" in world-space + Vector3 origin; + if (followTransform) + { + origin = followTransform.position; + } + else + { + //GI is still flickering a bit when the scene view and the game view are opened at the same time + origin = transform.position + transform.forward * voxelSpaceSize / 4.0f; + } + //Lock the voxel volume origin based on the interval + voxelSpaceOrigin = new Vector3(Mathf.Round(origin.x / interval) * interval, Mathf.Round(origin.y / interval) * interval, Mathf.Round(origin.z / interval) * interval); + + //Calculate how much the voxel origin has moved since last voxelization pass. Used for scrolling voxel data in shaders to avoid ghosting when the voxel volume moves in the world + voxelSpaceOriginDelta = voxelSpaceOrigin - previousVoxelSpaceOrigin; + Shader.SetGlobalVector("SEGIVoxelSpaceOriginDelta", voxelSpaceOriginDelta / voxelSpaceSize); + + previousVoxelSpaceOrigin = voxelSpaceOrigin; + + + + //Set the voxel camera (proxy camera used to render the scene for voxelization) parameters + voxelCamera.enabled = false; + voxelCamera.orthographic = true; + voxelCamera.orthographicSize = voxelSpaceSize * 0.5f; + voxelCamera.nearClipPlane = 0.0f; + voxelCamera.farClipPlane = voxelSpaceSize; + voxelCamera.depth = -2; + voxelCamera.renderingPath = RenderingPath.Forward; + voxelCamera.clearFlags = CameraClearFlags.Color; + voxelCamera.backgroundColor = Color.black; + voxelCamera.cullingMask = giCullingMask; + + + //Move the voxel camera game object and other related objects to the above calculated voxel space origin + voxelCameraGO.transform.position = voxelSpaceOrigin - Vector3.forward * voxelSpaceSize * 0.5f; + voxelCameraGO.transform.rotation = rotationFront; + + leftViewPoint.transform.position = voxelSpaceOrigin + Vector3.left * voxelSpaceSize * 0.5f; + leftViewPoint.transform.rotation = rotationLeft; + topViewPoint.transform.position = voxelSpaceOrigin + Vector3.up * voxelSpaceSize * 0.5f; + topViewPoint.transform.rotation = rotationTop; + + + + //Set matrices needed for voxelization + Shader.SetGlobalMatrix("WorldToCamera", attachedCamera.worldToCameraMatrix); + Shader.SetGlobalMatrix("SEGIVoxelViewFront", TransformViewMatrix(voxelCamera.transform.worldToLocalMatrix)); + Shader.SetGlobalMatrix("SEGIVoxelViewLeft", TransformViewMatrix(leftViewPoint.transform.worldToLocalMatrix)); + Shader.SetGlobalMatrix("SEGIVoxelViewTop", TransformViewMatrix(topViewPoint.transform.worldToLocalMatrix)); + Shader.SetGlobalMatrix("SEGIWorldToVoxel", voxelCamera.worldToCameraMatrix); + Shader.SetGlobalMatrix("SEGIVoxelProjection", voxelCamera.projectionMatrix); + Shader.SetGlobalMatrix("SEGIVoxelProjectionInverse", voxelCamera.projectionMatrix.inverse); + + Shader.SetGlobalInt("SEGIVoxelResolution", (int)voxelResolution); + + Matrix4x4 voxelToGIProjection = (shadowCam.projectionMatrix) * (shadowCam.worldToCameraMatrix) * (voxelCamera.cameraToWorldMatrix); + Shader.SetGlobalMatrix("SEGIVoxelToGIProjection", voxelToGIProjection); + Shader.SetGlobalVector("SEGISunlightVector", sun ? Vector3.Normalize(sun.transform.forward) : Vector3.up); + + //Set paramteters + Shader.SetGlobalColor("GISunColor", sun == null ? Color.black : new Color(Mathf.Pow(sun.color.r, 2.2f), Mathf.Pow(sun.color.g, 2.2f), Mathf.Pow(sun.color.b, 2.2f), Mathf.Pow(sun.intensity, 2.2f))); + Shader.SetGlobalColor("SEGISkyColor", new Color(Mathf.Pow(skyColor.r * skyIntensity * 0.5f, 2.2f), Mathf.Pow(skyColor.g * skyIntensity * 0.5f, 2.2f), Mathf.Pow(skyColor.b * skyIntensity * 0.5f, 2.2f), Mathf.Pow(skyColor.a, 2.2f))); + Shader.SetGlobalFloat("GIGain", giGain); + Shader.SetGlobalFloat("SEGISecondaryBounceGain", infiniteBounces ? secondaryBounceGain : 0.0f); + Shader.SetGlobalFloat("SEGISoftSunlight", softSunlight); + Shader.SetGlobalInt("SEGISphericalSkylight", sphericalSkylight ? 1 : 0); + Shader.SetGlobalInt("SEGIInnerOcclusionLayers", innerOcclusionLayers); + + + //Render the depth texture from the sun's perspective in order to inject sunlight with shadows during voxelization + if (sun != null) + { + shadowCam.cullingMask = giCullingMask; + + Vector3 shadowCamPosition = voxelSpaceOrigin + Vector3.Normalize(-sun.transform.forward) * shadowSpaceSize * 0.5f * shadowSpaceDepthRatio; + + shadowCamTransform.position = shadowCamPosition; + shadowCamTransform.LookAt(voxelSpaceOrigin, Vector3.up); + + shadowCam.renderingPath = RenderingPath.Forward; + shadowCam.depthTextureMode |= DepthTextureMode.None; + + shadowCam.orthographicSize = shadowSpaceSize; + shadowCam.farClipPlane = shadowSpaceSize * 2.0f * shadowSpaceDepthRatio; + + + Graphics.SetRenderTarget(sunDepthTexture); + shadowCam.SetTargetBuffers(sunDepthTexture.colorBuffer, sunDepthTexture.depthBuffer); + + shadowCam.RenderWithShader(sunDepthShader, ""); + + Shader.SetGlobalTexture("SEGISunDepth", sunDepthTexture); + } + + + + + + + + + + //Clear the volume texture that is immediately written to in the voxelization scene shader + clearCompute.SetTexture(0, "RG0", integerVolume); + clearCompute.SetInt("Res", (int)voxelResolution); + clearCompute.Dispatch(0, (int)voxelResolution / 16, (int)voxelResolution / 16, 1); + + + + + + + + + //Render the scene with the voxel proxy camera object with the voxelization shader to voxelize the scene to the volume integer texture + Graphics.SetRandomWriteTarget(1, integerVolume); + voxelCamera.targetTexture = dummyVoxelTextureAAScaled; + voxelCamera.RenderWithShader(voxelizationShader, ""); + Graphics.ClearRandomWriteTargets(); + + + //Transfer the data from the volume integer texture to the main volume texture used for GI tracing. + transferIntsCompute.SetTexture(0, "Result", activeVolume); + transferIntsCompute.SetTexture(0, "PrevResult", previousActiveVolume); + transferIntsCompute.SetTexture(0, "RG0", integerVolume); + transferIntsCompute.SetInt("VoxelAA", voxelAA ? 1 : 0); + transferIntsCompute.SetInt("Resolution", (int)voxelResolution); + transferIntsCompute.SetVector("VoxelOriginDelta", (voxelSpaceOriginDelta / voxelSpaceSize) * (int)voxelResolution); + transferIntsCompute.Dispatch(0, (int)voxelResolution / 16, (int)voxelResolution / 16, 1); + + Shader.SetGlobalTexture("SEGIVolumeLevel0", activeVolume); + + //Manually filter/render mip maps + for (int i = 0; i < numMipLevels - 1; i++) + { + RenderTexture source = volumeTextures[i]; + + if (i == 0) + { + source = activeVolume; + } + + int destinationRes = (int)voxelResolution / Mathf.RoundToInt(Mathf.Pow((float)2, (float)i + 1.0f)); + mipFilterCompute.SetInt("destinationRes", destinationRes); + mipFilterCompute.SetTexture(mipFilterKernel, "Source", source); + mipFilterCompute.SetTexture(mipFilterKernel, "Destination", volumeTextures[i + 1]); + mipFilterCompute.Dispatch(mipFilterKernel, destinationRes / 8, destinationRes / 8, 1); + Shader.SetGlobalTexture("SEGIVolumeLevel" + (i + 1).ToString(), volumeTextures[i + 1]); + } + + //Advance the voxel flip flop counter + voxelFlipFlop += 1; + voxelFlipFlop = voxelFlipFlop % 2; + + if (infiniteBounces) + { + renderState = RenderState.Bounce; + } + } + else if (renderState == RenderState.Bounce) + { + + //Clear the volume texture that is immediately written to in the voxelization scene shader + clearCompute.SetTexture(0, "RG0", integerVolume); + clearCompute.Dispatch(0, (int)voxelResolution / 16, (int)voxelResolution / 16, 1); + + //Set secondary tracing parameters + Shader.SetGlobalInt("SEGISecondaryCones", secondaryCones); + Shader.SetGlobalFloat("SEGISecondaryOcclusionStrength", secondaryOcclusionStrength); + + //Render the scene from the voxel camera object with the voxel tracing shader to render a bounce of GI into the irradiance volume + Graphics.SetRandomWriteTarget(1, integerVolume); + voxelCamera.targetTexture = dummyVoxelTextureFixed; + voxelCamera.RenderWithShader(voxelTracingShader, ""); + Graphics.ClearRandomWriteTargets(); + + + //Transfer the data from the volume integer texture to the irradiance volume texture. This result is added to the next main voxelization pass to create a feedback loop for infinite bounces + transferIntsCompute.SetTexture(1, "Result", secondaryIrradianceVolume); + transferIntsCompute.SetTexture(1, "RG0", integerVolume); + transferIntsCompute.SetInt("Resolution", (int)voxelResolution); + transferIntsCompute.Dispatch(1, (int)voxelResolution / 16, (int)voxelResolution / 16, 1); + + Shader.SetGlobalTexture("SEGIVolumeTexture1", secondaryIrradianceVolume); + + renderState = RenderState.Voxelize; + } + + + + RenderTexture.active = previousActive; + } + + [ImageEffectOpaque] + void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (notReadyToRender) + { + Graphics.Blit(source, destination); + return; + } + + //Set parameters + Shader.SetGlobalFloat("SEGIVoxelScaleFactor", voxelScaleFactor); + + material.SetMatrix("CameraToWorld", attachedCamera.cameraToWorldMatrix); + material.SetMatrix("WorldToCamera", attachedCamera.worldToCameraMatrix); + material.SetMatrix("ProjectionMatrixInverse", attachedCamera.projectionMatrix.inverse); + material.SetMatrix("ProjectionMatrix", attachedCamera.projectionMatrix); + material.SetInt("FrameSwitch", frameCounter); + Shader.SetGlobalInt("SEGIFrameSwitch", frameCounter); + material.SetVector("CameraPosition", transform.position); + material.SetFloat("DeltaTime", Time.deltaTime); + + material.SetInt("StochasticSampling", stochasticSampling ? 1 : 0); + material.SetInt("TraceDirections", cones); + material.SetInt("TraceSteps", coneTraceSteps); + material.SetFloat("TraceLength", coneLength); + material.SetFloat("ConeSize", coneWidth); + material.SetFloat("OcclusionStrength", occlusionStrength); + material.SetFloat("OcclusionPower", occlusionPower); + material.SetFloat("ConeTraceBias", coneTraceBias); + material.SetFloat("GIGain", giGain); + material.SetFloat("NearLightGain", nearLightGain); + material.SetFloat("NearOcclusionStrength", nearOcclusionStrength); + material.SetInt("DoReflections", doReflections ? 1 : 0); + material.SetInt("HalfResolution", halfResolution ? 1 : 0); + material.SetInt("ReflectionSteps", reflectionSteps); + material.SetFloat("ReflectionOcclusionPower", reflectionOcclusionPower); + material.SetFloat("SkyReflectionIntensity", skyReflectionIntensity); + material.SetFloat("FarOcclusionStrength", farOcclusionStrength); + material.SetFloat("FarthestOcclusionStrength", farthestOcclusionStrength); + material.SetTexture("NoiseTexture", blueNoise[frameCounter % 64]); + material.SetFloat("BlendWeight", temporalBlendWeight); + + //If Visualize Voxels is enabled, just render the voxel visualization shader pass and return + if (visualizeVoxels) + { + Graphics.Blit(source, destination, material, Pass.VisualizeVoxels); + return; + } + + //Setup temporary textures + RenderTexture gi1 = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.ARGBHalf); + RenderTexture gi2 = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.ARGBHalf); + RenderTexture reflections = null; + + //If reflections are enabled, create a temporary render buffer to hold them + if (doReflections) + { + reflections = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + } + + //Setup textures to hold the current camera depth and normal + RenderTexture currentDepth = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear); + currentDepth.filterMode = FilterMode.Point; + + RenderTexture currentNormal = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); + currentNormal.filterMode = FilterMode.Point; + + //Get the camera depth and normals + Graphics.Blit(source, currentDepth, material, Pass.GetCameraDepthTexture); + material.SetTexture("CurrentDepth", currentDepth); + Graphics.Blit(source, currentNormal, material, Pass.GetWorldNormals); + material.SetTexture("CurrentNormal", currentNormal); + + //Set the previous GI result and camera depth textures to access them in the shader + material.SetTexture("PreviousGITexture", previousGIResult); + Shader.SetGlobalTexture("PreviousGITexture", previousGIResult); + material.SetTexture("PreviousDepth", previousCameraDepth); + + //Render diffuse GI tracing result + Graphics.Blit(source, gi2, material, Pass.DiffuseTrace); + if (doReflections) + { + //Render GI reflections result + Graphics.Blit(source, reflections, material, Pass.SpecularTrace); + material.SetTexture("Reflections", reflections); + } + + + //Perform bilateral filtering + if (useBilateralFiltering) + { + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi2, gi1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi1, gi2, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi2, gi1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi1, gi2, material, Pass.BilateralBlur); + } + + //If Half Resolution tracing is enabled + if (giRenderRes == 2) + { + RenderTexture.ReleaseTemporary(gi1); + + //Setup temporary textures + RenderTexture gi3 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + RenderTexture gi4 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + + + //Prepare the half-resolution diffuse GI result to be bilaterally upsampled + gi2.filterMode = FilterMode.Point; + Graphics.Blit(gi2, gi4); + + RenderTexture.ReleaseTemporary(gi2); + + gi4.filterMode = FilterMode.Point; + gi3.filterMode = FilterMode.Point; + + + //Perform bilateral upsampling on half-resolution diffuse GI result + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi4, gi3, material, Pass.BilateralUpsample); + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + + //Perform temporal reprojection and blending + if (temporalBlendWeight < 1.0f) + { + Graphics.Blit(gi3, gi4); + Graphics.Blit(gi4, gi3, material, Pass.TemporalBlend); + Graphics.Blit(gi3, previousGIResult); + Graphics.Blit(source, previousCameraDepth, material, Pass.GetCameraDepthTexture); + } + + //Set the result to be accessed in the shader + material.SetTexture("GITexture", gi3); + + //Actually apply the GI to the scene using gbuffer data + Graphics.Blit(source, destination, material, visualizeGI ? Pass.VisualizeGI : Pass.BlendWithScene); + + //Release temporary textures + RenderTexture.ReleaseTemporary(gi3); + RenderTexture.ReleaseTemporary(gi4); + } + else //If Half Resolution tracing is disabled + { + //Perform temporal reprojection and blending + if (temporalBlendWeight < 1.0f) + { + Graphics.Blit(gi2, gi1, material, Pass.TemporalBlend); + Graphics.Blit(gi1, previousGIResult); + Graphics.Blit(source, previousCameraDepth, material, Pass.GetCameraDepthTexture); + } + + //Actually apply the GI to the scene using gbuffer data + material.SetTexture("GITexture", temporalBlendWeight < 1.0f ? gi1 : gi2); + Graphics.Blit(source, destination, material, visualizeGI ? Pass.VisualizeGI : Pass.BlendWithScene); + + //Release temporary textures + RenderTexture.ReleaseTemporary(gi1); + RenderTexture.ReleaseTemporary(gi2); + } + + //Release temporary textures + RenderTexture.ReleaseTemporary(currentDepth); + RenderTexture.ReleaseTemporary(currentNormal); + + //Visualize the sun depth texture + if (visualizeSunDepthTexture) + Graphics.Blit(sunDepthTexture, destination); + + + //Release the temporary reflections result texture + if (doReflections) + { + RenderTexture.ReleaseTemporary(reflections); + } + + //Set matrices/vectors for use during temporal reprojection + material.SetMatrix("ProjectionPrev", attachedCamera.projectionMatrix); + material.SetMatrix("ProjectionPrevInverse", attachedCamera.projectionMatrix.inverse); + material.SetMatrix("WorldToCameraPrev", attachedCamera.worldToCameraMatrix); + material.SetMatrix("CameraToWorldPrev", attachedCamera.cameraToWorldMatrix); + material.SetVector("CameraPositionPrev", transform.position); + + //Advance the frame counter + frameCounter = (frameCounter + 1) % (64); + } +} diff --git a/Assets/SEGI/SEGI.cs.meta b/Assets/SEGI/SEGI.cs.meta new file mode 100644 index 0000000..bdbdbd8 --- /dev/null +++ b/Assets/SEGI/SEGI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 855c24b21068ca6449a4680af0c5645e +timeCreated: 1502923549 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: dbb032076c5c83c41bba0c204a2a970a, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/SEGICascaded.cs b/Assets/SEGI/SEGICascaded.cs new file mode 100644 index 0000000..6fa3e37 --- /dev/null +++ b/Assets/SEGI/SEGICascaded.cs @@ -0,0 +1,1505 @@ +using UnityEngine; +using UnityEngine.Rendering; +using System.Collections; +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; + +[ExecuteInEditMode] +#if UNITY_5_4_OR_NEWER +[ImageEffectAllowedInSceneView] +#endif +[RequireComponent(typeof(Camera))] +[AddComponentMenu("Image Effects/Sonic Ether/SEGI (Cascaded)")] +public class SEGICascaded : MonoBehaviour +{ + + + +#region Parameters + [Serializable] + public enum VoxelResolution + { + low = 64, + high = 128 + } + + public VoxelResolution voxelResolution = VoxelResolution.high; + + public bool visualizeSunDepthTexture = false; + public bool visualizeGI = false; + + public Light sun; + public LayerMask giCullingMask = 2147483647; + + public float shadowSpaceSize = 50.0f; + + [Range(0.01f, 1.0f)] + public float temporalBlendWeight = 0.1f; + + public bool visualizeVoxels = false; + + public bool updateGI = true; + + + public Color skyColor; + + public float voxelSpaceSize = 25.0f; + + public bool useBilateralFiltering = false; + + [Range(0, 2)] + public int innerOcclusionLayers = 1; + + public bool halfResolution = false; + public bool stochasticSampling = true; + public bool infiniteBounces = false; + public Transform followTransform; + [Range(1, 128)] + public int cones = 4; + [Range(1, 32)] + public int coneTraceSteps = 10; + [Range(0.1f, 2.0f)] + public float coneLength = 1.0f; + [Range(0.5f, 6.0f)] + public float coneWidth = 3.9f; + [Range(0.0f, 2.0f)] + public float occlusionStrength = 0.15f; + [Range(0.0f, 4.0f)] + public float nearOcclusionStrength = 0.5f; + [Range(0.001f, 4.0f)] + public float occlusionPower = 0.65f; + [Range(0.0f, 4.0f)] + public float coneTraceBias = 2.8f; + [Range(0.0f, 4.0f)] + public float nearLightGain = 0.36f; + [Range(0.0f, 4.0f)] + public float giGain = 1.0f; + [Range(0.0f, 4.0f)] + public float secondaryBounceGain = 0.9f; + [Range(0.0f, 16.0f)] + public float softSunlight = 0.0f; + + [Range(0.0f, 8.0f)] + public float skyIntensity = 1.0f; + + [HideInInspector] + public bool doReflections + { + get + { + return false; //Locked to keep reflections disabled since they're in a broken state with cascades at the moment + } + set + { + value = false; + } + } + + [Range(12, 128)] + public int reflectionSteps = 64; + [Range(0.001f, 4.0f)] + public float reflectionOcclusionPower = 1.0f; + [Range(0.0f, 1.0f)] + public float skyReflectionIntensity = 1.0f; + + + + [Range(0.1f, 4.0f)] + public float farOcclusionStrength = 1.0f; + [Range(0.1f, 4.0f)] + public float farthestOcclusionStrength = 1.0f; + + [Range(3, 16)] + public int secondaryCones = 6; + [Range(0.1f, 2.0f)] + public float secondaryOcclusionStrength = 0.27f; + + public bool sphericalSkylight = false; +#endregion + + + + +#region InternalVariables + object initChecker; + Material material; + Camera attachedCamera; + Transform shadowCamTransform; + Camera shadowCam; + GameObject shadowCamGameObject; + Texture2D[] blueNoise; + + int sunShadowResolution = 128; + int prevSunShadowResolution; + + Shader sunDepthShader; + + float shadowSpaceDepthRatio = 10.0f; + + int frameCounter = 0; + + + + RenderTexture sunDepthTexture; + RenderTexture previousGIResult; + RenderTexture previousDepth; + + ///This is a volume texture that is immediately written to in the voxelization shader. The RInt format enables atomic writes to avoid issues where multiple fragments are trying to write to the same voxel in the volume. + RenderTexture integerVolume; + + ///A 2D texture with the size of [voxel resolution, voxel resolution] that must be used as the active render texture when rendering the scene for voxelization. This texture scales depending on whether Voxel AA is enabled to ensure correct voxelization. + RenderTexture dummyVoxelTextureAAScaled; + + ///A 2D texture with the size of [voxel resolution, voxel resolution] that must be used as the active render texture when rendering the scene for voxelization. This texture is always the same size whether Voxel AA is enabled or not. + RenderTexture dummyVoxelTextureFixed; + + ///The main GI data clipmaps that hold GI data referenced during GI tracing + Clipmap[] clipmaps; + + ///The secondary clipmaps that hold irradiance data for infinite bounces + Clipmap[] irradianceClipmaps; + + + + bool notReadyToRender = false; + + Shader voxelizationShader; + Shader voxelTracingShader; + + ComputeShader clearCompute; + ComputeShader transferIntsCompute; + ComputeShader mipFilterCompute; + + const int numClipmaps = 6; + int clipmapCounter = 0; + int currentClipmapIndex = 0; + + Camera voxelCamera; + GameObject voxelCameraGO; + GameObject leftViewPoint; + GameObject topViewPoint; + + float voxelScaleFactor + { + get + { + return (float)voxelResolution / 256.0f; + } + } + + Quaternion rotationFront = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); + Quaternion rotationLeft = new Quaternion(0.0f, 0.7f, 0.0f, 0.7f); + Quaternion rotationTop = new Quaternion(0.7f, 0.0f, 0.0f, 0.7f); + + int giRenderRes + { + get + { + return halfResolution ? 2 : 1; + } + } + + enum RenderState + { + Voxelize, + Bounce + } + + RenderState renderState = RenderState.Voxelize; +#endregion + + + +#region SupportingObjectsAndProperties + struct Pass + { + public static int DiffuseTrace = 0; + public static int BilateralBlur = 1; + public static int BlendWithScene = 2; + public static int TemporalBlend = 3; + public static int SpecularTrace = 4; + public static int GetCameraDepthTexture = 5; + public static int GetWorldNormals = 6; + public static int VisualizeGI = 7; + public static int WriteBlack = 8; + public static int VisualizeVoxels = 10; + public static int BilateralUpsample = 11; + } + + public struct SystemSupported + { + public bool hdrTextures; + public bool rIntTextures; + public bool dx11; + public bool volumeTextures; + public bool postShader; + public bool sunDepthShader; + public bool voxelizationShader; + public bool tracingShader; + + public bool fullFunctionality + { + get + { + return hdrTextures && rIntTextures && dx11 && volumeTextures && postShader && sunDepthShader && voxelizationShader && tracingShader; + } + } + } + + /// + /// Contains info on system compatibility of required hardware functionality + /// + public SystemSupported systemSupported; + + /// + /// Estimates the VRAM usage of all the render textures used to render GI. + /// + public float vramUsage //TODO: Update vram usage calculation + { + get + { + if (!enabled) + { + return 0.0f; + } + long v = 0; + + if (sunDepthTexture != null) + v += sunDepthTexture.width * sunDepthTexture.height * 16; + + if (previousGIResult != null) + v += previousGIResult.width * previousGIResult.height * 16 * 4; + + if (previousDepth != null) + v += previousDepth.width * previousDepth.height * 32; + + if (integerVolume != null) + v += integerVolume.width * integerVolume.height * integerVolume.volumeDepth * 32; + + if (dummyVoxelTextureAAScaled != null) + v += dummyVoxelTextureAAScaled.width * dummyVoxelTextureAAScaled.height * 8; + + if (dummyVoxelTextureFixed != null) + v += dummyVoxelTextureFixed.width * dummyVoxelTextureFixed.height * 8; + + if (clipmaps != null) + { + for (int i = 0; i < numClipmaps; i++) + { + if (clipmaps[i] != null) + { + v += clipmaps[i].volumeTexture0.width * clipmaps[i].volumeTexture0.height * clipmaps[i].volumeTexture0.volumeDepth * 16 * 4; + } + } + } + + if (irradianceClipmaps != null) + { + for (int i = 0; i < numClipmaps; i++) + { + if (irradianceClipmaps[i] != null) + { + v += irradianceClipmaps[i].volumeTexture0.width * irradianceClipmaps[i].volumeTexture0.height * irradianceClipmaps[i].volumeTexture0.volumeDepth * 16 * 4; + } + } + } + + float vram = (v / 8388608.0f); + + return vram; + } + } + + class Clipmap + { + public Vector3 origin; + public Vector3 originDelta; + public Vector3 previousOrigin; + public float localScale; + + public int resolution; + + public RenderTexture volumeTexture0; + + public FilterMode filterMode = FilterMode.Bilinear; + public RenderTextureFormat renderTextureFormat = RenderTextureFormat.ARGBHalf; + + public void UpdateTextures() + { + if (volumeTexture0) + { + volumeTexture0.DiscardContents(); + volumeTexture0.Release(); + DestroyImmediate(volumeTexture0); + } + volumeTexture0 = new RenderTexture(resolution, resolution, 0, renderTextureFormat, RenderTextureReadWrite.Linear); + volumeTexture0.wrapMode = TextureWrapMode.Clamp; + #if UNITY_5_4_OR_NEWER + volumeTexture0.dimension = TextureDimension.Tex3D; + #else + volumeTexture0.isVolume = true; + #endif + volumeTexture0.volumeDepth = resolution; + volumeTexture0.enableRandomWrite = true; + volumeTexture0.filterMode = filterMode; + #if UNITY_5_4_OR_NEWER + volumeTexture0.autoGenerateMips = false; + #else + volumeTexture0.generateMips = false; + #endif + volumeTexture0.useMipMap = false; + volumeTexture0.Create(); + volumeTexture0.hideFlags = HideFlags.HideAndDontSave; + } + + public void CleanupTextures() + { + if (volumeTexture0) + { + volumeTexture0.DiscardContents(); + volumeTexture0.Release(); + DestroyImmediate(volumeTexture0); + } + } + } + + public bool gaussianMipFilter + { + get + { + return false; + } + set + { + value = false; + } + } + + int mipFilterKernel + { + get + { + return gaussianMipFilter ? 1 : 0; + } + } + + public bool voxelAA = false; + + int dummyVoxelResolution + { + get + { + return (int)voxelResolution * (voxelAA ? 4 : 1); + } + } + +#endregion + + + + public void ApplyPreset(SEGICascadedPreset preset) + { + voxelResolution = preset.voxelResolution; + voxelAA = preset.voxelAA; + innerOcclusionLayers = preset.innerOcclusionLayers; + infiniteBounces = preset.infiniteBounces; + + temporalBlendWeight = preset.temporalBlendWeight; + useBilateralFiltering = preset.useBilateralFiltering; + halfResolution = preset.halfResolution; + stochasticSampling = preset.stochasticSampling; + doReflections = preset.doReflections; + + cones = preset.cones; + coneTraceSteps = preset.coneTraceSteps; + coneLength = preset.coneLength; + coneWidth = preset.coneWidth; + coneTraceBias = preset.coneTraceBias; + occlusionStrength = preset.occlusionStrength; + nearOcclusionStrength = preset.nearOcclusionStrength; + occlusionPower = preset.occlusionPower; + nearLightGain = preset.nearLightGain; + giGain = preset.giGain; + secondaryBounceGain = preset.secondaryBounceGain; + + reflectionSteps = preset.reflectionSteps; + reflectionOcclusionPower = preset.reflectionOcclusionPower; + skyReflectionIntensity = preset.skyReflectionIntensity; + gaussianMipFilter = preset.gaussianMipFilter; + + farOcclusionStrength = preset.farOcclusionStrength; + farthestOcclusionStrength = preset.farthestOcclusionStrength; + secondaryCones = preset.secondaryCones; + secondaryOcclusionStrength = preset.secondaryOcclusionStrength; + } + + void Start() + { + InitCheck(); + } + + void InitCheck() + { + if (initChecker == null) + { + Init(); + } + } + + void CreateVolumeTextures() + { + if (integerVolume) + { + integerVolume.DiscardContents(); + integerVolume.Release(); + DestroyImmediate(integerVolume); + } + integerVolume = new RenderTexture((int)voxelResolution, (int)voxelResolution, 0, RenderTextureFormat.RInt, RenderTextureReadWrite.Linear); + #if UNITY_5_4_OR_NEWER + integerVolume.dimension = TextureDimension.Tex3D; + #else + integerVolume.isVolume = true; + #endif + integerVolume.volumeDepth = (int)voxelResolution; + integerVolume.enableRandomWrite = true; + integerVolume.filterMode = FilterMode.Point; + integerVolume.Create(); + integerVolume.hideFlags = HideFlags.HideAndDontSave; + + ResizeDummyTexture(); + } + + void BuildClipmaps() + { + if (clipmaps != null) + { + for (int i = 0; i < numClipmaps; i++) + { + if (clipmaps[i] != null) + { + clipmaps[i].CleanupTextures(); + } + } + } + + clipmaps = new Clipmap[numClipmaps]; + + for (int i = 0; i < numClipmaps; i++) + { + clipmaps[i] = new Clipmap(); + clipmaps[i].localScale = Mathf.Pow(2.0f, (float)i); + clipmaps[i].resolution = (int)voxelResolution; + clipmaps[i].filterMode = FilterMode.Bilinear; + clipmaps[i].renderTextureFormat = RenderTextureFormat.ARGBHalf; + clipmaps[i].UpdateTextures(); + } + + if (irradianceClipmaps != null) + { + for (int i = 0; i < numClipmaps; i++) + { + if (irradianceClipmaps[i] != null) + { + irradianceClipmaps[i].CleanupTextures(); + } + } + } + + irradianceClipmaps = new Clipmap[numClipmaps]; + + for (int i = 0; i < numClipmaps; i++) + { + irradianceClipmaps[i] = new Clipmap(); + irradianceClipmaps[i].localScale = Mathf.Pow(2.0f, i); + irradianceClipmaps[i].resolution = (int)voxelResolution; + irradianceClipmaps[i].filterMode = FilterMode.Point; + irradianceClipmaps[i].renderTextureFormat = RenderTextureFormat.ARGBHalf; + irradianceClipmaps[i].UpdateTextures(); + } + } + + void ResizeDummyTexture() + { + if (dummyVoxelTextureAAScaled) + { + dummyVoxelTextureAAScaled.DiscardContents(); + dummyVoxelTextureAAScaled.Release(); + DestroyImmediate(dummyVoxelTextureAAScaled); + } + dummyVoxelTextureAAScaled = new RenderTexture(dummyVoxelResolution, dummyVoxelResolution, 0, RenderTextureFormat.R8); + dummyVoxelTextureAAScaled.Create(); + dummyVoxelTextureAAScaled.hideFlags = HideFlags.HideAndDontSave; + + if (dummyVoxelTextureFixed) + { + dummyVoxelTextureFixed.DiscardContents(); + dummyVoxelTextureFixed.Release(); + DestroyImmediate(dummyVoxelTextureFixed); + } + dummyVoxelTextureFixed = new RenderTexture((int)voxelResolution, (int)voxelResolution, 0, RenderTextureFormat.R8); + dummyVoxelTextureFixed.Create(); + dummyVoxelTextureFixed.hideFlags = HideFlags.HideAndDontSave; + } + + void GetBlueNoiseTextures() + { + blueNoise = null; + blueNoise = new Texture2D[64]; + for (int i = 0; i < 64; i++) + { + string filename = "LDR_RGBA_" + i.ToString(); + Texture2D blueNoiseTexture = Resources.Load("Noise Textures/" + filename) as Texture2D; + + if (blueNoiseTexture == null) + { + Debug.LogWarning("Unable to find noise texture \"Assets/SEGI/Resources/Noise Textures/" + filename + "\" for SEGI!"); + } + + blueNoise[i] = blueNoiseTexture; + } + } + + void Init() + { + //Setup shaders and materials + sunDepthShader = Shader.Find("Hidden/SEGIRenderSunDepth_C"); + clearCompute = Resources.Load("SEGIClear_C") as ComputeShader; + transferIntsCompute = Resources.Load("SEGITransferInts_C") as ComputeShader; + mipFilterCompute = Resources.Load("SEGIMipFilter_C") as ComputeShader; + voxelizationShader = Shader.Find("Hidden/SEGIVoxelizeScene_C"); + voxelTracingShader = Shader.Find("Hidden/SEGITraceScene_C"); + + if (!material) { + material = new Material(Shader.Find("Hidden/SEGI_C")); + material.hideFlags = HideFlags.HideAndDontSave; + } + + //Get the camera attached to this game object + attachedCamera = this.GetComponent(); + attachedCamera.depthTextureMode |= DepthTextureMode.Depth; + attachedCamera.depthTextureMode |= DepthTextureMode.DepthNormals; + #if UNITY_5_4_OR_NEWER + attachedCamera.depthTextureMode |= DepthTextureMode.MotionVectors; + #endif + + + //Find the proxy shadow rendering camera if it exists + GameObject scgo = GameObject.Find("SEGI_SHADOWCAM"); + + //If not, create it + if (!scgo) + { + shadowCamGameObject = new GameObject("SEGI_SHADOWCAM"); + shadowCam = shadowCamGameObject.AddComponent(); + shadowCamGameObject.hideFlags = HideFlags.HideAndDontSave; + + + shadowCam.enabled = false; + shadowCam.depth = attachedCamera.depth - 1; + shadowCam.orthographic = true; + shadowCam.orthographicSize = shadowSpaceSize; + shadowCam.clearFlags = CameraClearFlags.SolidColor; + shadowCam.backgroundColor = new Color(0.0f, 0.0f, 0.0f, 1.0f); + shadowCam.farClipPlane = shadowSpaceSize * 2.0f * shadowSpaceDepthRatio; + shadowCam.cullingMask = giCullingMask; + shadowCam.useOcclusionCulling = false; + + shadowCamTransform = shadowCamGameObject.transform; + } + else //Otherwise, it already exists, just get it + { + shadowCamGameObject = scgo; + shadowCam = scgo.GetComponent(); + shadowCamTransform = shadowCamGameObject.transform; + } + + + + + //Create the proxy camera objects responsible for rendering the scene to voxelize the scene. If they already exist, destroy them + GameObject vcgo = GameObject.Find("SEGI_VOXEL_CAMERA"); + + if (!vcgo) { + voxelCameraGO = new GameObject("SEGI_VOXEL_CAMERA"); + voxelCameraGO.hideFlags = HideFlags.HideAndDontSave; + + voxelCamera = voxelCameraGO.AddComponent(); + voxelCamera.enabled = false; + voxelCamera.orthographic = true; + voxelCamera.orthographicSize = voxelSpaceSize * 0.5f; + voxelCamera.nearClipPlane = 0.0f; + voxelCamera.farClipPlane = voxelSpaceSize; + voxelCamera.depth = -2; + voxelCamera.renderingPath = RenderingPath.Forward; + voxelCamera.clearFlags = CameraClearFlags.Color; + voxelCamera.backgroundColor = Color.black; + voxelCamera.useOcclusionCulling = false; + } + else + { + voxelCameraGO = vcgo; + voxelCamera = vcgo.GetComponent(); + } + + GameObject lvp = GameObject.Find("SEGI_LEFT_VOXEL_VIEW"); + + if (!lvp) { + leftViewPoint = new GameObject("SEGI_LEFT_VOXEL_VIEW"); + leftViewPoint.hideFlags = HideFlags.HideAndDontSave; + } + else + { + leftViewPoint = lvp; + } + + GameObject tvp = GameObject.Find("SEGI_TOP_VOXEL_VIEW"); + + if (!tvp) { + topViewPoint = new GameObject("SEGI_TOP_VOXEL_VIEW"); + topViewPoint.hideFlags = HideFlags.HideAndDontSave; + } + else + { + topViewPoint = tvp; + } + + //Setup sun depth texture + if (sunDepthTexture) + { + sunDepthTexture.DiscardContents(); + sunDepthTexture.Release(); + DestroyImmediate(sunDepthTexture); + } + sunDepthTexture = new RenderTexture(sunShadowResolution, sunShadowResolution, 16, RenderTextureFormat.RHalf, RenderTextureReadWrite.Linear); + sunDepthTexture.wrapMode = TextureWrapMode.Clamp; + sunDepthTexture.filterMode = FilterMode.Point; + sunDepthTexture.Create(); + sunDepthTexture.hideFlags = HideFlags.HideAndDontSave; + + + + CreateVolumeTextures(); + BuildClipmaps(); + GetBlueNoiseTextures(); + + + + initChecker = new object(); + } + + void CheckSupport() + { + systemSupported.hdrTextures = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf); + systemSupported.rIntTextures = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RInt); + systemSupported.dx11 = SystemInfo.graphicsShaderLevel >= 50 && SystemInfo.supportsComputeShaders; + systemSupported.volumeTextures = SystemInfo.supports3DTextures; + + systemSupported.postShader = material.shader.isSupported; + systemSupported.sunDepthShader = sunDepthShader.isSupported; + systemSupported.voxelizationShader = voxelizationShader.isSupported; + systemSupported.tracingShader = voxelTracingShader.isSupported; + + if (!systemSupported.fullFunctionality) + { + Debug.LogWarning("SEGI is not supported on the current platform. Check for shader compile errors in SEGI/Resources"); + enabled = false; + } + } + + void OnDrawGizmosSelected() + { + if (!enabled) + return; + Color prevColor = Gizmos.color; + Gizmos.color = new Color(1.0f, 0.25f, 0.0f, 0.5f); + + float scale = clipmaps[numClipmaps - 1].localScale; + Gizmos.DrawCube(clipmaps[0].origin, new Vector3(voxelSpaceSize * scale, voxelSpaceSize * scale, voxelSpaceSize * scale)); + + Gizmos.color = new Color(1.0f, 0.0f, 0.0f, 0.1f); + + Gizmos.color = prevColor; + } + + void CleanupTexture(ref RenderTexture texture) + { + if (texture) + { + texture.DiscardContents(); + texture.Release(); + DestroyImmediate(texture); + } + } + + void CleanupTextures() + { + CleanupTexture(ref sunDepthTexture); + CleanupTexture(ref previousGIResult); + CleanupTexture(ref previousDepth); + CleanupTexture(ref integerVolume); + CleanupTexture(ref dummyVoxelTextureAAScaled); + CleanupTexture(ref dummyVoxelTextureFixed); + + if (clipmaps != null) + { + for (int i = 0; i < numClipmaps; i++) + { + if (clipmaps[i] != null) + { + clipmaps[i].CleanupTextures(); + } + } + } + + if (irradianceClipmaps != null) + { + for (int i = 0; i < numClipmaps; i++) + { + if (irradianceClipmaps[i] != null) + { + irradianceClipmaps[i].CleanupTextures(); + } + } + } + } + + void Cleanup() + { + DestroyImmediate(material); + DestroyImmediate(voxelCameraGO); + DestroyImmediate(leftViewPoint); + DestroyImmediate(topViewPoint); + DestroyImmediate(shadowCamGameObject); + initChecker = null; + CleanupTextures(); + } + + void OnEnable() + { + InitCheck(); + ResizeRenderTextures(); + + CheckSupport(); + } + + void OnDisable() + { + Cleanup(); + } + + void ResizeRenderTextures() + { + if (previousGIResult) + { + previousGIResult.DiscardContents(); + previousGIResult.Release(); + DestroyImmediate(previousGIResult); + } + + int width = attachedCamera.pixelWidth == 0 ? 2 : attachedCamera.pixelWidth; + int height = attachedCamera.pixelHeight == 0 ? 2 : attachedCamera.pixelHeight; + + previousGIResult = new RenderTexture(width, height, 0, RenderTextureFormat.ARGBHalf); + previousGIResult.wrapMode = TextureWrapMode.Clamp; + previousGIResult.filterMode = FilterMode.Bilinear; + previousGIResult.Create(); + previousGIResult.hideFlags = HideFlags.HideAndDontSave; + + if (previousDepth) + { + previousDepth.DiscardContents(); + previousDepth.Release(); + DestroyImmediate(previousDepth); + } + previousDepth = new RenderTexture(width, height, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear); + previousDepth.wrapMode = TextureWrapMode.Clamp; + previousDepth.filterMode = FilterMode.Bilinear; + previousDepth.Create(); + previousDepth.hideFlags = HideFlags.HideAndDontSave; + } + + void ResizeSunShadowBuffer() + { + + if (sunDepthTexture) + { + sunDepthTexture.DiscardContents(); + sunDepthTexture.Release(); + DestroyImmediate(sunDepthTexture); + } + sunDepthTexture = new RenderTexture(sunShadowResolution, sunShadowResolution, 16, RenderTextureFormat.RHalf, RenderTextureReadWrite.Linear); + sunDepthTexture.wrapMode = TextureWrapMode.Clamp; + sunDepthTexture.filterMode = FilterMode.Point; + sunDepthTexture.Create(); + sunDepthTexture.hideFlags = HideFlags.HideAndDontSave; + } + + void Update() + { + if (notReadyToRender) + return; + + if (previousGIResult == null) + { + ResizeRenderTextures(); + } + + if (previousGIResult.width != attachedCamera.pixelWidth || previousGIResult.height != attachedCamera.pixelHeight) + { + ResizeRenderTextures(); + } + + if ((int)sunShadowResolution != prevSunShadowResolution) + { + ResizeSunShadowBuffer(); + } + + prevSunShadowResolution = (int)sunShadowResolution; + + if (clipmaps[0].resolution != (int)voxelResolution) + { + clipmaps[0].resolution = (int)voxelResolution; + clipmaps[0].UpdateTextures(); + } + + if (dummyVoxelTextureAAScaled.width != dummyVoxelResolution) + { + ResizeDummyTexture(); + } + } + + Matrix4x4 TransformViewMatrix(Matrix4x4 mat) + { +#if UNITY_5_5_OR_NEWER + if (SystemInfo.usesReversedZBuffer) + { + mat[2, 0] = -mat[2, 0]; + mat[2, 1] = -mat[2, 1]; + mat[2, 2] = -mat[2, 2]; + mat[2, 3] = -mat[2, 3]; + // mat[3, 2] += 0.0f; + } +#endif + return mat; + } + + int SelectCascadeBinary(int c) + { + float counter = c + 0.01f; + + int result = 0; + for (int i = 1; i < numClipmaps; i++) + { + float level = Mathf.Pow(2.0f, i); + result += Mathf.CeilToInt( ((counter / level) % 1.0f) - ((level - 1.0f) / level) ); + } + + return result; + } + + void OnPreRender() + { + //Force reinitialization to make sure that everything is working properly if one of the cameras was unexpectedly destroyed + if (!voxelCamera || !shadowCam) + initChecker = null; + + InitCheck(); + + if (notReadyToRender) + return; + + if (!updateGI) + { + return; + } + + //Cache the previous active render texture to avoid issues with other Unity rendering going on + RenderTexture previousActive = RenderTexture.active; + + Shader.SetGlobalInt("SEGIVoxelAA", voxelAA ? 3 : 0); + + //Temporarily disable rendering of shadows on the directional light during voxelization pass. Cache the result to set it back to what it was after voxelization is done + LightShadows prevSunShadowSetting = LightShadows.None; + if (sun != null) + { + prevSunShadowSetting = sun.shadows; + sun.shadows = LightShadows.None; + } + + //Main voxelization work + if (renderState == RenderState.Voxelize) + { + currentClipmapIndex = SelectCascadeBinary(clipmapCounter); //Determine which clipmap to update during this frame + + Clipmap activeClipmap = clipmaps[currentClipmapIndex]; //Set the active clipmap based on which one is determined to render this frame + + //If we're not updating the base level 0 clipmap, get the previous clipmap + Clipmap prevClipmap = null; + if (currentClipmapIndex != 0) + { + prevClipmap = clipmaps[currentClipmapIndex - 1]; + } + + float clipmapShadowSize = shadowSpaceSize * activeClipmap.localScale; + float clipmapSize = voxelSpaceSize * activeClipmap.localScale; //Determine the current clipmap's size in world units based on its scale + //float voxelTexel = (1.0f * clipmapSize) / activeClipmap.resolution * 0.5f; //Calculate the size of a voxel texel in world-space units + + + + + + //Setup the voxel volume origin position + float interval = (clipmapSize) / 8.0f; //The interval at which the voxel volume will be "locked" in world-space + Vector3 origin; + if (followTransform) + { + origin = followTransform.position; + } + else + { + //GI is still flickering a bit when the scene view and the game view are opened at the same time + origin = transform.position + transform.forward * clipmapSize / 4.0f; + } + //Lock the voxel volume origin based on the interval + activeClipmap.previousOrigin = activeClipmap.origin; + activeClipmap.origin = new Vector3(Mathf.Round(origin.x / interval) * interval, Mathf.Round(origin.y / interval) * interval, Mathf.Round(origin.z / interval) * interval); + + + //Clipmap delta movement for scrolling secondary bounce irradiance volume when this clipmap has changed origin + activeClipmap.originDelta = activeClipmap.origin - activeClipmap.previousOrigin; + Shader.SetGlobalVector("SEGIVoxelSpaceOriginDelta", activeClipmap.originDelta / (voxelSpaceSize * activeClipmap.localScale)); + + + + + + + //Calculate the relative origin and overlap/size of the previous cascade as compared to the active cascade. This is used to avoid voxelizing areas that have already been voxelized by previous (smaller) cascades + Vector3 prevClipmapRelativeOrigin = Vector3.zero; + float prevClipmapOccupance = 0.0f; + if (currentClipmapIndex != 0) + { + prevClipmapRelativeOrigin = (prevClipmap.origin - activeClipmap.origin) / clipmapSize; + prevClipmapOccupance = prevClipmap.localScale / activeClipmap.localScale; + } + Shader.SetGlobalVector("SEGIClipmapOverlap", new Vector4(prevClipmapRelativeOrigin.x, prevClipmapRelativeOrigin.y, prevClipmapRelativeOrigin.z, prevClipmapOccupance)); + + //Calculate the relative origin and scale of this cascade as compared to the first (level 0) cascade. This is used during GI tracing/data lookup to ensure tracing is done in the correct space + for (int i = 1; i < numClipmaps; i++) + { + Vector3 clipPosFromMaster = Vector3.zero; + float clipScaleFromMaster = 1.0f; + + clipPosFromMaster = (clipmaps[i].origin - clipmaps[0].origin) / (voxelSpaceSize * clipmaps[i].localScale); + clipScaleFromMaster = clipmaps[0].localScale / clipmaps[i].localScale; + + Shader.SetGlobalVector("SEGIClipTransform" + i.ToString(), new Vector4(clipPosFromMaster.x, clipPosFromMaster.y, clipPosFromMaster.z, clipScaleFromMaster)); + } + + //Set the voxel camera (proxy camera used to render the scene for voxelization) parameters + voxelCamera.enabled = false; + voxelCamera.orthographic = true; + voxelCamera.orthographicSize = clipmapSize * 0.5f; + voxelCamera.nearClipPlane = 0.0f; + voxelCamera.farClipPlane = clipmapSize; + voxelCamera.depth = -2; + voxelCamera.renderingPath = RenderingPath.Forward; + voxelCamera.clearFlags = CameraClearFlags.Color; + voxelCamera.backgroundColor = Color.black; + voxelCamera.cullingMask = giCullingMask; + + //Move the voxel camera game object and other related objects to the above calculated voxel space origin + voxelCameraGO.transform.position = activeClipmap.origin - Vector3.forward * clipmapSize * 0.5f; + voxelCameraGO.transform.rotation = rotationFront; + + leftViewPoint.transform.position = activeClipmap.origin + Vector3.left * clipmapSize * 0.5f; + leftViewPoint.transform.rotation = rotationLeft; + topViewPoint.transform.position = activeClipmap.origin + Vector3.up * clipmapSize * 0.5f; + topViewPoint.transform.rotation = rotationTop; + + + + + //Set matrices needed for voxelization + //Shader.SetGlobalMatrix("WorldToGI", shadowCam.worldToCameraMatrix); + //Shader.SetGlobalMatrix("GIToWorld", shadowCam.cameraToWorldMatrix); + //Shader.SetGlobalMatrix("GIProjection", shadowCam.projectionMatrix); + //Shader.SetGlobalMatrix("GIProjectionInverse", shadowCam.projectionMatrix.inverse); + Shader.SetGlobalMatrix("WorldToCamera", attachedCamera.worldToCameraMatrix); + Shader.SetGlobalFloat("GIDepthRatio", shadowSpaceDepthRatio); + + Matrix4x4 frontViewMatrix = TransformViewMatrix(voxelCamera.transform.worldToLocalMatrix); + Matrix4x4 leftViewMatrix = TransformViewMatrix(leftViewPoint.transform.worldToLocalMatrix); + Matrix4x4 topViewMatrix = TransformViewMatrix(topViewPoint.transform.worldToLocalMatrix); + + Shader.SetGlobalMatrix("SEGIVoxelViewFront", frontViewMatrix); + Shader.SetGlobalMatrix("SEGIVoxelViewLeft", leftViewMatrix); + Shader.SetGlobalMatrix("SEGIVoxelViewTop", topViewMatrix); + Shader.SetGlobalMatrix("SEGIWorldToVoxel", voxelCamera.worldToCameraMatrix); + Shader.SetGlobalMatrix("SEGIVoxelProjection", voxelCamera.projectionMatrix); + Shader.SetGlobalMatrix("SEGIVoxelProjectionInverse", voxelCamera.projectionMatrix.inverse); + + Shader.SetGlobalMatrix("SEGIVoxelVPFront", GL.GetGPUProjectionMatrix(voxelCamera.projectionMatrix, true) * frontViewMatrix); + Shader.SetGlobalMatrix("SEGIVoxelVPLeft", GL.GetGPUProjectionMatrix(voxelCamera.projectionMatrix, true) * leftViewMatrix); + Shader.SetGlobalMatrix("SEGIVoxelVPTop", GL.GetGPUProjectionMatrix(voxelCamera.projectionMatrix, true) * topViewMatrix); + + Shader.SetGlobalMatrix("SEGIWorldToVoxel" + currentClipmapIndex.ToString(), voxelCamera.worldToCameraMatrix); + Shader.SetGlobalMatrix("SEGIVoxelProjection" + currentClipmapIndex.ToString(), voxelCamera.projectionMatrix); + + Matrix4x4 voxelToGIProjection = shadowCam.projectionMatrix * shadowCam.worldToCameraMatrix * voxelCamera.cameraToWorldMatrix; + Shader.SetGlobalMatrix("SEGIVoxelToGIProjection", voxelToGIProjection); + Shader.SetGlobalVector("SEGISunlightVector", sun ? Vector3.Normalize(sun.transform.forward) : Vector3.up); + + + //Set paramteters + Shader.SetGlobalInt("SEGIVoxelResolution", (int)voxelResolution); + + Shader.SetGlobalColor("GISunColor", sun == null ? Color.black : new Color(Mathf.Pow(sun.color.r, 2.2f), Mathf.Pow(sun.color.g, 2.2f), Mathf.Pow(sun.color.b, 2.2f), Mathf.Pow(sun.intensity, 2.2f))); + Shader.SetGlobalColor("SEGISkyColor", new Color(Mathf.Pow(skyColor.r * skyIntensity * 0.5f, 2.2f), Mathf.Pow(skyColor.g * skyIntensity * 0.5f, 2.2f), Mathf.Pow(skyColor.b * skyIntensity * 0.5f, 2.2f), Mathf.Pow(skyColor.a, 2.2f))); + Shader.SetGlobalFloat("GIGain", giGain); + Shader.SetGlobalFloat("SEGISecondaryBounceGain", infiniteBounces ? secondaryBounceGain : 0.0f); + Shader.SetGlobalFloat("SEGISoftSunlight", softSunlight); + Shader.SetGlobalInt("SEGISphericalSkylight", sphericalSkylight ? 1 : 0); + Shader.SetGlobalInt("SEGIInnerOcclusionLayers", innerOcclusionLayers); + + + + + //Render the depth texture from the sun's perspective in order to inject sunlight with shadows during voxelization + if (sun != null) + { + shadowCam.cullingMask = giCullingMask; + + Vector3 shadowCamPosition = activeClipmap.origin + Vector3.Normalize(-sun.transform.forward) * clipmapShadowSize * 0.5f * shadowSpaceDepthRatio; + + shadowCamTransform.position = shadowCamPosition; + shadowCamTransform.LookAt(activeClipmap.origin, Vector3.up); + + shadowCam.renderingPath = RenderingPath.Forward; + shadowCam.depthTextureMode |= DepthTextureMode.None; + + shadowCam.orthographicSize = clipmapShadowSize; + shadowCam.farClipPlane = clipmapShadowSize * 2.0f * shadowSpaceDepthRatio; + + //Shader.SetGlobalMatrix("WorldToGI", shadowCam.worldToCameraMatrix); + //Shader.SetGlobalMatrix("GIToWorld", shadowCam.cameraToWorldMatrix); + //Shader.SetGlobalMatrix("GIProjection", shadowCam.projectionMatrix); + //Shader.SetGlobalMatrix("GIProjectionInverse", shadowCam.projectionMatrix.inverse); + voxelToGIProjection = shadowCam.projectionMatrix * shadowCam.worldToCameraMatrix * voxelCamera.cameraToWorldMatrix; + Shader.SetGlobalMatrix("SEGIVoxelToGIProjection", voxelToGIProjection); + + + Graphics.SetRenderTarget(sunDepthTexture); + shadowCam.SetTargetBuffers(sunDepthTexture.colorBuffer, sunDepthTexture.depthBuffer); + + shadowCam.RenderWithShader(sunDepthShader, ""); + + Shader.SetGlobalTexture("SEGISunDepth", sunDepthTexture); + } + + + + + + + + //Clear the volume texture that is immediately written to in the voxelization scene shader + clearCompute.SetTexture(0, "RG0", integerVolume); + clearCompute.SetInt("Res", activeClipmap.resolution); + clearCompute.Dispatch(0, activeClipmap.resolution / 16, activeClipmap.resolution / 16, 1); + + + + + //Set irradiance "secondary bounce" texture + Shader.SetGlobalTexture("SEGICurrentIrradianceVolume", irradianceClipmaps[currentClipmapIndex].volumeTexture0); + + + Graphics.SetRandomWriteTarget(1, integerVolume); + voxelCamera.targetTexture = dummyVoxelTextureAAScaled; + voxelCamera.RenderWithShader(voxelizationShader, ""); + Graphics.ClearRandomWriteTargets(); + + + //Transfer the data from the volume integer texture to the main volume texture used for GI tracing. + transferIntsCompute.SetTexture(0, "Result", activeClipmap.volumeTexture0); + transferIntsCompute.SetTexture(0, "RG0", integerVolume); + transferIntsCompute.SetInt("VoxelAA", voxelAA ? 3 : 0); + transferIntsCompute.SetInt("Resolution", activeClipmap.resolution); + transferIntsCompute.Dispatch(0, activeClipmap.resolution / 16, activeClipmap.resolution / 16, 1); + + + + //Push current voxelization result to higher levels + for (int i = 0 + 1; i < numClipmaps; i++) + { + Clipmap sourceClipmap = clipmaps[i - 1]; + Clipmap targetClipmap = clipmaps[i]; + + + Vector3 sourceRelativeOrigin = Vector3.zero; + float sourceOccupance = 0.0f; + + sourceRelativeOrigin = (sourceClipmap.origin - targetClipmap.origin) / (targetClipmap.localScale * voxelSpaceSize); + sourceOccupance = sourceClipmap.localScale / targetClipmap.localScale; + + mipFilterCompute.SetTexture(0, "Source", sourceClipmap.volumeTexture0); + mipFilterCompute.SetTexture(0, "Destination", targetClipmap.volumeTexture0); + mipFilterCompute.SetVector("ClipmapOverlap", new Vector4(sourceRelativeOrigin.x, sourceRelativeOrigin.y, sourceRelativeOrigin.z, sourceOccupance)); + mipFilterCompute.SetInt("destinationRes", targetClipmap.resolution); + mipFilterCompute.Dispatch(0, targetClipmap.resolution / 16, targetClipmap.resolution / 16, 1); + } + + + + for (int i = 0; i < numClipmaps; i++) + { + Shader.SetGlobalTexture("SEGIVolumeLevel" + i.ToString(), clipmaps[i].volumeTexture0); + } + + + if (infiniteBounces) + { + renderState = RenderState.Bounce; + } + else + { + //Increment clipmap counter + clipmapCounter++; + if (clipmapCounter >= (int)Mathf.Pow(2.0f, numClipmaps)) + { + clipmapCounter = 0; + } + } + } + else if (renderState == RenderState.Bounce) + { + //Calculate the relative position and scale of the current clipmap as compared to the first (level 0) clipmap. Used to ensure tracing is performed in the correct space + Vector3 translateToZero = Vector3.zero; + translateToZero = (clipmaps[currentClipmapIndex].origin - clipmaps[0].origin) / (voxelSpaceSize * clipmaps[currentClipmapIndex].localScale); + float scaleToZero = 1.0f / clipmaps[currentClipmapIndex].localScale; + Shader.SetGlobalVector("SEGICurrentClipTransform", new Vector4(translateToZero.x, translateToZero.y, translateToZero.z, scaleToZero)); + + //Clear the volume texture that is immediately written to in the voxelization scene shader + clearCompute.SetTexture(0, "RG0", integerVolume); + clearCompute.SetInt("Res", clipmaps[currentClipmapIndex].resolution); + clearCompute.Dispatch(0, (int)voxelResolution / 16, (int)voxelResolution / 16, 1); + + //Only render infinite bounces for clipmaps 0, 1, and 2 + if (currentClipmapIndex <= 2) + { + Shader.SetGlobalInt("SEGISecondaryCones", secondaryCones); + Shader.SetGlobalFloat("SEGISecondaryOcclusionStrength", secondaryOcclusionStrength); + + Graphics.SetRandomWriteTarget(1, integerVolume); + voxelCamera.targetTexture = dummyVoxelTextureFixed; + voxelCamera.RenderWithShader(voxelTracingShader, ""); + Graphics.ClearRandomWriteTargets(); + + transferIntsCompute.SetTexture(1, "Result", irradianceClipmaps[currentClipmapIndex].volumeTexture0); + transferIntsCompute.SetTexture(1, "RG0", integerVolume); + transferIntsCompute.SetInt("Resolution", (int)voxelResolution); + transferIntsCompute.Dispatch(1, (int)voxelResolution / 16, (int)voxelResolution / 16, 1); + } + + //Increment clipmap counter + clipmapCounter++; + if (clipmapCounter >= (int)Mathf.Pow(2.0f, numClipmaps)) + { + clipmapCounter = 0; + } + + renderState = RenderState.Voxelize; + + } + Matrix4x4 giToVoxelProjection = voxelCamera.projectionMatrix * voxelCamera.worldToCameraMatrix * shadowCam.cameraToWorldMatrix; + Shader.SetGlobalMatrix("GIToVoxelProjection", giToVoxelProjection); + + + + RenderTexture.active = previousActive; + + //Set the sun's shadow setting back to what it was before voxelization + if (sun != null) + { + sun.shadows = prevSunShadowSetting; + } + } + + [ImageEffectOpaque] + void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (notReadyToRender) + { + Graphics.Blit(source, destination); + return; + } + + //Set parameters + Shader.SetGlobalFloat("SEGIVoxelScaleFactor", voxelScaleFactor); + + material.SetMatrix("CameraToWorld", attachedCamera.cameraToWorldMatrix); + material.SetMatrix("WorldToCamera", attachedCamera.worldToCameraMatrix); + material.SetMatrix("ProjectionMatrixInverse", attachedCamera.projectionMatrix.inverse); + material.SetMatrix("ProjectionMatrix", attachedCamera.projectionMatrix); + material.SetInt("FrameSwitch", frameCounter); + Shader.SetGlobalInt("SEGIFrameSwitch", frameCounter); + material.SetVector("CameraPosition", transform.position); + material.SetFloat("DeltaTime", Time.deltaTime); + + material.SetInt("StochasticSampling", stochasticSampling ? 1 : 0); + material.SetInt("TraceDirections", cones); + material.SetInt("TraceSteps", coneTraceSteps); + material.SetFloat("TraceLength", coneLength); + material.SetFloat("ConeSize", coneWidth); + material.SetFloat("OcclusionStrength", occlusionStrength); + material.SetFloat("OcclusionPower", occlusionPower); + material.SetFloat("ConeTraceBias", coneTraceBias); + material.SetFloat("GIGain", giGain); + material.SetFloat("NearLightGain", nearLightGain); + material.SetFloat("NearOcclusionStrength", nearOcclusionStrength); + material.SetInt("DoReflections", doReflections ? 1 : 0); + material.SetInt("HalfResolution", halfResolution ? 1 : 0); + material.SetInt("ReflectionSteps", reflectionSteps); + material.SetFloat("ReflectionOcclusionPower", reflectionOcclusionPower); + material.SetFloat("SkyReflectionIntensity", skyReflectionIntensity); + material.SetFloat("FarOcclusionStrength", farOcclusionStrength); + material.SetFloat("FarthestOcclusionStrength", farthestOcclusionStrength); + material.SetTexture("NoiseTexture", blueNoise[frameCounter]); + material.SetFloat("BlendWeight", temporalBlendWeight); + + //If Visualize Voxels is enabled, just render the voxel visualization shader pass and return + if (visualizeVoxels) + { + Graphics.Blit(source, destination, material, Pass.VisualizeVoxels); + return; + } + + //Setup temporary textures + RenderTexture gi1 = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.ARGBHalf); + RenderTexture gi2 = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.ARGBHalf); + RenderTexture reflections = null; + + //If reflections are enabled, create a temporary render buffer to hold them + if (doReflections) + { + reflections = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + } + + //Get the camera depth and normals + RenderTexture currentDepth = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear); + currentDepth.filterMode = FilterMode.Point; + RenderTexture currentNormal = RenderTexture.GetTemporary(source.width / giRenderRes, source.height / giRenderRes, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); + currentNormal.filterMode = FilterMode.Point; + + //Get the camera depth and normals + Graphics.Blit(source, currentDepth, material, Pass.GetCameraDepthTexture); + material.SetTexture("CurrentDepth", currentDepth); + Graphics.Blit(source, currentNormal, material, Pass.GetWorldNormals); + material.SetTexture("CurrentNormal", currentNormal); + + //Set the previous GI result and camera depth textures to access them in the shader + material.SetTexture("PreviousGITexture", previousGIResult); + Shader.SetGlobalTexture("PreviousGITexture", previousGIResult); + material.SetTexture("PreviousDepth", previousDepth); + + //Render diffuse GI tracing result + Graphics.Blit(source, gi2, material, Pass.DiffuseTrace); + if (doReflections) + { + //Render GI reflections result + Graphics.Blit(source, reflections, material, Pass.SpecularTrace); + material.SetTexture("Reflections", reflections); + } + + + //Perform bilateral filtering + if (useBilateralFiltering && temporalBlendWeight >= 0.99999f) + { + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi2, gi1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi1, gi2, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi2, gi1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi1, gi2, material, Pass.BilateralBlur); + } + + //If Half Resolution tracing is enabled + if (giRenderRes == 2) + { + RenderTexture.ReleaseTemporary(gi1); + + //Setup temporary textures + RenderTexture gi3 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + RenderTexture gi4 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + + //Prepare the half-resolution diffuse GI result to be bilaterally upsampled + gi2.filterMode = FilterMode.Point; + Graphics.Blit(gi2, gi4); + + RenderTexture.ReleaseTemporary(gi2); + + gi4.filterMode = FilterMode.Point; + gi3.filterMode = FilterMode.Point; + + + //Perform bilateral upsampling on half-resolution diffuse GI result + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi4, gi3, material, Pass.BilateralUpsample); + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + + + + //Perform a bilateral blur to be applied in newly revealed areas that are still noisy due to not having previous data blended with it + RenderTexture blur0 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + RenderTexture blur1 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi3, blur1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(blur1, blur0, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(0.0f, 2.0f)); + Graphics.Blit(blur0, blur1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(2.0f, 0.0f)); + Graphics.Blit(blur1, blur0, material, Pass.BilateralBlur); + + material.SetTexture("BlurredGI", blur0); + + + //Perform temporal reprojection and blending + if (temporalBlendWeight < 1.0f) + { + Graphics.Blit(gi3, gi4); + Graphics.Blit(gi4, gi3, material, Pass.TemporalBlend); + Graphics.Blit(gi3, previousGIResult); + Graphics.Blit(source, previousDepth, material, Pass.GetCameraDepthTexture); + + + //Perform bilateral filtering on temporally blended result + if (useBilateralFiltering) + { + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi3, gi4, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi4, gi3, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi3, gi4, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi4, gi3, material, Pass.BilateralBlur); + } + } + + + + + + //Set the result to be accessed in the shader + material.SetTexture("GITexture", gi3); + + //Actually apply the GI to the scene using gbuffer data + Graphics.Blit(source, destination, material, visualizeGI ? Pass.VisualizeGI : Pass.BlendWithScene); + + //Release temporary textures + RenderTexture.ReleaseTemporary(blur0); + RenderTexture.ReleaseTemporary(blur1); + RenderTexture.ReleaseTemporary(gi3); + RenderTexture.ReleaseTemporary(gi4); + } + else //If Half Resolution tracing is disabled + { + if (temporalBlendWeight < 1.0f) + { + //Perform a bilateral blur to be applied in newly revealed areas that are still noisy due to not having previous data blended with it + RenderTexture blur0 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + RenderTexture blur1 = RenderTexture.GetTemporary(source.width, source.height, 0, RenderTextureFormat.ARGBHalf); + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi2, blur1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(blur1, blur0, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(0.0f, 2.0f)); + Graphics.Blit(blur0, blur1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(2.0f, 0.0f)); + Graphics.Blit(blur1, blur0, material, Pass.BilateralBlur); + + material.SetTexture("BlurredGI", blur0); + + + + + //Perform temporal reprojection and blending + Graphics.Blit(gi2, gi1, material, Pass.TemporalBlend); + Graphics.Blit(gi1, previousGIResult); + Graphics.Blit(source, previousDepth, material, Pass.GetCameraDepthTexture); + + + + //Perform bilateral filtering on temporally blended result + if (useBilateralFiltering) + { + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi1, gi2, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi2, gi1, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(0.0f, 1.0f)); + Graphics.Blit(gi1, gi2, material, Pass.BilateralBlur); + + material.SetVector("Kernel", new Vector2(1.0f, 0.0f)); + Graphics.Blit(gi2, gi1, material, Pass.BilateralBlur); + } + + + + RenderTexture.ReleaseTemporary(blur0); + RenderTexture.ReleaseTemporary(blur1); + } + + //Actually apply the GI to the scene using gbuffer data + material.SetTexture("GITexture", temporalBlendWeight < 1.0f ? gi1 : gi2); + Graphics.Blit(source, destination, material, visualizeGI ? Pass.VisualizeGI : Pass.BlendWithScene); + + //Release temporary textures + RenderTexture.ReleaseTemporary(gi1); + RenderTexture.ReleaseTemporary(gi2); + } + + //Release temporary textures + RenderTexture.ReleaseTemporary(currentDepth); + RenderTexture.ReleaseTemporary(currentNormal); + + if (visualizeSunDepthTexture) + Graphics.Blit(sunDepthTexture, destination); + + //Release the temporary reflections result texture + if (doReflections) + { + RenderTexture.ReleaseTemporary(reflections); + } + + //Set matrices/vectors for use during temporal reprojection + material.SetMatrix("ProjectionPrev", attachedCamera.projectionMatrix); + material.SetMatrix("ProjectionPrevInverse", attachedCamera.projectionMatrix.inverse); + material.SetMatrix("WorldToCameraPrev", attachedCamera.worldToCameraMatrix); + material.SetMatrix("CameraToWorldPrev", attachedCamera.cameraToWorldMatrix); + material.SetVector("CameraPositionPrev", transform.position); + + //Advance the frame counter + frameCounter = (frameCounter + 1) % (64); + } +} diff --git a/Assets/SEGI/SEGICascaded.cs.meta b/Assets/SEGI/SEGICascaded.cs.meta new file mode 100644 index 0000000..da7646b --- /dev/null +++ b/Assets/SEGI/SEGICascaded.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3f6545096e58f2445a95f9ff831d18fd +timeCreated: 1502923567 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: dbb032076c5c83c41bba0c204a2a970a, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/SEGICascadedPreset.cs b/Assets/SEGI/SEGICascadedPreset.cs new file mode 100644 index 0000000..0dbaeae --- /dev/null +++ b/Assets/SEGI/SEGICascadedPreset.cs @@ -0,0 +1,58 @@ +using UnityEngine; +using System.Collections; + +public class SEGICascadedPreset : ScriptableObject +{ + public SEGICascaded.VoxelResolution voxelResolution = SEGICascaded.VoxelResolution.high; + public bool voxelAA = false; + [Range(0, 2)] + public int innerOcclusionLayers = 1; + public bool infiniteBounces = true; + + [Range(0.01f, 1.0f)] + public float temporalBlendWeight = 0.15f; + public bool useBilateralFiltering = true; + public bool halfResolution = true; + public bool stochasticSampling = true; + public bool doReflections = true; + + [Range(1, 128)] + public int cones = 13; + [Range(1, 32)] + public int coneTraceSteps = 8; + [Range(0.1f, 2.0f)] + public float coneLength = 1.0f; + [Range(0.5f, 6.0f)] + public float coneWidth = 6.0f; + [Range(0.0f, 4.0f)] + public float coneTraceBias = 0.63f; + [Range(0.0f, 4.0f)] + public float occlusionStrength = 1.0f; + [Range(0.0f, 4.0f)] + public float nearOcclusionStrength = 0.0f; + [Range(0.001f, 4.0f)] + public float occlusionPower = 1.0f; + [Range(0.0f, 4.0f)] + public float nearLightGain = 1.0f; + [Range(0.0f, 4.0f)] + public float giGain = 1.0f; + [Range(0.0f, 2.0f)] + public float secondaryBounceGain = 1.0f; + [Range(12, 128)] + public int reflectionSteps = 64; + [Range(0.001f, 4.0f)] + public float reflectionOcclusionPower = 1.0f; + [Range(0.0f, 1.0f)] + public float skyReflectionIntensity = 1.0f; + public bool gaussianMipFilter = false; + + [Range(0.1f, 4.0f)] + public float farOcclusionStrength = 1.0f; + [Range(0.1f, 4.0f)] + public float farthestOcclusionStrength = 1.0f; + + [Range(3, 16)] + public int secondaryCones = 6; + [Range(0.1f, 4.0f)] + public float secondaryOcclusionStrength = 1.0f; +} diff --git a/Assets/SEGI/SEGICascadedPreset.cs.meta b/Assets/SEGI/SEGICascadedPreset.cs.meta new file mode 100644 index 0000000..809b614 --- /dev/null +++ b/Assets/SEGI/SEGICascadedPreset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 195d4ee8e5f057f4590c043b132f9c86 +timeCreated: 1501556281 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/SEGIPreset.cs b/Assets/SEGI/SEGIPreset.cs new file mode 100644 index 0000000..e93900c --- /dev/null +++ b/Assets/SEGI/SEGIPreset.cs @@ -0,0 +1,58 @@ +using UnityEngine; +using System.Collections; + +public class SEGIPreset : ScriptableObject +{ + public SEGI.VoxelResolution voxelResolution = SEGI.VoxelResolution.high; + public bool voxelAA = false; + [Range(0, 2)] + public int innerOcclusionLayers = 1; + public bool infiniteBounces = true; + + [Range(0.01f, 1.0f)] + public float temporalBlendWeight = 0.15f; + public bool useBilateralFiltering = true; + public bool halfResolution = true; + public bool stochasticSampling = true; + public bool doReflections = true; + + [Range(1, 128)] + public int cones = 13; + [Range(1, 32)] + public int coneTraceSteps = 8; + [Range(0.1f, 2.0f)] + public float coneLength = 1.0f; + [Range(0.5f, 6.0f)] + public float coneWidth = 6.0f; + [Range(0.0f, 4.0f)] + public float coneTraceBias = 0.63f; + [Range(0.0f, 4.0f)] + public float occlusionStrength = 1.0f; + [Range(0.0f, 4.0f)] + public float nearOcclusionStrength = 0.0f; + [Range(0.001f, 4.0f)] + public float occlusionPower = 1.0f; + [Range(0.0f, 4.0f)] + public float nearLightGain = 1.0f; + [Range(0.0f, 4.0f)] + public float giGain = 1.0f; + [Range(0.0f, 2.0f)] + public float secondaryBounceGain = 1.0f; + [Range(12, 128)] + public int reflectionSteps = 64; + [Range(0.001f, 4.0f)] + public float reflectionOcclusionPower = 1.0f; + [Range(0.0f, 1.0f)] + public float skyReflectionIntensity = 1.0f; + public bool gaussianMipFilter = false; + + [Range(0.1f, 4.0f)] + public float farOcclusionStrength = 1.0f; + [Range(0.1f, 4.0f)] + public float farthestOcclusionStrength = 1.0f; + + [Range(3, 16)] + public int secondaryCones = 6; + [Range(0.1f, 4.0f)] + public float secondaryOcclusionStrength = 1.0f; +} diff --git a/Assets/SEGI/SEGIPreset.cs.meta b/Assets/SEGI/SEGIPreset.cs.meta new file mode 100644 index 0000000..56ec573 --- /dev/null +++ b/Assets/SEGI/SEGIPreset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c7780f824b3fbed498c366c0f53ccef9 +timeCreated: 1502920421 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEGI/User Guide.pdf b/Assets/SEGI/User Guide.pdf new file mode 100644 index 0000000..061a0a4 Binary files /dev/null and b/Assets/SEGI/User Guide.pdf differ diff --git a/Assets/SEGI/User Guide.pdf.meta b/Assets/SEGI/User Guide.pdf.meta new file mode 100644 index 0000000..1c288f3 --- /dev/null +++ b/Assets/SEGI/User Guide.pdf.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0dd481c6f681dd4b93c76ecea4252ba +timeCreated: 1465554248 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingArrival.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingArrival.cs index 865321e..7775a5b 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingArrival.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingArrival.cs @@ -33,7 +33,7 @@ namespace Fie.Enemies.HoovesRaces.Changeling gameCharacter.isEnableCollider = false; gameCharacter.isEnableGravity = true; gameCharacter.isEnableAutoFlip = false; - gameCharacter.skeletonUtility.skeletonRenderer.meshRenderer.enabled = false; + gameCharacter.skeletonUtility.skeletonRenderer.GetComponent().enabled = false; } } @@ -44,7 +44,7 @@ namespace Fie.Enemies.HoovesRaces.Changeling gameCharacter.isEnableCollider = true; gameCharacter.isEnableGravity = true; gameCharacter.isEnableAutoFlip = true; - gameCharacter.skeletonUtility.skeletonRenderer.meshRenderer.enabled = true; + gameCharacter.skeletonUtility.skeletonRenderer.GetComponent().enabled = true; if (_arriveEffect != null) { _arriveEffect.StopEffect(); diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingBackstep.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingBackstep.cs index 87116c1..db60f43 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingBackstep.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingBackstep.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.Changeling { @@ -50,21 +51,21 @@ namespace Fie.Enemies.HoovesRaces.Changeling TrackEntry trackEntry = changeling.animationManager.SetAnimation(changeling.getBackStepAnimationID(), isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - Vector3 moveForce = changeling.flipDirectionVector * e.Float; + Vector3 moveForce = changeling.flipDirectionVector * trackIndex.Float; changeling.setMoveForce(moveForce, 0f, useRound: false); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - changeling.isEnableCollider = (e.Int < 1); - changeling.damageSystem.isEnableStaggerImmunity = (e.Int >= 1); + changeling.isEnableCollider = (trackIndex.Int < 1); + changeling.damageSystem.isEnableStaggerImmunity = (trackIndex.Int >= 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingMelee.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingMelee.cs index c6fdad3..88a9ea2 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingMelee.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingMelee.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.Changeling { @@ -53,9 +54,9 @@ namespace Fie.Enemies.HoovesRaces.Changeling TrackEntry trackEntry = changeling.animationManager.SetAnimation(11, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = changeling.flipDirectionVector; Transform lockonEnemyTransform = changeling.detector.getLockonEnemyTransform(); @@ -68,16 +69,16 @@ namespace Fie.Enemies.HoovesRaces.Changeling a = vector; vector.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); changeling.resetMoveForce(); changeling.setMoveForce(vector2, 0f, useRound: false); changeling.setFlipByVector(vector2); } - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(changeling.mouthTransform, changeling.flipDirectionVector, null, changeling); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingShoot.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingShoot.cs index 09ca2be..82aae7d 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingShoot.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingShoot.cs @@ -38,9 +38,9 @@ namespace Fie.Enemies.HoovesRaces.Changeling if (trackEntry != null) { autoFlipToEnemy(changeling); - trackEntry.Event += delegate(AnimationState state, int trackIndex, Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(changeling.hornTransform, changeling.flipDirectionVector, changeling.detector.getLockonEnemyTransform(isCenter: true), changeling); } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingVortex.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingVortex.cs index c5a28b4..c6cf407 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingVortex.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/Changeling/FieStateMachineChangelingVortex.cs @@ -48,13 +48,13 @@ namespace Fie.Enemies.HoovesRaces.Changeling TrackEntry trackEntry = changeling.animationManager.SetAnimation(14, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(AnimationState state, int trackIndex, Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(changeling.transform, changeling.flipDirectionVector, null, changeling); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaCharge.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaCharge.cs index 62d2853..a79e9de 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaCharge.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaCharge.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.ChangelingAlpha { @@ -31,9 +32,9 @@ namespace Fie.Enemies.HoovesRaces.ChangelingAlpha TrackEntry trackEntry = changelingAlpha.animationManager.SetAnimation(13, isLoop: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(changelingAlpha.centerTransform, changelingAlpha.flipDirectionVector); FieManagerBehaviour.I.EmitObject(changelingAlpha.centerTransform, changelingAlpha.flipDirectionVector, null, changelingAlpha); diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaChargeFinish.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaChargeFinish.cs index 66619bc..504ed51 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaChargeFinish.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaChargeFinish.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.ChangelingAlpha { @@ -72,13 +73,13 @@ namespace Fie.Enemies.HoovesRaces.ChangelingAlpha TrackEntry trackEntry = changelingAlpha.animationManager.SetAnimation(14, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(changelingAlpha.centerTransform, changelingAlpha.flipDirectionVector, null, changelingAlpha); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = changelingAlpha.flipDirectionVector; Transform lockonEnemyTransform = changelingAlpha.detector.getLockonEnemyTransform(); @@ -90,20 +91,20 @@ namespace Fie.Enemies.HoovesRaces.ChangelingAlpha a = vector; a.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); changelingAlpha.resetMoveForce(); changelingAlpha.setMoveForce(vector2, 0f, useRound: false); - if (e.Float > 0f) + if (trackIndex.Float > 0f) { changelingAlpha.setFlipByVector(vector2); } } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShoot.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShoot.cs index e6e37c2..f59fe3d 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShoot.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShoot.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.ChangelingAlpha { @@ -39,20 +40,20 @@ namespace Fie.Enemies.HoovesRaces.ChangelingAlpha if (trackEntry != null) { autoFlipToEnemy(changelingAlpha); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(changelingAlpha.hornTransform, changelingAlpha.flipDirectionVector, changelingAlpha.detector.getLockonEnemyTransform(isCenter: true), changelingAlpha); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 flipDirectionVector = changelingAlpha.flipDirectionVector; - Vector3 moveForce = flipDirectionVector * e.Float; + Vector3 moveForce = flipDirectionVector * trackIndex.Float; changelingAlpha.resetMoveForce(); changelingAlpha.setMoveForce(moveForce, 0f, useRound: false); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShout.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShout.cs index 3eaa129..a62c776 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShout.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaShout.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.ChangelingAlpha { @@ -46,9 +47,9 @@ namespace Fie.Enemies.HoovesRaces.ChangelingAlpha _nextState = typeof(FieStateMachineCommonIdle); _isEnd = true; }; - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _nextState = typeof(FieStateMachineCommonIdle); _isEnd = true; diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaZeroDistanceCharge.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaZeroDistanceCharge.cs index 5289448..3b00692 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaZeroDistanceCharge.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/ChangelingAlpha/FieStateMachineChangelingAlphaZeroDistanceCharge.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.ChangelingAlpha { @@ -72,13 +73,13 @@ namespace Fie.Enemies.HoovesRaces.ChangelingAlpha TrackEntry trackEntry = changelingAlpha.animationManager.SetAnimation(15, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(changelingAlpha.centerTransform, changelingAlpha.flipDirectionVector, null, changelingAlpha); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = changelingAlpha.flipDirectionVector; Transform lockonEnemyTransform = changelingAlpha.detector.getLockonEnemyTransform(); @@ -90,20 +91,20 @@ namespace Fie.Enemies.HoovesRaces.ChangelingAlpha a = vector; a.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); changelingAlpha.resetMoveForce(); changelingAlpha.setMoveForce(vector2, 0f, useRound: false); - if (e.Float > 0f) + if (trackIndex.Float > 0f) { changelingAlpha.setFlipByVector(vector2); } } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieEnemiesHoovesRaces.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieEnemiesHoovesRaces.cs index f3111d4..806a3ae 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieEnemiesHoovesRaces.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieEnemiesHoovesRaces.cs @@ -1,5 +1,6 @@ using Spine; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces { @@ -60,9 +61,9 @@ namespace Fie.Enemies.HoovesRaces { if (entry != null) { - entry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + entry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "footstep" && base.currentFootstepMaterial != null) + if (trackIndex.Data.Name == "footstep" && base.currentFootstepMaterial != null) { base.currentFootstepMaterial.playFootstepAudio(base.footstepPlayer); } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesRift.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesRift.cs index f1a4f46..380b288 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesRift.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesRift.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces { @@ -52,9 +53,9 @@ namespace Fie.Enemies.HoovesRaces trackEntry.mixDuration = 0f; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStagger.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStagger.cs index e4e6306..1741c66 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStagger.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStagger.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces { @@ -46,9 +47,9 @@ namespace Fie.Enemies.HoovesRaces trackEntry.mixDuration = 0f; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStaggerFall.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStaggerFall.cs index c359d8d..d79bd45 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStaggerFall.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/FieStateMachineEnemiesHoovesRacesStaggerFall.cs @@ -41,9 +41,9 @@ namespace Fie.Enemies.HoovesRaces if (fieEnemiesHoovesRaces.groundState == FieObjectGroundState.Grounding) { TrackEntry trackEntry = fieEnemiesHoovesRaces.animationManager.SetAnimation(6, isLoop: false, isForceSet: true); - trackEntry.Event += delegate(AnimationState state, int trackIndex, Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/Flightling/FieStateMachineFlightlingShoot.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/Flightling/FieStateMachineFlightlingShoot.cs index ce61cfb..a11bb53 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/Flightling/FieStateMachineFlightlingShoot.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/Flightling/FieStateMachineFlightlingShoot.cs @@ -51,9 +51,9 @@ namespace Fie.Enemies.HoovesRaces.Flightling if (trackEntry != null) { autoFlipToEnemy(flightling); - trackEntry.Event += delegate(AnimationState state, int trackIndex, Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(flightling.hornTransform, flightling.flipDirectionVector, flightling.detector.getLockonEnemyTransform(isCenter: true), flightling); } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineEnemiesQueenChrysalisStagger.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineEnemiesQueenChrysalisStagger.cs index 8c1705a..ee6a504 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineEnemiesQueenChrysalisStagger.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineEnemiesQueenChrysalisStagger.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -45,9 +46,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis trackEntry.mixDuration = 0f; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadAttacking.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadAttacking.cs index 7552ef0..ba3e984 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadAttacking.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadAttacking.cs @@ -6,6 +6,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -45,9 +46,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis chrysalis.SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_1), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_2)); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { InitializeAttackingTweener(chrysalis); _fireState = AttackingState.AIR_RAID_ATTACKING_FINISHED; diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadPrepare.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadPrepare.cs index f2b0c7b..93df120 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadPrepare.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisAirRiadPrepare.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -55,13 +56,13 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis _nextState = typeof(FieStateMachineQueenChrysalisAirRiadAttacking); _isEnd = true; }; - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "activate") + if (trackIndex.Data.Name == "activate") { _concentrationObject = FieManagerBehaviour.I.EmitObject(chrysalis.leftFrontHoofTransform, chrysalis.flipDirectionVector); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { FieManagerBehaviour.I.EmitObject(chrysalis.leftFrontHoofTransform, chrysalis.flipDirectionVector); if (_concentrationObject != null) diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCallingMinion.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCallingMinion.cs index 25c187a..1e171fc 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCallingMinion.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCallingMinion.cs @@ -9,6 +9,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -78,9 +79,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis if (trackEntry != null) { chrysalis.SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_6), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_7)); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(chrysalis.leftFrontHoofTransform, Vector3.zero, null); FieGameCharacter[] currentMinions = chrysalis.currentMinions; diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCrucible.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCrucible.cs index c5a9456..6140ca0 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCrucible.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisCrucible.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -73,9 +74,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis _hornEffect = FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, Vector3.zero, null); if (trackEntry2 != null) { - trackEntry2.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry2.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieEmitObjectQueenChrysalisCrucibleCircle fieEmitObjectQueenChrysalisCrucibleCircle = FieManagerBehaviour.I.EmitObject(chrysalis.leftFrontHoofTransform, Vector3.forward, null, chrysalis); if (fieEmitObjectQueenChrysalisCrucibleCircle != null) @@ -88,7 +89,7 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis _hornEffect.Kill(); } } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _attackingState = AttackState.FLYBY; } @@ -114,9 +115,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis TrackEntry trackEntry = chrysalis.animationManager.SetAnimation(15, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { foreach (Vector3 item in _hittedPosition) { @@ -124,14 +125,14 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis fieEmitObjectQueenChrysalisCrucibleBurst.transform.position = item; } } - if (e.Data.Name == "activate") + if (trackIndex.Data.Name == "activate") { FieManagerBehaviour.I.EmitObject(chrysalis.leftFrontHoofTransform, Vector3.zero, null, chrysalis); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { chrysalis.isEnableGravity = false; - Vector3 moveForce = Vector3.up * e.Float; + Vector3 moveForce = Vector3.up * trackIndex.Float; chrysalis.setMoveForce(moveForce, 0.5f); } }; diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisDoubleSlash.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisDoubleSlash.cs index 74dacb9..b60c508 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisDoubleSlash.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisDoubleSlash.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -81,9 +82,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis if (trackEntry != null) { _hornEffect = FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, Vector3.zero, null); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = chrysalis.flipDirectionVector; Transform lockonEnemyTransform = chrysalis.detector.getLockonEnemyTransform(); @@ -96,12 +97,12 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis a = vector; vector.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); chrysalis.resetMoveForce(); chrysalis.setMoveForce(vector2, 0f, useRound: false); chrysalis.setFlipByVector(vector2); } - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { if (_attackCount == 0) { @@ -113,7 +114,7 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis } _attackCount++; } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { if ((bool)_hornEffect) { diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisHormingShot.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisHormingShot.cs index 6261a7f..0dd0617 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisHormingShot.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisHormingShot.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -60,22 +61,22 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis if (trackEntry != null) { autoFlipToEnemy(chrysalis); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, chrysalis.flipDirectionVector, chrysalis.detector.getLockonEnemyTransform(isCenter: true), chrysalis); FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, Vector3.zero, null); chrysalis._isEffectivePull = false; } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 flipDirectionVector = chrysalis.flipDirectionVector; - Vector3 moveForce = flipDirectionVector * e.Float; + Vector3 moveForce = flipDirectionVector * trackIndex.Float; chrysalis.resetMoveForce(); chrysalis.setMoveForce(moveForce, 0f, useRound: false); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { if ((bool)_hornEffect) { diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteFailed.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteFailed.cs index 0767df2..4e2576c 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteFailed.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteFailed.cs @@ -39,9 +39,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis _nextState = typeof(FieStateMachineCommonIdle); _isEnd = true; }; - trackEntry.Event += delegate(AnimationState state, int trackIndex, Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _nextState = typeof(FieStateMachineCommonIdle); _isEnd = true; diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgnitePrepare.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgnitePrepare.cs index 4b07bb6..d692bd3 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgnitePrepare.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgnitePrepare.cs @@ -6,6 +6,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -62,9 +63,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis } if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "activate") + if (trackIndex.Data.Name == "activate") { FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, chrysalis.flipDirectionVector); if (_concentrationEffect != null) diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteStart.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteStart.cs index b7611f1..401b148 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteStart.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteStart.cs @@ -6,6 +6,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -57,9 +58,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis chrysalis.SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_3), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_4)); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = chrysalis.flipDirectionVector; Transform lockonEnemyTransform = chrysalis.detector.getLockonEnemyTransform(); @@ -72,12 +73,12 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis a = vector; vector.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); chrysalis.resetMoveForce(); chrysalis.setMoveForce(vector2, 0f, useRound: false); chrysalis.setFlipByVector(vector2); } - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { _grabbingCollisionObject = FieManagerBehaviour.I.EmitObject(chrysalis.centerTransform, chrysalis.flipDirectionVector, null, chrysalis); if (_grabbingCollisionObject != null) diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteSucceed.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteSucceed.cs index b48328a..f4c18f2 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteSucceed.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisIgniteSucceed.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -42,14 +43,14 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis _nextState = typeof(FieStateMachineCommonIdle); _isEnd = true; }; - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - Vector3 moveForce = chrysalis.flipDirectionVector * e.Float; + Vector3 moveForce = chrysalis.flipDirectionVector * trackIndex.Float; chrysalis.setMoveForce(moveForce, 0f, useRound: false); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _nextState = typeof(FieStateMachineCommonIdle); _isEnd = true; diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisMeteorShowerPrepare.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisMeteorShowerPrepare.cs index f9a95ba..91a7b06 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisMeteorShowerPrepare.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisMeteorShowerPrepare.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -55,16 +56,16 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis _nextState = typeof(FieStateMachineQueenChrysalisMeteorShowerAttacking); _isEnd = true; }; - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - Vector3 moveForce = Vector3.up * e.Float; + Vector3 moveForce = Vector3.up * trackIndex.Float; chrysalis.isEnableGravity = false; chrysalis.resetMoveForce(); chrysalis.setMoveForce(moveForce, 0.5f); } - if (e.Data.Name == "activate") + if (trackIndex.Data.Name == "activate") { if (_concentrationObject != null) { @@ -74,7 +75,7 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis chrysalis.emotionController.SetEmoteAnimation(30, isForceSet: true); chrysalis._isEffectivePull = false; } - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, chrysalis.flipDirectionVector); chrysalis.SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_1), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_USING_ABILITY_2)); diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisPenetrateShot.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisPenetrateShot.cs index bcd2c6f..9ec193d 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisPenetrateShot.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisPenetrateShot.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -50,9 +51,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis if (trackEntry != null) { autoFlipToEnemy(chrysalis); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { Transform lockonEnemyTransform = chrysalis.detector.getLockonEnemyTransform(isCenter: true); FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, chrysalis.flipDirectionVector, lockonEnemyTransform, chrysalis); @@ -63,14 +64,14 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis } FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, vector.normalized, null); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 flipDirectionVector = chrysalis.flipDirectionVector; - Vector3 moveForce = flipDirectionVector * e.Float; + Vector3 moveForce = flipDirectionVector * trackIndex.Float; chrysalis.resetMoveForce(); chrysalis.setMoveForce(moveForce, 0f, useRound: false); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { if ((bool)_hornEffect) { diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisRift.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisRift.cs index 2d9fd84..e55d696 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisRift.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisRift.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -52,9 +53,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis trackEntry.mixDuration = 0f; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisStaggerFall.cs b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisStaggerFall.cs index c68f53a..521003d 100644 --- a/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisStaggerFall.cs +++ b/Assets/Scripts/Fie/Enemies/HoovesRaces/QueenChrysalis/FieStateMachineQueenChrysalisStaggerFall.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { @@ -50,9 +51,9 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis if (chrysalis.groundState == FieObjectGroundState.Grounding) { TrackEntry trackEntry = chrysalis.animationManager.SetAnimation(6, isLoop: false, isForceSet: true); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "activate") + if (trackIndex.Data.Name == "activate") { FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, chrysalis.flipDirectionVector, null, chrysalis); _hornEffect = FieManagerBehaviour.I.EmitObject(chrysalis.hornTransform, Vector3.zero, null); @@ -61,7 +62,7 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis chrysalis.emotionController.SetEmoteAnimation(30, isForceSet: true); chrysalis.isSpeakable = true; } - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieEmitObjectQueenChrysalisStaggerRecoveringBurst fieEmitObjectQueenChrysalisStaggerRecoveringBurst = FieManagerBehaviour.I.EmitObject(chrysalis.centerTransform, chrysalis.flipDirectionVector, null, chrysalis); FieManagerBehaviour.I.gameCamera.setWiggler(0.6f, 15, new Vector3(0.2f, 0.5f)); @@ -71,7 +72,7 @@ namespace Fie.Enemies.HoovesRaces.QueenChrysalis _hornEffect.Kill(); } } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Object/FieSkeletonAnimationController.cs b/Assets/Scripts/Fie/Object/FieSkeletonAnimationController.cs index b34e7be..642d267 100644 --- a/Assets/Scripts/Fie/Object/FieSkeletonAnimationController.cs +++ b/Assets/Scripts/Fie/Object/FieSkeletonAnimationController.cs @@ -28,7 +28,7 @@ namespace Fie.Object { if (_skeletonUtility != null) { - _skeletonUtility.skeletonAnimation.timeScale = timeScale; + ((SkeletonAnimation)_skeletonUtility.skeletonAnimation).timeScale = timeScale; } } @@ -82,11 +82,11 @@ namespace Fie.Object { return null; } - if (_skeletonUtility.skeletonAnimation.state == null) + if (((SkeletonAnimation)_skeletonUtility.skeletonAnimation).state == null) { return null; } - TrackEntry trackEntry = _skeletonUtility.skeletonAnimation.state.SetAnimation(animation.trackID, animation.animationName, isLoop); + TrackEntry trackEntry = ((SkeletonAnimation)_skeletonUtility.skeletonAnimation).state.SetAnimation(animation.trackID, animation.animationName, isLoop); if (trackEntry == null) { return null; @@ -105,7 +105,7 @@ namespace Fie.Object { if (_currentAnimationEntries.ContainsKey(trackID) && _currentAnimationEntries[trackID] != null) { - return _currentAnimationEntries[trackID].EndTime <= _currentAnimationEntries[trackID].Time; + return _currentAnimationEntries[trackID].animationEnd <= _currentAnimationEntries[trackID].AnimationTime; } return true; } @@ -143,15 +143,15 @@ namespace Fie.Object { if (animationTrack >= 0) { - TrackEntry current = _skeletonUtility.skeletonAnimation.state.GetCurrent(animationTrack); + TrackEntry current = ((SkeletonAnimation)_skeletonUtility.skeletonAnimation).state.GetCurrent(animationTrack); if (current != null) { - _skeletonUtility.skeletonAnimation.state.ClearTrack(animationTrack); + ((SkeletonAnimation)_skeletonUtility.skeletonAnimation).state.ClearTrack(animationTrack); } } else { - _skeletonUtility.skeletonAnimation.state.ClearTracks(); + ((SkeletonAnimation)_skeletonUtility.skeletonAnimation).state.ClearTracks(); } if (_currentAnimationEntries.ContainsKey(animationTrack)) { @@ -161,11 +161,11 @@ namespace Fie.Object public string GetCurrentAnimationName(int animationTrack) { - if (_skeletonUtility.skeletonAnimation.state == null) + if (((SkeletonAnimation)_skeletonUtility.skeletonAnimation).state == null) { return string.Empty; } - TrackEntry current = _skeletonUtility.skeletonAnimation.state.GetCurrent(animationTrack); + TrackEntry current = ((SkeletonAnimation)_skeletonUtility.skeletonAnimation).state.GetCurrent(animationTrack); if (current == null) { return string.Empty; diff --git a/Assets/Scripts/Fie/PlayMaker/FieResultActionForPlaymaker.cs b/Assets/Scripts/Fie/PlayMaker/FieResultActionForPlaymaker.cs index a0aecdf..2d0e7f3 100644 --- a/Assets/Scripts/Fie/PlayMaker/FieResultActionForPlaymaker.cs +++ b/Assets/Scripts/Fie/PlayMaker/FieResultActionForPlaymaker.cs @@ -8,7 +8,7 @@ namespace Fie.PlayMaker { public override void OnEnter() { - SceneManager.LoadScene(0, LoadSceneMode.Single); + SceneManager.LoadScene(0); Finish(); } } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackBackstep.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackBackstep.cs index ec4173d..6eea1ce 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackBackstep.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackBackstep.cs @@ -2,6 +2,7 @@ using Fie.Object; using Spine; using System; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -46,18 +47,18 @@ namespace Fie.Ponies.Applejack trackEntry = applejack.animationManager.SetAnimation(36, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - Vector3 vector = applejack.flipDirectionVector * e.Float; + Vector3 vector = applejack.flipDirectionVector * trackIndex.Float; if (applejack.externalInputVector != Vector3.zero) { vector = applejack.externalInputVector; vector.z = vector.y; vector.y = 0f; vector.Normalize(); - vector *= 0f - e.Float; + vector *= 0f - trackIndex.Float; vector.z *= 0.7f; } applejack.setFlipByVector(-vector); @@ -65,13 +66,13 @@ namespace Fie.Ponies.Applejack applejack.setMoveForce(vector, 0f, useRound: false); applejack.applySideEffectOfStep(); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - applejack.isEnableCollider = (e.Int < 1); + applejack.isEnableCollider = (trackIndex.Int < 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackCharge.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackCharge.cs index 8d2484e..e68a5c6 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackCharge.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackCharge.cs @@ -3,6 +3,7 @@ using Fie.Object; using Spine; using System; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -51,18 +52,18 @@ namespace Fie.Ponies.Applejack trackEntry = applejack.animationManager.SetAnimation(40, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - Vector3 vector = applejack.flipDirectionVector * e.Float; + Vector3 vector = applejack.flipDirectionVector * trackIndex.Float; if (applejack.externalInputVector != Vector3.zero) { vector = applejack.externalInputVector; vector.z = vector.y; vector.y = 0f; vector.Normalize(); - vector *= e.Float; + vector *= trackIndex.Float; vector.z *= 0.7f; } applejack.setFlipByVector(vector); @@ -72,13 +73,13 @@ namespace Fie.Ponies.Applejack FieManagerBehaviour.I.EmitObject(applejack.centerTransform, applejack.flipDirectionVector, null, applejack); FieManagerBehaviour.I.EmitObject(applejack.leftFrontHoofTransform, applejack.flipDirectionVector); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - applejack.isEnableCollider = (e.Int < 1); + applejack.isEnableCollider = (trackIndex.Int < 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAir.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAir.cs index 78fcc01..880bee8 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAir.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAir.cs @@ -3,6 +3,7 @@ using Fie.Object; using Spine; using System; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -62,9 +63,9 @@ namespace Fie.Ponies.Applejack TrackEntry trackEntry = applejack.animationManager.SetAnimation(animationId, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { applejack.isEnableGravity = true; Vector3 a = applejack.externalInputVector * 0.5f; @@ -77,14 +78,14 @@ namespace Fie.Ponies.Applejack applejack.CalcBatteCicleSkill(); applejack.isEnableCollider = false; } - else if (e.Data.Name == "finished") + else if (trackIndex.Data.Name == "finished") { applejack.isEnableGravity = true; applejack.isEnableCollider = true; _isEnd = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAirDouble.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAirDouble.cs index dbf4445..db2fcc3 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAirDouble.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireAirDouble.cs @@ -4,6 +4,7 @@ using Fie.Object; using Spine; using System; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -66,9 +67,9 @@ namespace Fie.Ponies.Applejack if (trackEntry != null) { applejack.CalcBatteCicleSkill(); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { applejack.isEnableGravity = true; Vector3 externalInputVector2 = applejack.externalInputVector; @@ -80,14 +81,14 @@ namespace Fie.Ponies.Applejack FieManagerBehaviour.I.EmitObject(applejack.leftBackHoofTransform, Vector3.zero, null, applejack); applejack.isEnableCollider = false; } - else if (e.Data.Name == "finished") + else if (trackIndex.Data.Name == "finished") { applejack.isEnableGravity = true; applejack.isEnableCollider = true; _isEnd = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKick.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKick.cs index a3927be..150ac80 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKick.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKick.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -78,13 +79,13 @@ namespace Fie.Ponies.Applejack TrackEntry trackEntry = applejack.animationManager.SetAnimation(animationId, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(applejack.leftBackHoofTransform, applejack.flipDirectionVector * -1f, null, applejack); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { FieManagerBehaviour.I.EmitObject(applejack.centerTransform, applejack.flipDirectionVector * -1f); FieManagerBehaviour.I.EmitObject(applejack.leftFrontHoofTransform, applejack.flipDirectionVector); @@ -100,22 +101,22 @@ namespace Fie.Ponies.Applejack a = vector; a.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); applejack.resetMoveForce(); applejack.setMoveForce(vector2, 0f, useRound: false); applejack.setFlipByVector(vector2 * -1f); applejack.CalcBatteCicleSkill(); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.name == "cancellable") + if (trackIndex.Data.name == "cancellable") { - _isCancellable = (e.Int >= 1); + _isCancellable = (trackIndex.Int >= 1); } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKickRift.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKickRift.cs index bdd26e5..318b6b4 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKickRift.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireKickRift.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -79,9 +80,9 @@ namespace Fie.Ponies.Applejack TrackEntry trackEntry = applejack.animationManager.SetAnimation(animationId, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(applejack.leftBackHoofTransform, applejack.flipDirectionVector * -1f, null, applejack); applejack.CalcBatteCicleSkill(); @@ -90,7 +91,7 @@ namespace Fie.Ponies.Applejack FieManagerBehaviour.I.gameCamera.setOffsetTransition(applejack, new FieCameraOffset(new FieCameraOffset.FieCameraOffsetParam(new Vector3(0f, 0f, 1.5f), new Vector3(0f, 0f, 0f), 5f), 0.3f, 0.3f, 1.5f)); } } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { FieManagerBehaviour.I.EmitObject(applejack.centerTransform, applejack.flipDirectionVector * -1f); FieManagerBehaviour.I.EmitObject(applejack.leftFrontHoofTransform, applejack.flipDirectionVector); @@ -106,21 +107,21 @@ namespace Fie.Ponies.Applejack a = vector; a.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); applejack.resetMoveForce(); applejack.setMoveForce(vector2, 0f, useRound: false); applejack.setFlipByVector(vector2 * -1f); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.name == "cancellable") + if (trackIndex.Data.name == "cancellable") { - _isCancellable = (e.Int >= 1); + _isCancellable = (trackIndex.Int >= 1); } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFirePunch.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFirePunch.cs index 4278a0b..a540b6e 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFirePunch.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFirePunch.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -64,9 +65,9 @@ namespace Fie.Ponies.Applejack TrackEntry trackEntry = applejack.animationManager.SetAnimation(22, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { switch (_punchCount) { @@ -79,7 +80,7 @@ namespace Fie.Ponies.Applejack } _punchCount++; } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = applejack.flipDirectionVector; Transform lockonEnemyTransform = applejack.detector.getLockonEnemyTransform(); @@ -92,21 +93,21 @@ namespace Fie.Ponies.Applejack a = vector; a.y = 0f; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); applejack.resetMoveForce(); applejack.setMoveForce(vector2, 0f); applejack.setFlipByVector(vector2); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.name == "cancellable") + if (trackIndex.Data.name == "cancellable") { _isCancellable = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireRope.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireRope.cs index b77e329..3189036 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireRope.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackFireRope.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -74,9 +75,9 @@ namespace Fie.Ponies.Applejack applejack.SetDialog(30, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_P_HONESTY_ABILITY_ROPE_1), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_P_HONESTY_ABILITY_ROPE_2)); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { Vector3 directionalVec = (applejack.flipState != 0) ? Vector3.right : Vector3.left; FieEmitObjectApplejackRope fieEmitObjectApplejackRope = FieManagerBehaviour.I.EmitObject(applejack.mouthTransform, directionalVec, applejack.detector.getLockonEnemyTransform(), applejack); @@ -120,14 +121,14 @@ namespace Fie.Ponies.Applejack }; } } - else if (e.Data.Name == "takeOff") + else if (trackIndex.Data.Name == "takeOff") { Vector3 up = Vector3.up; up.Normalize(); up *= 4f; applejack.setMoveForce(up, 0.3f); } - else if (e.Data.Name == "finished") + else if (trackIndex.Data.Name == "finished") { _nextState = typeof(FieStateMachineApplejackFlying); _isEnd = true; @@ -137,7 +138,7 @@ namespace Fie.Ponies.Applejack { _isEnd = true; }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackJump.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackJump.cs index 968f248..d4583d8 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackJump.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackJump.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -65,9 +66,9 @@ namespace Fie.Ponies.Applejack _jumpState = JumpState.JUMP_TAKEOFF_STANDBY; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.name == "takeOff") + if (trackIndex.Data.name == "takeOff") { Vector3 vector = applejack.externalInputVector; vector += Vector3.up; @@ -77,7 +78,7 @@ namespace Fie.Ponies.Applejack applejack.setMoveForce(vector, 0.5f); _jumpState = JumpState.JUMP_TAKEOFF; } - else if (e.Data.name == "finished") + else if (trackIndex.Data.name == "finished") { _nextState = typeof(FieStateMachineApplejackFlying); _isEnd = true; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackRopeAction.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackRopeAction.cs index 5d0c77c..361e962 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackRopeAction.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackRopeAction.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -40,15 +41,15 @@ namespace Fie.Ponies.Applejack TrackEntry trackEntry = applejack.animationManager.SetAnimation(35, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 flipDirectionVector = applejack.flipDirectionVector; - Vector3 moveForce = flipDirectionVector * e.Float; + Vector3 moveForce = flipDirectionVector * trackIndex.Float; applejack.setMoveForce(moveForce, 0f); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompAction.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompAction.cs index 0540294..27ec077 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompAction.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompAction.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -67,9 +68,9 @@ namespace Fie.Ponies.Applejack FieManagerBehaviour.I.gameCamera.setWiggler(0.4f, 10, new Vector3(0.05f, 0.3f)); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompJump.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompJump.cs index b440b9d..45c95b9 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompJump.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackStompJump.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -68,13 +69,13 @@ namespace Fie.Ponies.Applejack _isEnd = true; return; } - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.name == "takeOff") + if (trackIndex.Data.name == "takeOff") { _jumpState = JumpState.JUMP_TAKEOFF_READY; } - if (e.Data.name == "finished") + if (trackIndex.Data.name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawAction.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawAction.cs index cb28180..7841d34 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawAction.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawAction.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -42,9 +43,9 @@ namespace Fie.Ponies.Applejack applejack.emotionController.SetEmoteAnimation(43, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; applejack.emotionController.RestoreEmotionFromDefaultData(); diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawActionMidAir.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawActionMidAir.cs index ae11b31..b85598c 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawActionMidAir.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Applejack/FieStateMachineApplejackYeehawActionMidAir.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Applejack { @@ -46,9 +47,9 @@ namespace Fie.Ponies.Applejack applejack.emotionController.SetEmoteAnimation(43, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "takeOff") + if (trackIndex.Data.Name == "takeOff") { Vector3 externalInputVector = applejack.externalInputVector; externalInputVector += Vector3.up + applejack.flipDirectionVector * 0.05f; @@ -57,7 +58,7 @@ namespace Fie.Ponies.Applejack applejack.resetMoveForce(); applejack.setMoveForce(externalInputVector, 0.3f); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { applejack.isEnableGravity = true; _isFinished = true; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieRainbowDash.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieRainbowDash.cs index 3a89615..36ceae7 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieRainbowDash.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieRainbowDash.cs @@ -98,7 +98,7 @@ namespace Fie.Ponies.RainbowDash collider.isEnable = false; } } - _customSpineMaterialComponent.SetCustomMaterialOverrides(forceEnable: true); + // _customSpineMaterialComponent.SetCustomMaterialOverrides(forceEnable: true); isEnableCollider = false; _isCloackMode = true; UnbindFromDetecter(); @@ -117,7 +117,7 @@ namespace Fie.Ponies.RainbowDash } } FieManagerBehaviour.I.EmitObject(base.centerTransform, Vector3.up); - _customSpineMaterialComponent.RemoveCustomMaterialOverrides(); + //_customSpineMaterialComponent.RemoveCustomMaterialOverrides(); _isCloackMode = false; _cloackObject = null; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack1.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack1.cs index 538a364..66052d7 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack1.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack1.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -103,13 +104,13 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(26, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(rainbowDash.leftBackHoofTransform, Vector3.zero, null, rainbowDash); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = rainbowDash.flipDirectionVector; Transform lockonEnemyTransform = rainbowDash.detector.getLockonEnemyTransform(isCenter: true); @@ -121,25 +122,25 @@ namespace Fie.Ponies.RainbowDash vector.Normalize(); a = vector; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); rainbowDash.resetMoveForce(); rainbowDash.setMoveForce(vector2, 0f, useRound: false); if (rainbowDash.groundState == FieObjectGroundState.Grounding) { - rainbowDash.setMoveForce(Vector3.up * e.Float * 0.2f, 0f, useRound: false); + rainbowDash.setMoveForce(Vector3.up * trackIndex.Float * 0.2f, 0f, useRound: false); } rainbowDash.setFlipByVector(vector2); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.name == "cancellable") + if (trackIndex.Data.name == "cancellable") { _isCancellable = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack2.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack2.cs index 83aad21..5d7d20b 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack2.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack2.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -105,9 +106,9 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(27, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { switch (_punchCount) { @@ -120,7 +121,7 @@ namespace Fie.Ponies.RainbowDash } _punchCount++; } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 a = rainbowDash.flipDirectionVector; Transform lockonEnemyTransform = rainbowDash.detector.getLockonEnemyTransform(isCenter: true); @@ -132,21 +133,21 @@ namespace Fie.Ponies.RainbowDash vector.Normalize(); a = vector; } - Vector3 vector2 = a * (e.Float * num); + Vector3 vector2 = a * (trackIndex.Float * num); rainbowDash.resetMoveForce(); rainbowDash.setMoveForce(vector2, 0f, useRound: false); rainbowDash.setFlipByVector(vector2); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.name == "cancellable") + if (trackIndex.Data.name == "cancellable") { _isCancellable = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack3.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack3.cs index 66c4eaa..cd1f2b7 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack3.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashBaseAttack3.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -103,29 +104,29 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(28, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(rainbowDash.leftBackHoofTransform, Vector3.zero, null, rainbowDash); } - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - Vector3 vector = rainbowDash.flipDirectionVector * -1f * e.Float; + Vector3 vector = rainbowDash.flipDirectionVector * -1f * trackIndex.Float; rainbowDash.resetMoveForce(); rainbowDash.setMoveForce(vector, 0f, useRound: false); rainbowDash.setFlipByVector(vector * -1f); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.name == "cancellable") + if (trackIndex.Data.name == "cancellable") { _isCancellable = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackAttacking.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackAttacking.cs index 6627841..8627b2c 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackAttacking.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackAttacking.cs @@ -6,6 +6,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -136,9 +137,9 @@ namespace Fie.Ponies.RainbowDash fieRainbowDash.rootBone.transform.localRotation = Quaternion.identity; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareMidAir.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareMidAir.cs index 5b45502..55d607b 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareMidAir.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareMidAir.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -62,9 +63,9 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(animationId, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { setCounterEvent(rainbowDash); } @@ -73,9 +74,9 @@ namespace Fie.Ponies.RainbowDash { rainbowDash.damageSystem.damageCheckEvent -= HealthSystem_damageCheckEvent; TrackEntry trackEntry2 = rainbowDash.animationManager.SetAnimation(36, isLoop: false, isForceSet: true); - trackEntry2.Event += delegate(Spine.AnimationState endAnimationState, int endAnimationTrackIndex, Spine.Event endEvent) + trackEntry2.Event += delegate(TrackEntry endAnimationState, Event endAnimationTrackIndex) { - if (endEvent.Data.Name == "finished") + if (endAnimationTrackIndex.Data.Name == "finished") { _isFinished = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareOnGround.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareOnGround.cs index b806862..1c67d1b 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareOnGround.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashDoublePaybackPrepareOnGround.cs @@ -4,6 +4,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -61,9 +62,9 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(animationId, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { setCounterEvent(rainbowDash); } @@ -72,9 +73,9 @@ namespace Fie.Ponies.RainbowDash { rainbowDash.damageSystem.damageCheckEvent -= HealthSystem_damageCheckEvent; TrackEntry trackEntry2 = rainbowDash.animationManager.SetAnimation(32, isLoop: false, isForceSet: true); - trackEntry2.Event += delegate(Spine.AnimationState endAnimationState, int endAnimationTrackIndex, Spine.Event endEvent) + trackEntry2.Event += delegate(TrackEntry endAnimationState, Event endAnimationTrackIndex) { - if (endEvent.Data.Name == "finished") + if (endAnimationTrackIndex.Data.Name == "finished") { _isFinished = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionBack.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionBack.cs index a774870..c2cea12 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionBack.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionBack.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -47,23 +48,23 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(23, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - setEvasion(rainbowDash, e); + setEvasion(rainbowDash, trackIndex); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.Name == "takeOff") + if (trackIndex.Data.Name == "takeOff") { _isTakeOff = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - rainbowDash.isEnableCollider = (e.Int < 1); + rainbowDash.isEnableCollider = (trackIndex.Int < 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionDown.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionDown.cs index 2cbb22c..4218893 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionDown.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionDown.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -45,19 +46,19 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(25, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - setEvasion(rainbowDash, e); + setEvasion(rainbowDash, trackIndex); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - rainbowDash.isEnableCollider = (e.Int < 1); + rainbowDash.isEnableCollider = (trackIndex.Int < 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionFront.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionFront.cs index c0c5f58..39ae373 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionFront.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionFront.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -47,23 +48,23 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(22, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - setEvasion(rainbowDash, e); + setEvasion(rainbowDash, trackIndex); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.Name == "takeOff") + if (trackIndex.Data.Name == "takeOff") { _isTakeOff = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - rainbowDash.isEnableCollider = (e.Int < 1); + rainbowDash.isEnableCollider = (trackIndex.Int < 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionUp.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionUp.cs index 03f7712..b67fd14 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionUp.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashEvasionUp.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -45,19 +46,19 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(24, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { - setEvasion(rainbowDash, e); + setEvasion(rainbowDash, trackIndex); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - rainbowDash.isEnableCollider = (e.Int < 1); + rainbowDash.isEnableCollider = (trackIndex.Int < 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashJump.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashJump.cs index 8b1e48e..016fbb1 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashJump.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashJump.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -64,9 +65,9 @@ namespace Fie.Ponies.RainbowDash _jumpState = JumpState.JUMP_TAKEOFF_STANDBY; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.name == "takeOff") + if (trackIndex.Data.name == "takeOff") { Vector3 vector = rainbowDash.externalInputVector; vector += Vector3.up; @@ -76,7 +77,7 @@ namespace Fie.Ponies.RainbowDash rainbowDash.setMoveForce(vector, 0.1f); _jumpState = JumpState.JUMP_TAKEOFF; } - else if (e.Data.name == "finished") + else if (trackIndex.Data.name == "finished") { _nextState = typeof(FieStateMachineRainbowDashFlying); _isEnd = true; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashOmniSmashFinish.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashOmniSmashFinish.cs index 632eb6e..336d4b4 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashOmniSmashFinish.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashOmniSmashFinish.cs @@ -7,6 +7,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -68,9 +69,9 @@ namespace Fie.Ponies.RainbowDash } else { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { SetAttackState(rainbowDash); _attackState = AttackState.ATTACKING; @@ -122,13 +123,13 @@ namespace Fie.Ponies.RainbowDash } else { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { FieManagerBehaviour.I.EmitObject(rainbowDash.transform, Vector3.forward); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { if (rainbowDash.omniSmashAttackingCount > 2) { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashRainblowCloack.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashRainblowCloack.cs index 2156474..8d21c13 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashRainblowCloack.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashRainblowCloack.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -44,23 +45,23 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(45, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "fire") + if (trackIndex.Data.Name == "fire") { rainbowDash.Cloack(); } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } - if (e.Data.Name == "takeOff") + if (trackIndex.Data.Name == "takeOff") { _isTakeOff = true; } - if (e.Data.Name == "immunity") + if (trackIndex.Data.Name == "immunity") { - rainbowDash.isEnableCollider = (e.Int < 1); + rainbowDash.isEnableCollider = (trackIndex.Int < 1); } }; trackEntry.Complete += delegate diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashStabAttack.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashStabAttack.cs index db9ef23..17f5afd 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashStabAttack.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RainbowDash/FieStateMachineRainbowDashStabAttack.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RainbowDash { @@ -104,9 +105,9 @@ namespace Fie.Ponies.RainbowDash TrackEntry trackEntry = rainbowDash.animationManager.SetAnimation(28, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "move") + if (trackIndex.Data.Name == "move") { Vector3 vector = rainbowDash.flipDirectionVector; if (rainbowDash.detector.lockonTargetObject != null) @@ -114,7 +115,7 @@ namespace Fie.Ponies.RainbowDash vector = (rainbowDash.detector.lockonTargetObject.centerTransform.position - rainbowDash.centerTransform.position).normalized; } rainbowDash.resetMoveForce(); - rainbowDash.setMoveForce(vector * e.Float * 3f, 0f, useRound: false); + rainbowDash.setMoveForce(vector * trackIndex.Float * 3f, 0f, useRound: false); rainbowDash.setFlipByVector(vector); FieManagerBehaviour.I.EmitObject(rainbowDash.centerTransform, vector, null, rainbowDash); _attackingEffect = FieManagerBehaviour.I.EmitObject(rainbowDash.centerTransform, Vector3.up); @@ -123,7 +124,7 @@ namespace Fie.Ponies.RainbowDash FieManagerBehaviour.I.gameCamera.setOffsetTransition(rainbowDash, new FieCameraOffset(new FieCameraOffset.FieCameraOffsetParam(new Vector3(0f, 0f, 1.5f), new Vector3(0f, 0f, 0f), 10f), 0.1f, 0.3f, 1.5f)); } } - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { if (_attackingEffect != null) { @@ -131,12 +132,12 @@ namespace Fie.Ponies.RainbowDash } _isFinished = true; } - if (e.Data.name == "cancellable") + if (trackIndex.Data.name == "cancellable") { _isCancellable = true; } }; - _endTime = trackEntry.endTime; + _endTime = trackEntry.animationEnd; } else { diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireBig.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireBig.cs index c2f1e97..1eb74fe 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireBig.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireBig.cs @@ -53,7 +53,7 @@ namespace Fie.Ponies.RisingSun TrackEntry trackEntry = fieRisingSun.animationManager.SetAnimationChain(28, 16, isLoop: true); if (trackEntry != null) { - _endTime = trackEntry.endTime; + _endTime = trackEntry.AnimationTime; } _fireState = FireState.FIRING; fieRisingSun.isEnableGravity = false; @@ -67,7 +67,7 @@ namespace Fie.Ponies.RisingSun TrackEntry trackEntry2 = fieRisingSun.animationManager.SetAnimation(27); if (trackEntry2 != null) { - _endTime += trackEntry2.endTime; + _endTime += trackEntry2.AnimationTime; } _isSetEndAnim = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireSmall.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireSmall.cs index c0ecb94..b34dec0 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireSmall.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunFireSmall.cs @@ -37,7 +37,7 @@ namespace Fie.Ponies.RisingSun TrackEntry trackEntry = fieRisingSun.animationManager.SetAnimation(animationId, isLoop: false, isForceSet: true); if (trackEntry != null) { - _endTime = trackEntry.endTime; + _endTime = trackEntry.AnimationTime; } } _fireState = FireState.FIRING; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunJump.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunJump.cs index f9ec38d..26b1f96 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunJump.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunJump.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RisingSun { @@ -48,9 +49,9 @@ namespace Fie.Ponies.RisingSun _jumpState = JumpState.JUMP_TAKEOFF_STANDBY; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.name == "takeOff") + if (trackIndex.Data.name == "takeOff") { Vector3 vector = rising_sun.externalInputVector; vector += Vector3.up; @@ -60,7 +61,7 @@ namespace Fie.Ponies.RisingSun rising_sun.setMoveForce(vector, 0.5f); _jumpState = JumpState.JUMP_TAKEOFF; } - else if (e.Data.name == "finished") + else if (trackIndex.Data.name == "finished") { _nextState = typeof(FieStateMachineRisingSunFlying); _isEnd = true; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndAir.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndAir.cs index aa935e5..3a27f2c 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndAir.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndAir.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RisingSun { @@ -34,9 +35,9 @@ namespace Fie.Ponies.RisingSun TrackEntry trackEntry = fieRisingSun.animationManager.SetAnimation(21, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _nextState = typeof(FieStateMachineRisingSunFlying); _isFinished = true; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndGround.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndGround.cs index 42eee5c..657e5fe 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndGround.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.RisingSun/FieStateMachineRisingSunTeleportationEndGround.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.RisingSun { @@ -34,9 +35,9 @@ namespace Fie.Ponies.RisingSun TrackEntry trackEntry = fieRisingSun.animationManager.SetAnimation(27, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightFireSmall.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightFireSmall.cs index e8dfc46..2591ada 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightFireSmall.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightFireSmall.cs @@ -37,7 +37,7 @@ namespace Fie.Ponies.Twilight TrackEntry trackEntry = fieTwilight.animationManager.SetAnimation(animationId, isLoop: false, isForceSet: true); if (trackEntry != null) { - _endTime = trackEntry.endTime; + _endTime = trackEntry.AnimationTime; } } _fireState = FireState.FIRING; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightJump.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightJump.cs index 88f69d9..85df464 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightJump.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightJump.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Twilight { @@ -48,9 +49,9 @@ namespace Fie.Ponies.Twilight _jumpState = JumpState.JUMP_TAKEOFF_STANDBY; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.name == "takeOff") + if (trackIndex.Data.name == "takeOff") { Vector3 vector = twilight.externalInputVector; vector += Vector3.up; @@ -60,7 +61,7 @@ namespace Fie.Ponies.Twilight twilight.setMoveForce(vector, 0.5f); _jumpState = JumpState.JUMP_TAKEOFF; } - else if (e.Data.name == "finished") + else if (trackIndex.Data.name == "finished") { _nextState = typeof(FieStateMachineTwilightFlying); _isEnd = true; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightSparklyCannonShooting.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightSparklyCannonShooting.cs index a3e0d39..99424f3 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightSparklyCannonShooting.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightSparklyCannonShooting.cs @@ -119,7 +119,7 @@ namespace Fie.Ponies.Twilight TrackEntry trackEntry = fieTwilight.animationManager.SetAnimation(29, isLoop: false, isForceSet: true); if (trackEntry != null) { - _endTime += trackEntry.endTime; + _endTime += trackEntry.AnimationTime; } _isSetEndAnim = true; } diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndAir.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndAir.cs index 214cc6c..e53a7ca 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndAir.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndAir.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Twilight { @@ -34,9 +35,9 @@ namespace Fie.Ponies.Twilight TrackEntry trackEntry = fieTwilight.animationManager.SetAnimation(21, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _nextState = typeof(FieStateMachineTwilightFlying); _isFinished = true; diff --git a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndGround.cs b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndGround.cs index 94cae54..4b722a9 100644 --- a/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndGround.cs +++ b/Assets/Scripts/Fie/Ponies/Fie.Ponies.Twilight/FieStateMachineTwilightTeleportationEndGround.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies.Twilight { @@ -34,9 +35,9 @@ namespace Fie.Ponies.Twilight TrackEntry trackEntry = fieTwilight.animationManager.SetAnimation(27, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } diff --git a/Assets/Scripts/Fie/Ponies/FiePonies.cs b/Assets/Scripts/Fie/Ponies/FiePonies.cs index 86caf49..a29476c 100644 --- a/Assets/Scripts/Fie/Ponies/FiePonies.cs +++ b/Assets/Scripts/Fie/Ponies/FiePonies.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; +using Event = Spine.Event; namespace Fie.Ponies { @@ -137,8 +138,7 @@ namespace Fie.Ponies if (value) { _headBone.mode = SkeletonUtilityBone.Mode.Override; - _headBone.flip = false; - _headBone.flipX = false; + _headBone.scale = false; _headBone.overrideAlpha = 0f; if (_headTrackingTweener != null) { @@ -148,7 +148,7 @@ namespace Fie.Ponies else { _headBone.mode = SkeletonUtilityBone.Mode.Follow; - _headBone.flip = true; + _headBone.scale = true; } } _isEnableHeadTracking = value; @@ -343,9 +343,9 @@ namespace Fie.Ponies { if (entry != null) { - entry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + entry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "footstep" && base.currentFootstepMaterial != null) + if (trackIndex.Data.Name == "footstep" && base.currentFootstepMaterial != null) { base.currentFootstepMaterial.playFootstepAudio(base.footstepPlayer); } diff --git a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesArrival.cs b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesArrival.cs index 16ed4bf..e125e62 100644 --- a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesArrival.cs +++ b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesArrival.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies { @@ -45,9 +46,9 @@ namespace Fie.Ponies _nextState = typeof(FieStateMachineCommonIdle); _isEnd = true; } - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { ponies.SetDialog(FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptTriggerType_WS_TRIGGER_TYPE_ARRIVAL)); ponies.submeshObject.enabled = true; diff --git a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesLanding.cs b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesLanding.cs index 5a45c04..d844247 100644 --- a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesLanding.cs +++ b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesLanding.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies { @@ -42,9 +43,9 @@ namespace Fie.Ponies TrackEntry trackEntry = fiePonies.animationManager.SetAnimation(4, isLoop: false, isForceSet: true); if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isFinished = true; } diff --git a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRevive.cs b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRevive.cs index 8b326e2..88e2cd8 100644 --- a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRevive.cs +++ b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRevive.cs @@ -5,6 +5,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies { @@ -35,9 +36,9 @@ namespace Fie.Ponies fiePonies.emotionController.SetDefaultEmoteAnimationID(16); TrackEntry trackEntry = fiePonies.animationManager.SetAnimation(13, isLoop: false, isForceSet: true); FieManagerBehaviour.I.EmitObject(fiePonies.transform, Vector3.up); - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRift.cs b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRift.cs index 327eb12..2c8eb85 100644 --- a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRift.cs +++ b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesRift.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies { @@ -62,9 +63,9 @@ namespace Fie.Ponies trackEntry.mixDuration = 0f; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStagger.cs b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStagger.cs index f8c5f6e..ebd2f07 100644 --- a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStagger.cs +++ b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStagger.cs @@ -3,6 +3,7 @@ using Spine; using System; using System.Collections.Generic; using UnityEngine; +using Event = Spine.Event; namespace Fie.Ponies { @@ -49,9 +50,9 @@ namespace Fie.Ponies trackEntry.mixDuration = 0f; if (trackEntry != null) { - trackEntry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStaggerFallRecover.cs b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStaggerFallRecover.cs index 6521a43..f878e5f 100644 --- a/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStaggerFallRecover.cs +++ b/Assets/Scripts/Fie/Ponies/FieStateMachinePoniesStaggerFallRecover.cs @@ -31,9 +31,9 @@ namespace Fie.Ponies { fiePonies.emotionController.RestoreEmotionFromDefaultData(); TrackEntry trackEntry = fiePonies.animationManager.SetAnimation(9, isLoop: false, isForceSet: true); - trackEntry.Event += delegate(AnimationState state, int trackIndex, Event e) + trackEntry.Event += delegate(TrackEntry state, Event trackIndex) { - if (e.Data.Name == "finished") + if (trackIndex.Data.Name == "finished") { _isEnd = true; } diff --git a/Assets/Scripts/Fie/UI/FieGameUIFriendshipGauge.cs b/Assets/Scripts/Fie/UI/FieGameUIFriendshipGauge.cs index 9e67a3d..300e96e 100644 --- a/Assets/Scripts/Fie/UI/FieGameUIFriendshipGauge.cs +++ b/Assets/Scripts/Fie/UI/FieGameUIFriendshipGauge.cs @@ -125,8 +125,8 @@ namespace Fie.UI if (entry != null) { float num = _animationFriendship / _maxFriendship; - float num2 = entry.endTime - 0.024f; - entry.Time = Mathf.Max(Mathf.Min(num * num2, num2), 0f); + float num2 = entry.animationEnd - 0.024f; + entry.TrackTime = Mathf.Max(Mathf.Min(num * num2, num2), 0f); entry.TimeScale = 0f; } } diff --git a/Assets/Scripts/Fie/UI/FieGameUILifeGaugeBase.cs b/Assets/Scripts/Fie/UI/FieGameUILifeGaugeBase.cs index 736a88c..2891567 100644 --- a/Assets/Scripts/Fie/UI/FieGameUILifeGaugeBase.cs +++ b/Assets/Scripts/Fie/UI/FieGameUILifeGaugeBase.cs @@ -218,8 +218,8 @@ namespace Fie.UI { num = _animationShield / _maxShield; } - float num2 = entry.endTime - 0.0333f; - entry.Time = Mathf.Max(Mathf.Min(num2 - num * num2, num2), 0f); + float num2 = entry.animationEnd - 0.0333f; + entry.trackTime = Mathf.Max(Mathf.Min(num2 - num * num2, num2), 0f); entry.TimeScale = 0f; } } diff --git a/Assets/Scripts/Fie/UI/FieGameUITargetIcon.cs b/Assets/Scripts/Fie/UI/FieGameUITargetIcon.cs index 87e3634..d132792 100644 --- a/Assets/Scripts/Fie/UI/FieGameUITargetIcon.cs +++ b/Assets/Scripts/Fie/UI/FieGameUITargetIcon.cs @@ -116,7 +116,7 @@ namespace Fie.UI yield return (object)null; /*Error: Unable to find new state assignment for yield return*/; } - yield return (object)new WaitForSeconds(entry.endTime); + yield return (object)new WaitForSeconds(entry.animationEnd); /*Error: Unable to find new state assignment for yield return*/; } @@ -342,7 +342,7 @@ namespace Fie.UI { num = latestCooldown / maxCooldown; } - entry.Time = Mathf.Max(Mathf.Min(entry.endTime - num * entry.endTime, entry.endTime), 0f); + entry.trackTime = Mathf.Max(Mathf.Min(entry.animationEnd - num * entry.animationEnd, entry.animationEnd), 0f); entry.TimeScale = 0f; } diff --git a/Assets/Scripts/Fie/UI/FieResultBar.cs b/Assets/Scripts/Fie/UI/FieResultBar.cs index e0cf3ef..ef8ef93 100644 --- a/Assets/Scripts/Fie/UI/FieResultBar.cs +++ b/Assets/Scripts/Fie/UI/FieResultBar.cs @@ -48,7 +48,7 @@ namespace Fie.UI public IEnumerator ScoreTransition() { - _003CScoreTransition_003Ec__Iterator0 _003CScoreTransition_003Ec__Iterator = (_003CScoreTransition_003Ec__Iterator0)/*Error near IL_0032: stateMachine*/; + //_003CScoreTransition_003Ec__Iterator0 _003CScoreTransition_003Ec__Iterator = (_003CScoreTransition_003Ec__Iterator0)/*Error near IL_0032: stateMachine*/; FieLevelInfo expInfo = FieManagerBehaviour.I.GetLevelInfoByTotalExp(_resultParam.beforeExp); _levelGauge.Initialize(0f, (float)expInfo.requiredExpToNextLevel, (float)expInfo.currentExpToNextLevel); string levelLabel = FieLocalizeUtility.GetConstantText(GDEItemKeys.ConstantTextList_SKILL_TREE_LEVEL_LABEL); diff --git a/Assets/Scripts/Fie/Voice/FiePhonemeAnimationData.cs b/Assets/Scripts/Fie/Voice/FiePhonemeAnimationData.cs index 50da7b2..1fdfaee 100644 --- a/Assets/Scripts/Fie/Voice/FiePhonemeAnimationData.cs +++ b/Assets/Scripts/Fie/Voice/FiePhonemeAnimationData.cs @@ -1,4 +1,5 @@ using System; +using RogoDigital.Lipsync; using UnityEngine; namespace Fie.Voice diff --git a/Assets/Scripts/Fie/Voice/FieVoiceController.cs b/Assets/Scripts/Fie/Voice/FieVoiceController.cs index d54e318..894763f 100644 --- a/Assets/Scripts/Fie/Voice/FieVoiceController.cs +++ b/Assets/Scripts/Fie/Voice/FieVoiceController.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; +using Spine.Unity; using UnityEngine; namespace Fie.Voice @@ -78,7 +79,7 @@ namespace Fie.Voice private IEnumerator AsyncLoadVoiceDatas(GDEGameCharacterTypeData gameCharacterTypeData) { - _003CAsyncLoadVoiceDatas_003Ec__Iterator0 _003CAsyncLoadVoiceDatas_003Ec__Iterator = (_003CAsyncLoadVoiceDatas_003Ec__Iterator0)/*Error near IL_0034: stateMachine*/; + //_003CAsyncLoadVoiceDatas_003Ec__Iterator0 _003CAsyncLoadVoiceDatas_003Ec__Iterator = (_003CAsyncLoadVoiceDatas_003Ec__Iterator0)/*Error near IL_0034: stateMachine*/; if (gameCharacterTypeData != null) { List voiceDataList = FieMasterData.FindMasterDataList(delegate(GDEWordScriptsListData data) @@ -238,7 +239,7 @@ namespace Fie.Voice } if (_actorCharacter != null && _actorCharacter.emotionController != null) { - _actorCharacter.skeletonUtility.skeletonAnimation.state.ClearTrack(emotionTrackID); + ((SkeletonAnimation)_actorCharacter.skeletonUtility.skeletonAnimation).state.ClearTrack(emotionTrackID); _actorCharacter.emotionController.RestoreEmotionFromDefaultData(); _actorCharacter.emotionController.RestartAutoAnimation(); } @@ -283,19 +284,19 @@ namespace Fie.Voice { _currentPhonemeMarker = index; Phoneme phoneme = _phonemeMarkers[index].phoneme; - if (phonemesAnimations.ContainsKey(phoneme)) - { - TrackEntry trackEntry = actorCharacter.skeletonUtility.skeletonAnimation.state.SetAnimation(phonemeTrackID, phonemesAnimations[phoneme], loop: false); - if (trackEntry != null) - { - float mixDuration = 0f; - if (_currentPhonemeMarker + 1 < _phonemeMarkers.Count) - { - mixDuration = _phonemeMarkers[_currentPhonemeMarker + 1].time - _phonemeMarkers[_currentPhonemeMarker].time; - } - trackEntry.mixDuration = mixDuration; - } - } + // if (phonemesAnimations.ContainsKey(phoneme)) + // { + // TrackEntry trackEntry = actorCharacter.skeletonUtility.skeletonAnimation.state.SetAnimation(phonemeTrackID, phonemesAnimations[phoneme], loop: false); + // if (trackEntry != null) + // { + // float mixDuration = 0f; + // if (_currentPhonemeMarker + 1 < _phonemeMarkers.Count) + // { + // mixDuration = _phonemeMarkers[_currentPhonemeMarker + 1].time - _phonemeMarkers[_currentPhonemeMarker].time; + // } + // trackEntry.mixDuration = mixDuration; + // } + // } } } @@ -307,7 +308,7 @@ namespace Fie.Voice string emotion = _emotionMarkers[index].emotion; if (emotionsAnimations.ContainsKey(emotion)) { - TrackEntry trackEntry = actorCharacter.skeletonUtility.skeletonAnimation.state.SetAnimation(emotionTrackID, emotionsAnimations[emotion], loop: false); + TrackEntry trackEntry = ((SkeletonAnimation)actorCharacter.skeletonUtility.skeletonAnimation).state.SetAnimation(emotionTrackID, emotionsAnimations[emotion], loop: false); if (trackEntry != null) { trackEntry.mixDuration = 0.2f; diff --git a/Assets/Scripts/Fie/Voice/Phoneme.cs b/Assets/Scripts/Fie/Voice/Phoneme.cs deleted file mode 100644 index 216061e..0000000 --- a/Assets/Scripts/Fie/Voice/Phoneme.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Fie.Voice -{ - public enum Phoneme - { - AI, - E, - U, - O, - CDGKNRSThYZ, - FV, - L, - MBP, - WQ, - PHONEME_MAX - } -} diff --git a/Assets/Scripts/FieGameCharacter.cs b/Assets/Scripts/FieGameCharacter.cs index dca3f41..f9fba92 100644 --- a/Assets/Scripts/FieGameCharacter.cs +++ b/Assets/Scripts/FieGameCharacter.cs @@ -386,7 +386,7 @@ public abstract class FieGameCharacter : FieNetworkObjectBase public SkeletonUtility skeletonUtility => _skeletonUtility; - public MeshRenderer submeshObject => _submeshObject.meshRenderer; + public MeshRenderer submeshObject => _submeshObject.GetComponent(); public FieDetector detector => _detector; @@ -937,14 +937,14 @@ public abstract class FieGameCharacter : FieNetworkObjectBase if (base.flipState == FieObjectFlipState.Left) { base.transform.rotation = Quaternion.AngleAxis(0f, Vector3.up); - _skeletonUtility.skeletonAnimation.zSpacing = -0.002f; - _skeletonUtility.skeletonRenderer.isFlippedNormal = false; + _skeletonUtility.skeletonRenderer.zSpacing = -0.002f; + // _skeletonUtility.skeletonRenderer.isFlippedNormal = false; } else { base.transform.rotation = Quaternion.AngleAxis(180f, Vector3.up); - _skeletonUtility.skeletonAnimation.zSpacing = 0.002f; - _skeletonUtility.skeletonRenderer.isFlippedNormal = true; + _skeletonUtility.skeletonRenderer.zSpacing = 0.002f; + // _skeletonUtility.skeletonRenderer.isFlippedNormal = true; } } diff --git a/Assets/Scripts/FieSortingOrder.cs b/Assets/Scripts/FieSortingOrder.cs index be0a187..00c64c5 100644 --- a/Assets/Scripts/FieSortingOrder.cs +++ b/Assets/Scripts/FieSortingOrder.cs @@ -5,7 +5,6 @@ using UnityEngine; public class FieSortingOrder : MonoBehaviour { [SerializeField] - [SortingLayer] private string layerName = "Default"; [SerializeField] diff --git a/Assets/Spine/Assets/spine-unity.meta b/Assets/Spine/Assets/spine-unity.meta new file mode 100644 index 0000000..f89227f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 29a3535756b284a428d35dcd4327185e +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Asset Types.meta b/Assets/Spine/Assets/spine-unity/Asset Types.meta new file mode 100644 index 0000000..ade58c0 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1dc4b7c23385e8c43ad19d01cbed78ce +folderAsset: yes +timeCreated: 1455489521 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/AnimationReferenceAsset.cs b/Assets/Spine/Assets/spine-unity/Asset Types/AnimationReferenceAsset.cs new file mode 100644 index 0000000..e7305cd --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/AnimationReferenceAsset.cs @@ -0,0 +1,67 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define AUTOINIT_SPINEREFERENCE + +using UnityEngine; + +namespace Spine.Unity { + [CreateAssetMenu(menuName = "Spine/Animation Reference Asset")] + public class AnimationReferenceAsset : ScriptableObject, IHasSkeletonDataAsset { + const bool QuietSkeletonData = true; + + [SerializeField] protected SkeletonDataAsset skeletonDataAsset; + [SerializeField, SpineAnimation] protected string animationName; + private Animation animation; + + public SkeletonDataAsset SkeletonDataAsset { get { return skeletonDataAsset; } } + + public Animation Animation { + get { + #if AUTOINIT_SPINEREFERENCE + if (animation == null) + Initialize(); + #endif + + return animation; + } + } + + public void Initialize () { + if (skeletonDataAsset == null) return; + this.animation = skeletonDataAsset.GetSkeletonData(AnimationReferenceAsset.QuietSkeletonData).FindAnimation(animationName); + if (this.animation == null) Debug.LogWarningFormat("Animation '{0}' not found in SkeletonData : {1}.", animationName, skeletonDataAsset.name); + } + + public static implicit operator Animation (AnimationReferenceAsset asset) { + return asset.Animation; + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/AnimationReferenceAsset.cs.meta b/Assets/Spine/Assets/spine-unity/Asset Types/AnimationReferenceAsset.cs.meta new file mode 100644 index 0000000..dbfadcd --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/AnimationReferenceAsset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6e3e95a05e4c9774397eeeb7bdee8ccb +timeCreated: 1523328498 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 52b12ec801461494185a4d3dc66f3d1d, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/AtlasAsset.cs b/Assets/Spine/Assets/spine-unity/Asset Types/AtlasAsset.cs new file mode 100644 index 0000000..824e500 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/AtlasAsset.cs @@ -0,0 +1,241 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using Spine; + +namespace Spine.Unity { + /// Loads and stores a Spine atlas and list of materials. + public class AtlasAsset : ScriptableObject { + public TextAsset atlasFile; + public Material[] materials; + protected Atlas atlas; + + public bool IsLoaded { get { return this.atlas != null; } } + + #region Runtime Instantiation + /// + /// Creates a runtime AtlasAsset + public static AtlasAsset CreateRuntimeInstance (TextAsset atlasText, Material[] materials, bool initialize) { + AtlasAsset atlasAsset = ScriptableObject.CreateInstance(); + atlasAsset.Reset(); + atlasAsset.atlasFile = atlasText; + atlasAsset.materials = materials; + + if (initialize) + atlasAsset.GetAtlas(); + + return atlasAsset; + } + + /// + /// Creates a runtime AtlasAsset. Only providing the textures is slower because it has to search for atlas page matches. + public static AtlasAsset CreateRuntimeInstance (TextAsset atlasText, Texture2D[] textures, Material materialPropertySource, bool initialize) { + // Get atlas page names. + string atlasString = atlasText.text; + atlasString = atlasString.Replace("\r", ""); + string[] atlasLines = atlasString.Split('\n'); + var pages = new List(); + for (int i = 0; i < atlasLines.Length - 1; i++) { + if (atlasLines[i].Trim().Length == 0) + pages.Add(atlasLines[i + 1].Trim().Replace(".png", "")); + } + + // Populate Materials[] by matching texture names with page names. + var materials = new Material[pages.Count]; + for (int i = 0, n = pages.Count; i < n; i++) { + Material mat = null; + + // Search for a match. + string pageName = pages[i]; + for (int j = 0, m = textures.Length; j < m; j++) { + if (string.Equals(pageName, textures[j].name, System.StringComparison.OrdinalIgnoreCase)) { + // Match found. + mat = new Material(materialPropertySource); + mat.mainTexture = textures[j]; + break; + } + } + + if (mat != null) + materials[i] = mat; + else + throw new ArgumentException("Could not find matching atlas page in the texture array."); + } + + // Create AtlasAsset normally + return CreateRuntimeInstance(atlasText, materials, initialize); + } + + /// + /// Creates a runtime AtlasAsset. Only providing the textures is slower because it has to search for atlas page matches. + public static AtlasAsset CreateRuntimeInstance (TextAsset atlasText, Texture2D[] textures, Shader shader, bool initialize) { + if (shader == null) + shader = Shader.Find("Spine/Skeleton"); + + Material materialProperySource = new Material(shader); + var oa = CreateRuntimeInstance(atlasText, textures, materialProperySource, initialize); + + return oa; + } + #endregion + + void Reset () { + Clear(); + } + + public virtual void Clear () { + atlas = null; + } + + /// The atlas or null if it could not be loaded. + public virtual Atlas GetAtlas () { + if (atlasFile == null) { + Debug.LogError("Atlas file not set for atlas asset: " + name, this); + Clear(); + return null; + } + + if (materials == null || materials.Length == 0) { + Debug.LogError("Materials not set for atlas asset: " + name, this); + Clear(); + return null; + } + + if (atlas != null) return atlas; + + try { + atlas = new Atlas(new StringReader(atlasFile.text), "", new MaterialsTextureLoader(this)); + atlas.FlipV(); + return atlas; + } catch (Exception ex) { + Debug.LogError("Error reading atlas file for atlas asset: " + name + "\n" + ex.Message + "\n" + ex.StackTrace, this); + return null; + } + } + + public Mesh GenerateMesh (string name, Mesh mesh, out Material material, float scale = 0.01f) { + AtlasRegion region = atlas.FindRegion(name); + material = null; + if (region != null) { + if (mesh == null) { + mesh = new Mesh(); + mesh.name = name; + } + + Vector3[] verts = new Vector3[4]; + Vector2[] uvs = new Vector2[4]; + Color[] colors = { Color.white, Color.white, Color.white, Color.white }; + int[] triangles = { 0, 1, 2, 2, 3, 0 }; + + float left, right, top, bottom; + left = region.width / -2f; + right = left * -1f; + top = region.height / 2f; + bottom = top * -1; + + verts[0] = new Vector3(left, bottom, 0) * scale; + verts[1] = new Vector3(left, top, 0) * scale; + verts[2] = new Vector3(right, top, 0) * scale; + verts[3] = new Vector3(right, bottom, 0) * scale; + float u, v, u2, v2; + u = region.u; + v = region.v; + u2 = region.u2; + v2 = region.v2; + + if (!region.rotate) { + uvs[0] = new Vector2(u, v2); + uvs[1] = new Vector2(u, v); + uvs[2] = new Vector2(u2, v); + uvs[3] = new Vector2(u2, v2); + } else { + uvs[0] = new Vector2(u2, v2); + uvs[1] = new Vector2(u, v2); + uvs[2] = new Vector2(u, v); + uvs[3] = new Vector2(u2, v); + } + + mesh.triangles = new int[0]; + mesh.vertices = verts; + mesh.uv = uvs; + mesh.colors = colors; + mesh.triangles = triangles; + mesh.RecalculateNormals(); + mesh.RecalculateBounds(); + + material = (Material)region.page.rendererObject; + } else { + mesh = null; + } + + return mesh; + } + } + + public class MaterialsTextureLoader : TextureLoader { + AtlasAsset atlasAsset; + + public MaterialsTextureLoader (AtlasAsset atlasAsset) { + this.atlasAsset = atlasAsset; + } + + public void Load (AtlasPage page, string path) { + String name = Path.GetFileNameWithoutExtension(path); + Material material = null; + foreach (Material other in atlasAsset.materials) { + if (other.mainTexture == null) { + Debug.LogError("Material is missing texture: " + other.name, other); + return; + } + if (other.mainTexture.name == name) { + material = other; + break; + } + } + if (material == null) { + Debug.LogError("Material with texture name \"" + name + "\" not found for atlas asset: " + atlasAsset.name, atlasAsset); + return; + } + page.rendererObject = material; + + // Very old atlas files expected the texture's actual size to be used at runtime. + if (page.width == 0 || page.height == 0) { + page.width = material.mainTexture.width; + page.height = material.mainTexture.height; + } + } + + public void Unload (object texture) { } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/AtlasAsset.cs.meta b/Assets/Spine/Assets/spine-unity/Asset Types/AtlasAsset.cs.meta new file mode 100644 index 0000000..e6a4920 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/AtlasAsset.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a6b194f808b1af6499c93410e504af42 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 3fc714a0dc1cf6b4b959e073fff2844e, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/EventDataReferenceAsset.cs b/Assets/Spine/Assets/spine-unity/Asset Types/EventDataReferenceAsset.cs new file mode 100644 index 0000000..6cee80b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/EventDataReferenceAsset.cs @@ -0,0 +1,66 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define AUTOINIT_SPINEREFERENCE + +using UnityEngine; + +namespace Spine.Unity { + [CreateAssetMenu(menuName = "Spine/EventData Reference Asset")] + public class EventDataReferenceAsset : ScriptableObject { + const bool QuietSkeletonData = true; + + [SerializeField] protected SkeletonDataAsset skeletonDataAsset; + [SerializeField, SpineEvent(dataField: "skeletonDataAsset")] protected string eventName; + + EventData eventData; + public EventData EventData { + get { + #if AUTOINIT_SPINEREFERENCE + if (eventData == null) + Initialize(); + #endif + return eventData; + } + } + + public void Initialize () { + if (skeletonDataAsset == null) + return; + this.eventData = skeletonDataAsset.GetSkeletonData(EventDataReferenceAsset.QuietSkeletonData).FindEvent(eventName); + if (this.eventData == null) + Debug.LogWarningFormat("Event Data '{0}' not found in SkeletonData : {1}.", eventName, skeletonDataAsset.name); + } + + public static implicit operator EventData (EventDataReferenceAsset asset) { + return asset.EventData; + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/EventDataReferenceAsset.cs.meta b/Assets/Spine/Assets/spine-unity/Asset Types/EventDataReferenceAsset.cs.meta new file mode 100644 index 0000000..cb26130 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/EventDataReferenceAsset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8e60be42c1473144db0fd3337c25b500 +timeCreated: 1523330891 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: d226a80acc775714aa78b85e16a00e9b, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/RegionlessAttachmentLoader.cs b/Assets/Spine/Assets/spine-unity/Asset Types/RegionlessAttachmentLoader.cs new file mode 100644 index 0000000..cbfd25c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/RegionlessAttachmentLoader.cs @@ -0,0 +1,84 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using UnityEngine; + +namespace Spine.Unity { + + public class RegionlessAttachmentLoader : AttachmentLoader { + + static AtlasRegion emptyRegion; + static AtlasRegion EmptyRegion { + get { + if (emptyRegion == null) { + emptyRegion = new AtlasRegion { + name = "Empty AtlasRegion", + page = new AtlasPage { + name = "Empty AtlasPage", + rendererObject = new Material(Shader.Find("Spine/Special/HiddenPass")) { name = "NoRender Material" } + } + }; + } + return emptyRegion; + } + } + + public RegionAttachment NewRegionAttachment (Skin skin, string name, string path) { + RegionAttachment attachment = new RegionAttachment(name) { + RendererObject = EmptyRegion + }; + return attachment; + } + + public MeshAttachment NewMeshAttachment (Skin skin, string name, string path) { + MeshAttachment attachment = new MeshAttachment(name) { + RendererObject = EmptyRegion + }; + return attachment; + } + + public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, string name) { + return new BoundingBoxAttachment(name); + } + + public PathAttachment NewPathAttachment (Skin skin, string name) { + return new PathAttachment(name); + } + + public PointAttachment NewPointAttachment (Skin skin, string name) { + return new PointAttachment(name); + } + + public ClippingAttachment NewClippingAttachment (Skin skin, string name) { + return new ClippingAttachment(name); + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/RegionlessAttachmentLoader.cs.meta b/Assets/Spine/Assets/spine-unity/Asset Types/RegionlessAttachmentLoader.cs.meta new file mode 100644 index 0000000..5d7a368 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/RegionlessAttachmentLoader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 15f0f78b87720c047a320c5e0e3f91b7 +timeCreated: 1520505662 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs b/Assets/Spine/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs new file mode 100644 index 0000000..8891ee3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs @@ -0,0 +1,221 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.IO; +using UnityEngine; +using Spine; + +namespace Spine.Unity { + public class SkeletonDataAsset : ScriptableObject { + #region Inspector + public AtlasAsset[] atlasAssets = new AtlasAsset[0]; + #if SPINE_TK2D + public tk2dSpriteCollectionData spriteCollection; + public float scale = 1f; + #else + public float scale = 0.01f; + #endif + public TextAsset skeletonJSON; + [SpineAnimation(includeNone: false)] + public string[] fromAnimation = new string[0]; + [SpineAnimation(includeNone: false)] + public string[] toAnimation = new string[0]; + public float[] duration = new float[0]; + public float defaultMix; + public RuntimeAnimatorController controller; + + public bool IsLoaded { get { return this.skeletonData != null; } } + + void Reset () { + Clear(); + } + #endregion + + SkeletonData skeletonData; + AnimationStateData stateData; + + #region Runtime Instantiation + /// + /// Creates a runtime SkeletonDataAsset. + public static SkeletonDataAsset CreateRuntimeInstance (TextAsset skeletonDataFile, AtlasAsset atlasAsset, bool initialize, float scale = 0.01f) { + return CreateRuntimeInstance(skeletonDataFile, new [] {atlasAsset}, initialize, scale); + } + + /// + /// Creates a runtime SkeletonDataAsset. + public static SkeletonDataAsset CreateRuntimeInstance (TextAsset skeletonDataFile, AtlasAsset[] atlasAssets, bool initialize, float scale = 0.01f) { + SkeletonDataAsset skeletonDataAsset = ScriptableObject.CreateInstance(); + skeletonDataAsset.Clear(); + skeletonDataAsset.skeletonJSON = skeletonDataFile; + skeletonDataAsset.atlasAssets = atlasAssets; + skeletonDataAsset.scale = scale; + + if (initialize) + skeletonDataAsset.GetSkeletonData(true); + + return skeletonDataAsset; + } + #endregion + + public void Clear () { + skeletonData = null; + stateData = null; + } + + public SkeletonData GetSkeletonData (bool quiet) { + if (skeletonJSON == null) { + if (!quiet) + Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); + Clear(); + return null; + } + + // Disabled to support attachmentless/skinless SkeletonData. +// if (atlasAssets == null) { +// atlasAssets = new AtlasAsset[0]; +// if (!quiet) +// Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); +// Clear(); +// return null; +// } +// #if !SPINE_TK2D +// if (atlasAssets.Length == 0) { +// Clear(); +// return null; +// } +// #else +// if (atlasAssets.Length == 0 && spriteCollection == null) { +// Clear(); +// return null; +// } +// #endif + + if (skeletonData != null) + return skeletonData; + + AttachmentLoader attachmentLoader; + float skeletonDataScale; + Atlas[] atlasArray = this.GetAtlasArray(); + + #if !SPINE_TK2D + attachmentLoader = (atlasArray.Length == 0) ? (AttachmentLoader)new RegionlessAttachmentLoader() : (AttachmentLoader)new AtlasAttachmentLoader(atlasArray); + skeletonDataScale = scale; + #else + if (spriteCollection != null) { + attachmentLoader = new Spine.Unity.TK2D.SpriteCollectionAttachmentLoader(spriteCollection); + skeletonDataScale = (1.0f / (spriteCollection.invOrthoSize * spriteCollection.halfTargetHeight) * scale); + } else { + if (atlasArray.Length == 0) { + Reset(); + if (!quiet) Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); + return null; + } + attachmentLoader = new AtlasAttachmentLoader(atlasArray); + skeletonDataScale = scale; + } + #endif + + bool isBinary = skeletonJSON.name.ToLower().Contains(".skel"); + SkeletonData loadedSkeletonData; + + try { + if (isBinary) + loadedSkeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.bytes, attachmentLoader, skeletonDataScale); + else + loadedSkeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.text, attachmentLoader, skeletonDataScale); + + } catch (Exception ex) { + if (!quiet) + Debug.LogError("Error reading skeleton JSON file for SkeletonData asset: " + name + "\n" + ex.Message + "\n" + ex.StackTrace, this); + return null; + + } + + this.InitializeWithData(loadedSkeletonData); + + return skeletonData; + } + + internal void InitializeWithData (SkeletonData sd) { + this.skeletonData = sd; + this.stateData = new AnimationStateData(skeletonData); + FillStateData(); + } + + internal Atlas[] GetAtlasArray () { + var returnList = new System.Collections.Generic.List(atlasAssets.Length); + for (int i = 0; i < atlasAssets.Length; i++) { + var aa = atlasAssets[i]; + if (aa == null) continue; + var a = aa.GetAtlas(); + if (a == null) continue; + returnList.Add(a); + } + return returnList.ToArray(); + } + + internal static SkeletonData ReadSkeletonData (byte[] bytes, AttachmentLoader attachmentLoader, float scale) { + var input = new MemoryStream(bytes); + var binary = new SkeletonBinary(attachmentLoader) { + Scale = scale + }; + return binary.ReadSkeletonData(input); + } + + internal static SkeletonData ReadSkeletonData (string text, AttachmentLoader attachmentLoader, float scale) { + var input = new StringReader(text); + var json = new SkeletonJson(attachmentLoader) { + Scale = scale + }; + return json.ReadSkeletonData(input); + } + + public void FillStateData () { + if (stateData != null) { + stateData.defaultMix = defaultMix; + + for (int i = 0, n = fromAnimation.Length; i < n; i++) { + if (fromAnimation[i].Length == 0 || toAnimation[i].Length == 0) + continue; + stateData.SetMix(fromAnimation[i], toAnimation[i], duration[i]); + } + } + } + + public AnimationStateData GetAnimationStateData () { + if (stateData != null) + return stateData; + GetSkeletonData(false); + return stateData; + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs.meta b/Assets/Spine/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs.meta new file mode 100644 index 0000000..b5162ad --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Asset Types/SkeletonDataAsset.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f1b3b4b945939a54ea0b23d3396115fb +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 68defdbc95b30a74a9ad396bfc9a2277, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Components.meta b/Assets/Spine/Assets/spine-unity/Components.meta new file mode 100644 index 0000000..c8b4659 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 954179821df28404683b8289f05d0c6f +folderAsset: yes +timeCreated: 1518344191 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Components/BoneFollower.cs b/Assets/Spine/Assets/spine-unity/Components/BoneFollower.cs new file mode 100644 index 0000000..6ce6f14 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/BoneFollower.cs @@ -0,0 +1,184 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using UnityEngine; + +namespace Spine.Unity { + /// Sets a GameObject's transform to match a bone on a Spine skeleton. + [ExecuteInEditMode] + [AddComponentMenu("Spine/BoneFollower")] + public class BoneFollower : MonoBehaviour { + + #region Inspector + public SkeletonRenderer skeletonRenderer; + public SkeletonRenderer SkeletonRenderer { + get { return skeletonRenderer; } + set { + skeletonRenderer = value; + Initialize(); + } + } + + /// If a bone isn't set in code, boneName is used to find the bone at the beginning. For runtime switching by name, use SetBoneByName. You can also set the BoneFollower.bone field directly. + [SpineBone(dataField: "skeletonRenderer")] + [SerializeField] public string boneName; + + public bool followZPosition = true; + public bool followBoneRotation = true; + + [Tooltip("Follows the skeleton's flip state by controlling this Transform's local scale.")] + public bool followSkeletonFlip = true; + + [Tooltip("Follows the target bone's local scale. BoneFollower cannot inherit world/skewed scale because of UnityEngine.Transform property limitations.")] + public bool followLocalScale = false; + + [UnityEngine.Serialization.FormerlySerializedAs("resetOnAwake")] + public bool initializeOnAwake = true; + #endregion + + [NonSerialized] public bool valid; + /// + /// The bone. + /// + [NonSerialized] public Bone bone; + Transform skeletonTransform; + bool skeletonTransformIsParent; + + /// + /// Sets the target bone by its bone name. Returns false if no bone was found. To set the bone by reference, use BoneFollower.bone directly. + public bool SetBone (string name) { + bone = skeletonRenderer.skeleton.FindBone(name); + if (bone == null) { + Debug.LogError("Bone not found: " + name, this); + return false; + } + boneName = name; + return true; + } + + public void Awake () { + if (initializeOnAwake) Initialize(); + } + + public void HandleRebuildRenderer (SkeletonRenderer skeletonRenderer) { + Initialize(); + } + + public void Initialize () { + bone = null; + valid = skeletonRenderer != null && skeletonRenderer.valid; + if (!valid) return; + + skeletonTransform = skeletonRenderer.transform; + skeletonRenderer.OnRebuild -= HandleRebuildRenderer; + skeletonRenderer.OnRebuild += HandleRebuildRenderer; + skeletonTransformIsParent = Transform.ReferenceEquals(skeletonTransform, transform.parent); + + if (!string.IsNullOrEmpty(boneName)) + bone = skeletonRenderer.skeleton.FindBone(boneName); + + #if UNITY_EDITOR + if (Application.isEditor) + LateUpdate(); + #endif + } + + void OnDestroy () { + if (skeletonRenderer != null) + skeletonRenderer.OnRebuild -= HandleRebuildRenderer; + } + + public void LateUpdate () { + if (!valid) { + Initialize(); + return; + } + + #if UNITY_EDITOR + if (!Application.isPlaying) + skeletonTransformIsParent = Transform.ReferenceEquals(skeletonTransform, transform.parent); + #endif + + if (bone == null) { + if (string.IsNullOrEmpty(boneName)) return; + bone = skeletonRenderer.skeleton.FindBone(boneName); + if (!SetBone(boneName)) return; + } + + Transform thisTransform = this.transform; + if (skeletonTransformIsParent) { + // Recommended setup: Use local transform properties if Spine GameObject is the immediate parent + thisTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : thisTransform.localPosition.z); + if (followBoneRotation) { + float halfRotation = Mathf.Atan2(bone.c, bone.a) * 0.5f; + if (followLocalScale && bone.scaleX < 0) // Negate rotation from negative scaleX. Don't use negative determinant. local scaleY doesn't factor into used rotation. + halfRotation += Mathf.PI * 0.5f; + + var q = default(Quaternion); + q.z = Mathf.Sin(halfRotation); + q.w = Mathf.Cos(halfRotation); + thisTransform.localRotation = q; + } + } else { + // For special cases: Use transform world properties if transform relationship is complicated + Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f)); + if (!followZPosition) targetWorldPosition.z = thisTransform.position.z; + + float boneWorldRotation = bone.WorldRotationX; + + Transform transformParent = thisTransform.parent; + if (transformParent != null) { + Matrix4x4 m = transformParent.localToWorldMatrix; + if (m.m00 * m.m11 - m.m01 * m.m10 < 0) // Determinant2D is negative + boneWorldRotation = -boneWorldRotation; + } + + if (followBoneRotation) { + Vector3 worldRotation = skeletonTransform.rotation.eulerAngles; + if (followLocalScale && bone.scaleX < 0) boneWorldRotation += 180f; + #if UNITY_5_6_OR_NEWER + thisTransform.SetPositionAndRotation(targetWorldPosition, Quaternion.Euler(worldRotation.x, worldRotation.y, worldRotation.z + boneWorldRotation)); + #else + thisTransform.position = targetWorldPosition; + thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, worldRotation.z + bone.WorldRotationX); + #endif + } else { + thisTransform.position = targetWorldPosition; + } + } + + Vector3 localScale = followLocalScale ? new Vector3(bone.scaleX, bone.scaleY, 1f) : new Vector3(1f, 1f, 1f); + if (followSkeletonFlip) localScale.y *= bone.skeleton.flipX ^ bone.skeleton.flipY ? -1f : 1f; + thisTransform.localScale = localScale; + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Components/BoneFollower.cs.meta b/Assets/Spine/Assets/spine-unity/Components/BoneFollower.cs.meta new file mode 100644 index 0000000..c5bb78c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/BoneFollower.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a1fd8daaed7b64148a34acb96ba14ce1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Components/PointFollower.cs b/Assets/Spine/Assets/spine-unity/Components/PointFollower.cs new file mode 100644 index 0000000..e685985 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/PointFollower.cs @@ -0,0 +1,154 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Spine.Unity { + + [ExecuteInEditMode] + [AddComponentMenu("Spine/Point Follower")] + public class PointFollower : MonoBehaviour, IHasSkeletonRenderer, IHasSkeletonComponent { + + [SerializeField] public SkeletonRenderer skeletonRenderer; + public SkeletonRenderer SkeletonRenderer { get { return this.skeletonRenderer; } } + public ISkeletonComponent SkeletonComponent { get { return skeletonRenderer as ISkeletonComponent; } } + + [SpineSlot(dataField:"skeletonRenderer", includeNone: true)] + public string slotName; + + [SpineAttachment(slotField:"slotName", dataField: "skeletonRenderer", fallbackToTextField:true, includeNone: true)] + public string pointAttachmentName; + + public bool followRotation = true; + public bool followSkeletonFlip = true; + public bool followSkeletonZPosition = false; + + Transform skeletonTransform; + bool skeletonTransformIsParent; + PointAttachment point; + Bone bone; + bool valid; + public bool IsValid { get { return valid; } } + + public void Initialize () { + valid = skeletonRenderer != null && skeletonRenderer.valid; + if (!valid) + return; + + UpdateReferences(); + + #if UNITY_EDITOR + if (Application.isEditor) LateUpdate(); + #endif + } + + private void HandleRebuildRenderer (SkeletonRenderer skeletonRenderer) { + Initialize(); + } + + void UpdateReferences () { + skeletonTransform = skeletonRenderer.transform; + skeletonRenderer.OnRebuild -= HandleRebuildRenderer; + skeletonRenderer.OnRebuild += HandleRebuildRenderer; + skeletonTransformIsParent = Transform.ReferenceEquals(skeletonTransform, transform.parent); + + bone = null; + point = null; + if (!string.IsNullOrEmpty(pointAttachmentName)) { + var skeleton = skeletonRenderer.skeleton; + + int slotIndex = skeleton.FindSlotIndex(slotName); + if (slotIndex >= 0) { + var slot = skeleton.slots.Items[slotIndex]; + bone = slot.bone; + point = skeleton.GetAttachment(slotIndex, pointAttachmentName) as PointAttachment; + } + } + } + + public void LateUpdate () { + #if UNITY_EDITOR + if (!Application.isPlaying) skeletonTransformIsParent = Transform.ReferenceEquals(skeletonTransform, transform.parent); + #endif + + if (point == null) { + if (string.IsNullOrEmpty(pointAttachmentName)) return; + UpdateReferences(); + if (point == null) return; + } + + Vector2 worldPos; + point.ComputeWorldPosition(bone, out worldPos.x, out worldPos.y); + float rotation = point.ComputeWorldRotation(bone); + + Transform thisTransform = this.transform; + if (skeletonTransformIsParent) { + // Recommended setup: Use local transform properties if Spine GameObject is the immediate parent + thisTransform.localPosition = new Vector3(worldPos.x, worldPos.y, followSkeletonZPosition ? 0f : thisTransform.localPosition.z); + if (followRotation) { + float halfRotation = rotation * 0.5f * Mathf.Deg2Rad; + + var q = default(Quaternion); + q.z = Mathf.Sin(halfRotation); + q.w = Mathf.Cos(halfRotation); + thisTransform.localRotation = q; + } + } else { + // For special cases: Use transform world properties if transform relationship is complicated + Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(worldPos.x, worldPos.y, 0f)); + if (!followSkeletonZPosition) + targetWorldPosition.z = thisTransform.position.z; + + Transform transformParent = thisTransform.parent; + if (transformParent != null) { + Matrix4x4 m = transformParent.localToWorldMatrix; + if (m.m00 * m.m11 - m.m01 * m.m10 < 0) // Determinant2D is negative + rotation = -rotation; + } + + if (followRotation) { + Vector3 transformWorldRotation = skeletonTransform.rotation.eulerAngles; + thisTransform.position = targetWorldPosition; + thisTransform.rotation = Quaternion.Euler(transformWorldRotation.x, transformWorldRotation.y, transformWorldRotation.z + rotation); + } else { + thisTransform.position = targetWorldPosition; + } + } + + if (followSkeletonFlip) { + Vector3 localScale = thisTransform.localScale; + localScale.y = Mathf.Abs(localScale.y) * (bone.skeleton.flipX ^ bone.skeleton.flipY ? -1f : 1f); + thisTransform.localScale = localScale; + } + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Components/PointFollower.cs.meta b/Assets/Spine/Assets/spine-unity/Components/PointFollower.cs.meta new file mode 100644 index 0000000..1af3893 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/PointFollower.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: daf461e4341180341a648c07e1899528 +timeCreated: 1518094986 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimation.cs b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimation.cs new file mode 100644 index 0000000..5fb6ee0 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimation.cs @@ -0,0 +1,210 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; + +namespace Spine.Unity { + + [ExecuteInEditMode] + [AddComponentMenu("Spine/SkeletonAnimation")] + [UnityEngine.HelpURL("http://esotericsoftware.com/spine-unity-documentation#Controlling-Animation")] + public class SkeletonAnimation : SkeletonRenderer, ISkeletonAnimation, IAnimationStateComponent { + + #region IAnimationStateComponent + /// + /// This is the Spine.AnimationState object of this SkeletonAnimation. You can control animations through it. + /// Note that this object, like .skeleton, is not guaranteed to exist in Awake. Do all accesses and caching to it in Start + public Spine.AnimationState state; + /// + /// This is the Spine.AnimationState object of this SkeletonAnimation. You can control animations through it. + /// Note that this object, like .skeleton, is not guaranteed to exist in Awake. Do all accesses and caching to it in Start + public Spine.AnimationState AnimationState { get { return this.state; } } + #endregion + + #region Bone Callbacks ISkeletonAnimation + protected event UpdateBonesDelegate _UpdateLocal; + protected event UpdateBonesDelegate _UpdateWorld; + protected event UpdateBonesDelegate _UpdateComplete; + + /// + /// Occurs after the animations are applied and before world space values are resolved. + /// Use this callback when you want to set bone local values. + /// + public event UpdateBonesDelegate UpdateLocal { add { _UpdateLocal += value; } remove { _UpdateLocal -= value; } } + + /// + /// Occurs after the Skeleton's bone world space values are resolved (including all constraints). + /// Using this callback will cause the world space values to be solved an extra time. + /// Use this callback if want to use bone world space values, and also set bone local values. + public event UpdateBonesDelegate UpdateWorld { add { _UpdateWorld += value; } remove { _UpdateWorld -= value; } } + + /// + /// Occurs after the Skeleton's bone world space values are resolved (including all constraints). + /// Use this callback if you want to use bone world space values, but don't intend to modify bone local values. + /// This callback can also be used when setting world position and the bone matrix. + public event UpdateBonesDelegate UpdateComplete { add { _UpdateComplete += value; } remove { _UpdateComplete -= value; } } + #endregion + + #region Serialized state and Beginner API + [SerializeField] + [SpineAnimation] + private string _animationName; + + /// + /// Setting this property sets the animation of the skeleton. If invalid, it will store the animation name for the next time the skeleton is properly initialized. + /// Getting this property gets the name of the currently playing animation. If invalid, it will return the last stored animation name set through this property. + public string AnimationName { + get { + if (!valid) { + return _animationName; + } else { + TrackEntry entry = state.GetCurrent(0); + return entry == null ? null : entry.Animation.Name; + } + } + set { + if (_animationName == value) + return; + _animationName = value; + + if (string.IsNullOrEmpty(value)) { + state.ClearTrack(0); + } else { + TrySetAnimation(value, loop); + } + } + } + + TrackEntry TrySetAnimation (string animationName, bool animationLoop) { + var animationObject = skeletonDataAsset.GetSkeletonData(false).FindAnimation(animationName); + if (animationObject != null) + return state.SetAnimation(0, animationObject, animationLoop); + + return null; + } + + /// Whether or not should loop. This only applies to the initial animation specified in the inspector, or any subsequent Animations played through .AnimationName. Animations set through state.SetAnimation are unaffected. + public bool loop; + + /// + /// The rate at which animations progress over time. 1 means 100%. 0.5 means 50%. + /// AnimationState and TrackEntry also have their own timeScale. These are combined multiplicatively. + public float timeScale = 1; + #endregion + + #region Runtime Instantiation + /// Adds and prepares a SkeletonAnimation component to a GameObject at runtime. + /// The newly instantiated SkeletonAnimation + public static SkeletonAnimation AddToGameObject (GameObject gameObject, SkeletonDataAsset skeletonDataAsset) { + return SkeletonRenderer.AddSpineComponent(gameObject, skeletonDataAsset); + } + + /// Instantiates a new UnityEngine.GameObject and adds a prepared SkeletonAnimation component to it. + /// The newly instantiated SkeletonAnimation component. + public static SkeletonAnimation NewSkeletonAnimationGameObject (SkeletonDataAsset skeletonDataAsset) { + return SkeletonRenderer.NewSpineGameObject(skeletonDataAsset); + } + #endregion + + /// + /// Clears the previously generated mesh, resets the skeleton's pose, and clears all previously active animations. + public override void ClearState () { + base.ClearState(); + if (state != null) state.ClearTracks(); + } + + /// + /// Initialize this component. Attempts to load the SkeletonData and creates the internal Spine objects and buffers. + /// If set to true, force overwrite an already initialized object. + public override void Initialize (bool overwrite) { + if (valid && !overwrite) + return; + + base.Initialize(overwrite); + + if (!valid) + return; + + state = new Spine.AnimationState(skeletonDataAsset.GetAnimationStateData()); + + #if UNITY_EDITOR + if (!string.IsNullOrEmpty(_animationName)) { + if (Application.isPlaying) { + TrackEntry startingTrack = TrySetAnimation(_animationName, loop); + if (startingTrack != null) + Update(0); + } else { + // Assume SkeletonAnimation is valid for skeletonData and skeleton. Checked above. + var animationObject = skeletonDataAsset.GetSkeletonData(false).FindAnimation(_animationName); + if (animationObject != null) + animationObject.PoseSkeleton(skeleton, 0f); + } + } + #else + if (!string.IsNullOrEmpty(_animationName)) { + TrackEntry startingTrack = TrySetAnimation(_animationName, loop); + if (startingTrack != null) + Update(0); + } + #endif + } + + void Update () { + Update(Time.deltaTime); + } + + /// Progresses the AnimationState according to the given deltaTime, and applies it to the Skeleton. Use Time.deltaTime to update manually. Use deltaTime 0 to update without progressing the time. + public void Update (float deltaTime) { + if (!valid) + return; + + deltaTime *= timeScale; + skeleton.Update(deltaTime); + state.Update(deltaTime); + state.Apply(skeleton); + + if (_UpdateLocal != null) + _UpdateLocal(this); + + skeleton.UpdateWorldTransform(); + + if (_UpdateWorld != null) { + _UpdateWorld(this); + skeleton.UpdateWorldTransform(); + } + + if (_UpdateComplete != null) { + _UpdateComplete(this); + } + } + + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimation.cs.meta b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimation.cs.meta new file mode 100644 index 0000000..23ede7b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimation.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d247ba06193faa74d9335f5481b2b56c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimator.cs b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimator.cs new file mode 100644 index 0000000..adec258 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimator.cs @@ -0,0 +1,463 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections.Generic; + +namespace Spine.Unity { + [RequireComponent(typeof(Animator))] + public class SkeletonAnimator : SkeletonRenderer, ISkeletonAnimation { + + [SerializeField] protected MecanimTranslator translator; + public MecanimTranslator Translator { get { return translator; } } + + #region Bone Callbacks (ISkeletonAnimation) + protected event UpdateBonesDelegate _UpdateLocal; + protected event UpdateBonesDelegate _UpdateWorld; + protected event UpdateBonesDelegate _UpdateComplete; + + /// + /// Occurs after the animations are applied and before world space values are resolved. + /// Use this callback when you want to set bone local values. + public event UpdateBonesDelegate UpdateLocal { add { _UpdateLocal += value; } remove { _UpdateLocal -= value; } } + + /// + /// Occurs after the Skeleton's bone world space values are resolved (including all constraints). + /// Using this callback will cause the world space values to be solved an extra time. + /// Use this callback if want to use bone world space values, and also set bone local values. + public event UpdateBonesDelegate UpdateWorld { add { _UpdateWorld += value; } remove { _UpdateWorld -= value; } } + + /// + /// Occurs after the Skeleton's bone world space values are resolved (including all constraints). + /// Use this callback if you want to use bone world space values, but don't intend to modify bone local values. + /// This callback can also be used when setting world position and the bone matrix. + public event UpdateBonesDelegate UpdateComplete { add { _UpdateComplete += value; } remove { _UpdateComplete -= value; } } + #endregion + + public override void Initialize (bool overwrite) { + if (valid && !overwrite) return; + base.Initialize(overwrite); + if (!valid) return; + + if (translator == null) translator = new MecanimTranslator(); + translator.Initialize(GetComponent(), this.skeletonDataAsset); + } + + public void Update () { + if (!valid) return; + + #if UNITY_EDITOR + if (Application.isPlaying) { + translator.Apply(skeleton); + } else { + var translatorAnimator = translator.Animator; + if (translatorAnimator != null && translatorAnimator.isInitialized) + translator.Apply(skeleton); + } + #else + translator.Apply(skeleton); + #endif + + // UpdateWorldTransform and Bone Callbacks + { + if (_UpdateLocal != null) + _UpdateLocal(this); + + skeleton.UpdateWorldTransform(); + + if (_UpdateWorld != null) { + _UpdateWorld(this); + skeleton.UpdateWorldTransform(); + } + + if (_UpdateComplete != null) + _UpdateComplete(this); + } + } + + [System.Serializable] + public class MecanimTranslator { + #region Inspector + public bool autoReset = true; + public MixMode[] layerMixModes = new MixMode[0]; + #endregion + + public enum MixMode { AlwaysMix, MixNext, SpineStyle } + + readonly Dictionary animationTable = new Dictionary(IntEqualityComparer.Instance); + readonly Dictionary clipNameHashCodeTable = new Dictionary(AnimationClipEqualityComparer.Instance); + readonly List previousAnimations = new List(); + + protected class ClipInfos { + public bool isInterruptionActive = false; + public bool isLastFrameOfInterruption = false; + + public int clipInfoCount = 0; + public int nextClipInfoCount = 0; + public int interruptingClipInfoCount = 0; + public readonly List clipInfos = new List(); + public readonly List nextClipInfos = new List(); + public readonly List interruptingClipInfos = new List(); + + public AnimatorStateInfo stateInfo; + public AnimatorStateInfo nextStateInfo; + public AnimatorStateInfo interruptingStateInfo; + + public float interruptingClipTimeAddition = 0; + } + protected ClipInfos[] layerClipInfos = new ClipInfos[0]; + + Animator animator; + public Animator Animator { get { return this.animator; } } + + public void Initialize(Animator animator, SkeletonDataAsset skeletonDataAsset) { + this.animator = animator; + + previousAnimations.Clear(); + + animationTable.Clear(); + var data = skeletonDataAsset.GetSkeletonData(true); + foreach (var a in data.Animations) + animationTable.Add(a.Name.GetHashCode(), a); + + clipNameHashCodeTable.Clear(); + ClearClipInfosForLayers(); + } + + public void Apply(Skeleton skeleton) { + if (layerMixModes.Length < animator.layerCount) + System.Array.Resize(ref layerMixModes, animator.layerCount); + + InitClipInfosForLayers(); + for (int layer = 0, n = animator.layerCount; layer < n; layer++) { + GetStateUpdatesFromAnimator(layer); + } + + //skeleton.Update(Time.deltaTime); // Doesn't actually do anything, currently. (Spine 3.6). + + // Clear Previous + if (autoReset) { + var previousAnimations = this.previousAnimations; + for (int i = 0, n = previousAnimations.Count; i < n; i++) + previousAnimations[i].SetKeyedItemsToSetupPose(skeleton); + + previousAnimations.Clear(); + for (int layer = 0, n = animator.layerCount; layer < n; layer++) { + float layerWeight = (layer == 0) ? 1 : animator.GetLayerWeight(layer); // Animator.GetLayerWeight always returns 0 on the first layer. Should be interpreted as 1. + if (layerWeight <= 0) continue; + + AnimatorStateInfo nextStateInfo = animator.GetNextAnimatorStateInfo(layer); + + bool hasNext = nextStateInfo.fullPathHash != 0; + + int clipInfoCount, nextClipInfoCount, interruptingClipInfoCount; + IList clipInfo, nextClipInfo, interruptingClipInfo; + bool isInterruptionActive, shallInterpolateWeightTo1; + GetAnimatorClipInfos(layer, out isInterruptionActive, out clipInfoCount, out nextClipInfoCount, out interruptingClipInfoCount, + out clipInfo, out nextClipInfo, out interruptingClipInfo, out shallInterpolateWeightTo1); + + for (int c = 0; c < clipInfoCount; c++) { + var info = clipInfo[c]; + float weight = info.weight * layerWeight; if (weight == 0) continue; + previousAnimations.Add(GetAnimation(info.clip)); + } + + if (hasNext) { + for (int c = 0; c < nextClipInfoCount; c++) { + var info = nextClipInfo[c]; + float weight = info.weight * layerWeight; if (weight == 0) continue; + previousAnimations.Add(GetAnimation(info.clip)); + } + } + + if (isInterruptionActive) { + for (int c = 0; c < interruptingClipInfoCount; c++) + { + var info = interruptingClipInfo[c]; + float clipWeight = shallInterpolateWeightTo1 ? (info.weight + 1.0f) * 0.5f : info.weight; + float weight = clipWeight * layerWeight; if (weight == 0) continue; + previousAnimations.Add(GetAnimation(info.clip)); + } + } + } + } + + // Apply + for (int layer = 0, n = animator.layerCount; layer < n; layer++) { + float layerWeight = (layer == 0) ? 1 : animator.GetLayerWeight(layer); // Animator.GetLayerWeight always returns 0 on the first layer. Should be interpreted as 1. + + bool isInterruptionActive; + AnimatorStateInfo stateInfo; + AnimatorStateInfo nextStateInfo; + AnimatorStateInfo interruptingStateInfo; + float interruptingClipTimeAddition; + GetAnimatorStateInfos(layer, out isInterruptionActive, out stateInfo, out nextStateInfo, out interruptingStateInfo, out interruptingClipTimeAddition); + + bool hasNext = nextStateInfo.fullPathHash != 0; + + int clipInfoCount, nextClipInfoCount, interruptingClipInfoCount; + IList clipInfo, nextClipInfo, interruptingClipInfo; + bool shallInterpolateWeightTo1; + GetAnimatorClipInfos(layer, out isInterruptionActive, out clipInfoCount, out nextClipInfoCount, out interruptingClipInfoCount, + out clipInfo, out nextClipInfo, out interruptingClipInfo, out shallInterpolateWeightTo1); + + MixMode mode = layerMixModes[layer]; + if (mode == MixMode.AlwaysMix) { + // Always use Mix instead of Applying the first non-zero weighted clip. + for (int c = 0; c < clipInfoCount; c++) { + var info = clipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(stateInfo.normalizedTime, info.clip.length, stateInfo.loop, stateInfo.speed < 0), stateInfo.loop, null, weight, MixPose.Current, MixDirection.In); + } + if (hasNext) { + for (int c = 0; c < nextClipInfoCount; c++) { + var info = nextClipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(nextStateInfo.normalizedTime, info.clip.length, nextStateInfo.speed < 0), nextStateInfo.loop, null, weight, MixPose.Current, MixDirection.In); + } + } + if (isInterruptionActive) { + for (int c = 0; c < interruptingClipInfoCount; c++) + { + var info = interruptingClipInfo[c]; + float clipWeight = shallInterpolateWeightTo1 ? (info.weight + 1.0f) * 0.5f : info.weight; + float weight = clipWeight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(interruptingStateInfo.normalizedTime + interruptingClipTimeAddition, info.clip.length, interruptingStateInfo.speed < 0), + interruptingStateInfo.loop, null, weight, MixPose.Current, MixDirection.In); + } + } + } else { // case MixNext || SpineStyle + // Apply first non-zero weighted clip + int c = 0; + for (; c < clipInfoCount; c++) { + var info = clipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(stateInfo.normalizedTime, info.clip.length, stateInfo.loop, stateInfo.speed < 0), stateInfo.loop, null, 1f, MixPose.Current, MixDirection.In); + break; + } + // Mix the rest + for (; c < clipInfoCount; c++) { + var info = clipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(stateInfo.normalizedTime, info.clip.length, stateInfo.loop, stateInfo.speed < 0), stateInfo.loop, null, weight, MixPose.Current, MixDirection.In); + } + + c = 0; + if (hasNext) { + // Apply next clip directly instead of mixing (ie: no crossfade, ignores mecanim transition weights) + if (mode == MixMode.SpineStyle) { + for (; c < nextClipInfoCount; c++) { + var info = nextClipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(nextStateInfo.normalizedTime , info.clip.length, nextStateInfo.speed < 0), nextStateInfo.loop, null, 1f, MixPose.Current, MixDirection.In); + break; + } + } + // Mix the rest + for (; c < nextClipInfoCount; c++) { + var info = nextClipInfo[c]; float weight = info.weight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(nextStateInfo.normalizedTime , info.clip.length, nextStateInfo.speed < 0), nextStateInfo.loop, null, weight, MixPose.Current, MixDirection.In); + } + } + + c = 0; + if (isInterruptionActive) { + // Apply next clip directly instead of mixing (ie: no crossfade, ignores mecanim transition weights) + if (mode == MixMode.SpineStyle) { + for (; c < interruptingClipInfoCount; c++) { + var info = interruptingClipInfo[c]; float clipWeight = shallInterpolateWeightTo1 ? (info.weight + 1.0f) * 0.5f : info.weight; + float weight = clipWeight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(interruptingStateInfo.normalizedTime + interruptingClipTimeAddition, info.clip.length, interruptingStateInfo.speed < 0), interruptingStateInfo.loop, null, 1f, MixPose.Current, MixDirection.In); + break; + } + } + // Mix the rest + for (; c < interruptingClipInfoCount; c++) { + var info = interruptingClipInfo[c]; float clipWeight = shallInterpolateWeightTo1 ? (info.weight + 1.0f) * 0.5f : info.weight; + float weight = clipWeight * layerWeight; if (weight == 0) continue; + GetAnimation(info.clip).Apply(skeleton, 0, AnimationTime(interruptingStateInfo.normalizedTime + interruptingClipTimeAddition, info.clip.length, interruptingStateInfo.speed < 0), interruptingStateInfo.loop, null, weight, MixPose.Current, MixDirection.In); + } + } + } + } + } + + static float AnimationTime(float normalizedTime, float clipLength, bool loop, bool reversed) { + if (reversed) + normalizedTime = (1 - normalizedTime + (int)normalizedTime) + (int)normalizedTime; + float time = normalizedTime * clipLength; + if (loop) return time; + const float EndSnapEpsilon = 1f / 30f; // Workaround for end-duration keys not being applied. + return (clipLength - time < EndSnapEpsilon) ? clipLength : time; // return a time snapped to clipLength; + } + + static float AnimationTime(float normalizedTime, float clipLength, bool reversed) { + if (reversed) + normalizedTime = (1 - normalizedTime + (int)normalizedTime) + (int)normalizedTime; + + return normalizedTime * clipLength; + } + + void InitClipInfosForLayers() { + if (layerClipInfos.Length < animator.layerCount) { + System.Array.Resize(ref layerClipInfos, animator.layerCount); + for (int layer = 0, n = animator.layerCount; layer < n; ++layer) { + if (layerClipInfos[layer] == null) + layerClipInfos[layer] = new ClipInfos(); + } + } + } + + void ClearClipInfosForLayers() { + for (int layer = 0, n = layerClipInfos.Length; layer < n; ++layer) { + if (layerClipInfos[layer] == null) + layerClipInfos[layer] = new ClipInfos(); + else { + layerClipInfos[layer].isInterruptionActive = false; + layerClipInfos[layer].isLastFrameOfInterruption = false; + layerClipInfos[layer].clipInfos.Clear(); + layerClipInfos[layer].nextClipInfos.Clear(); + layerClipInfos[layer].interruptingClipInfos.Clear(); + } + } + } + + void GetStateUpdatesFromAnimator(int layer) { + + var layerInfos = layerClipInfos[layer]; + int clipInfoCount = animator.GetCurrentAnimatorClipInfoCount(layer); + int nextClipInfoCount = animator.GetNextAnimatorClipInfoCount(layer); + + var clipInfos = layerInfos.clipInfos; + var nextClipInfos = layerInfos.nextClipInfos; + var interruptingClipInfos = layerInfos.interruptingClipInfos; + + layerInfos.isInterruptionActive = (clipInfoCount == 0 && nextClipInfoCount == 0); + + // Note: during interruption, GetCurrentAnimatorClipInfoCount and GetNextAnimatorClipInfoCount + // are returning 0 in calls above. Therefore we keep previous clipInfos and nextClipInfos + // until the interruption is over. + if (layerInfos.isInterruptionActive) { + + // Note: The last frame of a transition interruption + // will have fullPathHash set to 0, therefore we have to use previous + // frame's infos about interruption clips and correct some values + // accordingly (normalizedTime and weight). + var interruptingStateInfo = animator.GetNextAnimatorStateInfo(layer); + layerInfos.isLastFrameOfInterruption = interruptingStateInfo.fullPathHash == 0; + if (!layerInfos.isLastFrameOfInterruption) { + layerInfos.interruptingClipInfoCount = interruptingClipInfos.Count; + + animator.GetNextAnimatorClipInfo(layer, interruptingClipInfos); + float oldTime = layerInfos.interruptingStateInfo.normalizedTime; + float newTime = interruptingStateInfo.normalizedTime; + layerInfos.interruptingClipTimeAddition = newTime - oldTime; + layerInfos.interruptingStateInfo = interruptingStateInfo; + } + } + else { + layerInfos.clipInfoCount = clipInfoCount; + layerInfos.nextClipInfoCount = nextClipInfoCount; + layerInfos.interruptingClipInfoCount = 0; + layerInfos.isLastFrameOfInterruption = false; + + if (clipInfos.Capacity < clipInfoCount) clipInfos.Capacity = clipInfoCount; + if (nextClipInfos.Capacity < nextClipInfoCount) nextClipInfos.Capacity = nextClipInfoCount; + + animator.GetCurrentAnimatorClipInfo(layer, clipInfos); + animator.GetNextAnimatorClipInfo(layer, nextClipInfos); + + layerInfos.stateInfo = animator.GetCurrentAnimatorStateInfo(layer); + layerInfos.nextStateInfo = animator.GetNextAnimatorStateInfo(layer); + } + } + + void GetAnimatorClipInfos ( + int layer, + out bool isInterruptionActive, + out int clipInfoCount, + out int nextClipInfoCount, + out int interruptingClipInfoCount, + out IList clipInfo, + out IList nextClipInfo, + out IList interruptingClipInfo, + out bool shallInterpolateWeightTo1) { + + var layerInfos = layerClipInfos[layer]; + isInterruptionActive = layerInfos.isInterruptionActive; + + clipInfoCount = layerInfos.clipInfoCount; + nextClipInfoCount = layerInfos.nextClipInfoCount; + interruptingClipInfoCount = layerInfos.interruptingClipInfoCount; + + clipInfo = layerInfos.clipInfos; + nextClipInfo = layerInfos.nextClipInfos; + interruptingClipInfo = isInterruptionActive ? layerInfos.interruptingClipInfos : null; + shallInterpolateWeightTo1 = layerInfos.isLastFrameOfInterruption; + } + + void GetAnimatorStateInfos( + int layer, + out bool isInterruptionActive, + out AnimatorStateInfo stateInfo, + out AnimatorStateInfo nextStateInfo, + out AnimatorStateInfo interruptingStateInfo, + out float interruptingClipTimeAddition) { + + var layerInfos = layerClipInfos[layer]; + isInterruptionActive = layerInfos.isInterruptionActive; + + stateInfo = layerInfos.stateInfo; + nextStateInfo = layerInfos.nextStateInfo; + interruptingStateInfo = layerInfos.interruptingStateInfo; + interruptingClipTimeAddition = layerInfos.isLastFrameOfInterruption ? layerInfos.interruptingClipTimeAddition : 0; + } + + Spine.Animation GetAnimation (AnimationClip clip) { + int clipNameHashCode; + if (!clipNameHashCodeTable.TryGetValue(clip, out clipNameHashCode)) { + clipNameHashCode = clip.name.GetHashCode(); + clipNameHashCodeTable.Add(clip, clipNameHashCode); + } + Spine.Animation animation; + animationTable.TryGetValue(clipNameHashCode, out animation); + return animation; + } + + class AnimationClipEqualityComparer : IEqualityComparer { + internal static readonly IEqualityComparer Instance = new AnimationClipEqualityComparer(); + public bool Equals (AnimationClip x, AnimationClip y) { return x.GetInstanceID() == y.GetInstanceID(); } + public int GetHashCode (AnimationClip o) { return o.GetInstanceID(); } + } + + class IntEqualityComparer : IEqualityComparer { + internal static readonly IEqualityComparer Instance = new IntEqualityComparer(); + public bool Equals (int x, int y) { return x == y; } + public int GetHashCode(int o) { return o; } + } + } + + } +} diff --git a/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimator.cs.meta b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimator.cs.meta new file mode 100644 index 0000000..ebd50dc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/SkeletonAnimator.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f9db98c60740638449864eb028fbe7ad +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Components/SkeletonRenderer.cs b/Assets/Spine/Assets/spine-unity/Components/SkeletonRenderer.cs new file mode 100644 index 0000000..109ec31 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/SkeletonRenderer.cs @@ -0,0 +1,331 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define SPINE_OPTIONAL_RENDEROVERRIDE +#define SPINE_OPTIONAL_MATERIALOVERRIDE + +using System.Collections.Generic; +using UnityEngine; + +namespace Spine.Unity { + /// Renders a skeleton. + [ExecuteInEditMode, RequireComponent(typeof(MeshFilter), typeof(MeshRenderer)), DisallowMultipleComponent] + [UnityEngine.HelpURL("http://esotericsoftware.com/spine-unity-documentation#Rendering")] + public class SkeletonRenderer : MonoBehaviour, ISkeletonComponent, IHasSkeletonDataAsset { + + public delegate void SkeletonRendererDelegate (SkeletonRenderer skeletonRenderer); + public event SkeletonRendererDelegate OnRebuild; + + /// Occurs after the vertex data is populated every frame, before the vertices are pushed into the mesh. + public event Spine.Unity.MeshGeneratorDelegate OnPostProcessVertices; + + public SkeletonDataAsset skeletonDataAsset; + public SkeletonDataAsset SkeletonDataAsset { get { return skeletonDataAsset; } } // ISkeletonComponent + public string initialSkinName; + public bool initialFlipX, initialFlipY; + + #region Advanced + // Submesh Separation + [UnityEngine.Serialization.FormerlySerializedAs("submeshSeparators")] [SpineSlot] public string[] separatorSlotNames = new string[0]; + [System.NonSerialized] public readonly List separatorSlots = new List(); + + [Range(-0.1f, 0f)] public float zSpacing; + //public bool renderMeshes = true; + public bool useClipping = true; + public bool immutableTriangles = false; + public bool pmaVertexColors = true; + /// Clears the state when this component or its GameObject is disabled. This prevents previous state from being retained when it is enabled again. When pooling your skeleton, setting this to true can be helpful. + public bool clearStateOnDisable = false; + public bool tintBlack = false; + public bool singleSubmesh = false; + + [UnityEngine.Serialization.FormerlySerializedAs("calculateNormals")] + public bool addNormals = false; + public bool calculateTangents = false; + + public bool logErrors = false; + + #if SPINE_OPTIONAL_RENDEROVERRIDE + public bool disableRenderingOnOverride = true; + public delegate void InstructionDelegate (SkeletonRendererInstruction instruction); + event InstructionDelegate generateMeshOverride; + public event InstructionDelegate GenerateMeshOverride { + add { + generateMeshOverride += value; + if (disableRenderingOnOverride && generateMeshOverride != null) { + Initialize(false); + meshRenderer.enabled = false; + } + } + remove { + generateMeshOverride -= value; + if (disableRenderingOnOverride && generateMeshOverride == null) { + Initialize(false); + meshRenderer.enabled = true; + } + } + } + #endif + + #if SPINE_OPTIONAL_MATERIALOVERRIDE + [System.NonSerialized] readonly Dictionary customMaterialOverride = new Dictionary(); + public Dictionary CustomMaterialOverride { get { return customMaterialOverride; } } + #endif + + // Custom Slot Material + [System.NonSerialized] readonly Dictionary customSlotMaterials = new Dictionary(); + public Dictionary CustomSlotMaterials { get { return customSlotMaterials; } } + #endregion + + MeshRenderer meshRenderer; + MeshFilter meshFilter; + + [System.NonSerialized] public bool valid; + [System.NonSerialized] public Skeleton skeleton; + public Skeleton Skeleton { + get { + Initialize(false); + return skeleton; + } + } + + [System.NonSerialized] readonly SkeletonRendererInstruction currentInstructions = new SkeletonRendererInstruction(); + readonly MeshGenerator meshGenerator = new MeshGenerator(); + [System.NonSerialized] readonly MeshRendererBuffers rendererBuffers = new MeshRendererBuffers(); + + #region Runtime Instantiation + public static T NewSpineGameObject (SkeletonDataAsset skeletonDataAsset) where T : SkeletonRenderer { + return SkeletonRenderer.AddSpineComponent(new GameObject("New Spine GameObject"), skeletonDataAsset); + } + + /// Add and prepare a Spine component that derives from SkeletonRenderer to a GameObject at runtime. + /// T should be SkeletonRenderer or any of its derived classes. + public static T AddSpineComponent (GameObject gameObject, SkeletonDataAsset skeletonDataAsset) where T : SkeletonRenderer { + var c = gameObject.AddComponent(); + if (skeletonDataAsset != null) { + c.skeletonDataAsset = skeletonDataAsset; + c.Initialize(false); + } + return c; + } + + /// Applies MeshGenerator settings to the SkeletonRenderer and its internal MeshGenerator. + public void SetMeshSettings (MeshGenerator.Settings settings) { + this.calculateTangents = settings.calculateTangents; + this.immutableTriangles = settings.immutableTriangles; + this.pmaVertexColors = settings.pmaVertexColors; + this.tintBlack = settings.tintBlack; + this.useClipping = settings.useClipping; + this.zSpacing = settings.zSpacing; + + this.meshGenerator.settings = settings; + } + #endregion + + public virtual void Awake () { + Initialize(false); + } + + void OnDisable () { + if (clearStateOnDisable && valid) + ClearState(); + } + + void OnDestroy () { + rendererBuffers.Dispose(); + valid = false; + } + + /// + /// Clears the previously generated mesh and resets the skeleton's pose. + public virtual void ClearState () { + meshFilter.sharedMesh = null; + currentInstructions.Clear(); + if (skeleton != null) skeleton.SetToSetupPose(); + } + + public void EnsureMeshGeneratorCapacity (int minimumVertexCount) { + meshGenerator.EnsureVertexCapacity(minimumVertexCount); + } + + /// + /// Initialize this component. Attempts to load the SkeletonData and creates the internal Skeleton object and buffers. + /// If set to true, it will overwrite internal objects if they were already generated. Otherwise, the initialized component will ignore subsequent calls to initialize. + public virtual void Initialize (bool overwrite) { + if (valid && !overwrite) + return; + + // Clear + { + if (meshFilter != null) + meshFilter.sharedMesh = null; + + meshRenderer = GetComponent(); + if (meshRenderer != null) meshRenderer.sharedMaterial = null; + + currentInstructions.Clear(); + rendererBuffers.Clear(); + meshGenerator.Begin(); + skeleton = null; + valid = false; + } + + if (!skeletonDataAsset) { + if (logErrors) Debug.LogError("Missing SkeletonData asset.", this); + return; + } + + SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(false); + if (skeletonData == null) return; + valid = true; + + meshFilter = GetComponent(); + meshRenderer = GetComponent(); + rendererBuffers.Initialize(); + + skeleton = new Skeleton(skeletonData) { + flipX = initialFlipX, + flipY = initialFlipY + }; + + if (!string.IsNullOrEmpty(initialSkinName) && !string.Equals(initialSkinName, "default", System.StringComparison.Ordinal)) + skeleton.SetSkin(initialSkinName); + + separatorSlots.Clear(); + for (int i = 0; i < separatorSlotNames.Length; i++) + separatorSlots.Add(skeleton.FindSlot(separatorSlotNames[i])); + + LateUpdate(); // Generate mesh for the first frame it exists. + + if (OnRebuild != null) + OnRebuild(this); + } + + /// + /// Generates a new UnityEngine.Mesh from the internal Skeleton. + public virtual void LateUpdate () { + if (!valid) return; + + #if SPINE_OPTIONAL_RENDEROVERRIDE + bool doMeshOverride = generateMeshOverride != null; + if ((!meshRenderer.enabled) && !doMeshOverride) return; + #else + const bool doMeshOverride = false; + if (!meshRenderer.enabled) return; + #endif + var currentInstructions = this.currentInstructions; + var workingSubmeshInstructions = currentInstructions.submeshInstructions; + var currentSmartMesh = rendererBuffers.GetNextMesh(); // Double-buffer for performance. + + bool updateTriangles; + + if (this.singleSubmesh) { + // STEP 1. Determine a SmartMesh.Instruction. Split up instructions into submeshes. ============================================= + MeshGenerator.GenerateSingleSubmeshInstruction(currentInstructions, skeleton, skeletonDataAsset.atlasAssets[0].materials[0]); + + // STEP 1.9. Post-process workingInstructions. ================================================================================== + #if SPINE_OPTIONAL_MATERIALOVERRIDE + if (customMaterialOverride.Count > 0) // isCustomMaterialOverridePopulated + MeshGenerator.TryReplaceMaterials(workingSubmeshInstructions, customMaterialOverride); + #endif + + // STEP 2. Update vertex buffer based on verts from the attachments. =========================================================== + meshGenerator.settings = new MeshGenerator.Settings { + pmaVertexColors = this.pmaVertexColors, + zSpacing = this.zSpacing, + useClipping = this.useClipping, + tintBlack = this.tintBlack, + calculateTangents = this.calculateTangents, + addNormals = this.addNormals + }; + meshGenerator.Begin(); + updateTriangles = SkeletonRendererInstruction.GeometryNotEqual(currentInstructions, currentSmartMesh.instructionUsed); + if (currentInstructions.hasActiveClipping) { + meshGenerator.AddSubmesh(workingSubmeshInstructions.Items[0], updateTriangles); + } else { + meshGenerator.BuildMeshWithArrays(currentInstructions, updateTriangles); + } + + } else { + // STEP 1. Determine a SmartMesh.Instruction. Split up instructions into submeshes. ============================================= + MeshGenerator.GenerateSkeletonRendererInstruction(currentInstructions, skeleton, customSlotMaterials, separatorSlots, doMeshOverride, this.immutableTriangles); + + // STEP 1.9. Post-process workingInstructions. ================================================================================== + #if SPINE_OPTIONAL_MATERIALOVERRIDE + if (customMaterialOverride.Count > 0) // isCustomMaterialOverridePopulated + MeshGenerator.TryReplaceMaterials(workingSubmeshInstructions, customMaterialOverride); + #endif + + #if SPINE_OPTIONAL_RENDEROVERRIDE + if (doMeshOverride) { + this.generateMeshOverride(currentInstructions); + if (disableRenderingOnOverride) return; + } + #endif + + updateTriangles = SkeletonRendererInstruction.GeometryNotEqual(currentInstructions, currentSmartMesh.instructionUsed); + + // STEP 2. Update vertex buffer based on verts from the attachments. =========================================================== + meshGenerator.settings = new MeshGenerator.Settings { + pmaVertexColors = this.pmaVertexColors, + zSpacing = this.zSpacing, + useClipping = this.useClipping, + tintBlack = this.tintBlack, + calculateTangents = this.calculateTangents, + addNormals = this.addNormals + }; + meshGenerator.Begin(); + if (currentInstructions.hasActiveClipping) + meshGenerator.BuildMesh(currentInstructions, updateTriangles); + else + meshGenerator.BuildMeshWithArrays(currentInstructions, updateTriangles); + } + + if (OnPostProcessVertices != null) OnPostProcessVertices.Invoke(this.meshGenerator.Buffers); + + // STEP 3. Move the mesh data into a UnityEngine.Mesh =========================================================================== + var currentMesh = currentSmartMesh.mesh; + meshGenerator.FillVertexData(currentMesh); + rendererBuffers.UpdateSharedMaterials(workingSubmeshInstructions); + if (updateTriangles) { // Check if the triangles should also be updated. + meshGenerator.FillTriangles(currentMesh); + meshRenderer.sharedMaterials = rendererBuffers.GetUpdatedSharedMaterialsArray(); + } else if (rendererBuffers.MaterialsChangedInLastUpdate()) { + meshRenderer.sharedMaterials = rendererBuffers.GetUpdatedSharedMaterialsArray(); + } + + meshGenerator.FillLateVertexData(currentMesh); + + // STEP 4. The UnityEngine.Mesh is ready. Set it as the MeshFilter's mesh. Store the instructions used for that mesh. =========== + meshFilter.sharedMesh = currentMesh; + currentSmartMesh.instructionUsed.Set(currentInstructions); + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Components/SkeletonRenderer.cs.meta b/Assets/Spine/Assets/spine-unity/Components/SkeletonRenderer.cs.meta new file mode 100644 index 0000000..5230098 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Components/SkeletonRenderer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e075b9a3e08e2f74fbd651c858ab16ed +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor.meta b/Assets/Spine/Assets/spine-unity/Editor.meta new file mode 100644 index 0000000..3db0fd1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: f0e95036e72b08544a9d295dd4366f40 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/AnimationReferenceAssetEditor.cs b/Assets/Spine/Assets/spine-unity/Editor/AnimationReferenceAssetEditor.cs new file mode 100644 index 0000000..596efbb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/AnimationReferenceAssetEditor.cs @@ -0,0 +1,166 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +using System.Reflection; + +namespace Spine.Unity.Editor { + using Editor = UnityEditor.Editor; + + [CustomEditor(typeof(AnimationReferenceAsset))] + public class AnimationReferenceAssetEditor : Editor { + + const string InspectorHelpText = "This is a Spine-Unity Animation Reference Asset. It serializes a reference to a SkeletonDataAsset and an animationName. It does not contain actual animation data. At runtime, it stores a reference to a Spine.Animation.\n\n" + + "You can use this in your AnimationState calls instead of a string animation name or a Spine.Animation reference. Use its implicit conversion into Spine.Animation or its .Animation property.\n\n" + + "Use AnimationReferenceAssets as an alternative to storing strings or finding animations and caching per component. This only does the lookup by string once, and allows you to store and manage animations via asset references."; + + readonly SkeletonInspectorPreview preview = new SkeletonInspectorPreview(); + FieldInfo skeletonDataAssetField = typeof(AnimationReferenceAsset).GetField("skeletonDataAsset", BindingFlags.NonPublic | BindingFlags.Instance); + FieldInfo nameField = typeof(AnimationReferenceAsset).GetField("animationName", BindingFlags.NonPublic | BindingFlags.Instance); + + AnimationReferenceAsset ThisAnimationReferenceAsset { get { return target as AnimationReferenceAsset; } } + SkeletonDataAsset ThisSkeletonDataAsset { get { return skeletonDataAssetField.GetValue(ThisAnimationReferenceAsset) as SkeletonDataAsset; } } + string ThisAnimationName { get { return nameField.GetValue(ThisAnimationReferenceAsset) as string; } } + + bool changeNextFrame = false; + SerializedProperty animationNameProperty; + SkeletonDataAsset lastSkeletonDataAsset; + + void OnEnable () { HandleOnEnablePreview(); } + void OnDestroy () { HandleOnDestroyPreview(); } + + public override void OnInspectorGUI () { + animationNameProperty = animationNameProperty ?? serializedObject.FindProperty("animationName"); + string animationName = animationNameProperty.stringValue; + + Animation animation = null; + if (ThisSkeletonDataAsset != null) { + var skeletonData = ThisSkeletonDataAsset.GetSkeletonData(true); + if (skeletonData != null) { + animation = skeletonData.FindAnimation(animationName); + } + } + bool animationNotFound = (animation == null); + + if (changeNextFrame) { + changeNextFrame = false; + + if (ThisSkeletonDataAsset != lastSkeletonDataAsset) { + preview.Clear(); + preview.Initialize(Repaint, ThisSkeletonDataAsset, LastSkinName); + + if (animationNotFound) { + animationNameProperty.stringValue = ""; + preview.ClearAnimationSetupPose(); + } + } + + preview.ClearAnimationSetupPose(); + + if (!string.IsNullOrEmpty(animationNameProperty.stringValue)) + preview.PlayPauseAnimation(animationNameProperty.stringValue, true); + } + lastSkeletonDataAsset = ThisSkeletonDataAsset; + + //EditorGUILayout.HelpBox(AnimationReferenceAssetEditor.InspectorHelpText, MessageType.Info, true); + EditorGUILayout.Space(); + EditorGUI.BeginChangeCheck(); + DrawDefaultInspector(); + if (EditorGUI.EndChangeCheck()) { + changeNextFrame = true; + } + + // Draw extra info below default inspector. + EditorGUILayout.Space(); + if (ThisSkeletonDataAsset == null) { + EditorGUILayout.HelpBox("SkeletonDataAsset is missing.", MessageType.Error); + } else if (string.IsNullOrEmpty(animationName)) { + EditorGUILayout.HelpBox("No animation selected.", MessageType.Warning); + } else if (animationNotFound) { + EditorGUILayout.HelpBox(string.Format("Animation named {0} was not found for this Skeleton.", animationNameProperty.stringValue), MessageType.Warning); + } else { + using (new SpineInspectorUtility.BoxScope()) { + if (!string.Equals(SpineEditorUtilities.GetPathSafeName(animationName), ThisAnimationReferenceAsset.name, System.StringComparison.OrdinalIgnoreCase)) + EditorGUILayout.HelpBox("Animation name value does not match this asset's name. Inspectors using this asset may be misleading.", MessageType.None); + + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(animationName, SpineEditorUtilities.Icons.animation)); + if (animation != null) { + EditorGUILayout.LabelField(string.Format("Timelines: {0}", animation.Timelines.Count)); + EditorGUILayout.LabelField(string.Format("Duration: {0} sec", animation.Duration)); + } + } + } + } + + #region Preview Handlers + string TargetAssetGUID { get { return AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(ThisSkeletonDataAsset)); } } + string LastSkinKey { get { return TargetAssetGUID + "_lastSkin"; } } + string LastSkinName { get { return EditorPrefs.GetString(LastSkinKey, ""); } } + + void HandleOnEnablePreview () { + preview.Initialize(this.Repaint, ThisSkeletonDataAsset, LastSkinName); + preview.PlayPauseAnimation(ThisAnimationName, true); + preview.OnSkinChanged -= HandleOnSkinChanged; + preview.OnSkinChanged += HandleOnSkinChanged; + EditorApplication.update -= preview.HandleEditorUpdate; + EditorApplication.update += preview.HandleEditorUpdate; + } + + private void HandleOnSkinChanged (string skinName) { + EditorPrefs.SetString(LastSkinKey, skinName); + preview.PlayPauseAnimation(ThisAnimationName, true); + } + + void HandleOnDestroyPreview () { + EditorApplication.update -= preview.HandleEditorUpdate; + preview.OnDestroy(); + } + + override public bool HasPreviewGUI () { + if (serializedObject.isEditingMultipleObjects) return false; + return ThisSkeletonDataAsset != null && ThisSkeletonDataAsset.GetSkeletonData(true) != null; + } + + override public void OnInteractivePreviewGUI (Rect r, GUIStyle background) { + preview.Initialize(this.Repaint, ThisSkeletonDataAsset); + preview.HandleInteractivePreviewGUI(r, background); + } + + public override GUIContent GetPreviewTitle () { return SpineInspectorUtility.TempContent("Preview"); } + public override void OnPreviewSettings () { preview.HandleDrawSettings(); } + public override Texture2D RenderStaticPreview (string assetPath, UnityEngine.Object[] subAssets, int width, int height) { return preview.GetStaticPreview(width, height); } + #endregion + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/AnimationReferenceAssetEditor.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/AnimationReferenceAssetEditor.cs.meta new file mode 100644 index 0000000..58c7aaa --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/AnimationReferenceAssetEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9511532e80feed24881a5863f5485446 +timeCreated: 1523316585 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs b/Assets/Spine/Assets/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs new file mode 100644 index 0000000..ec76a4a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs @@ -0,0 +1,51 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; + +namespace Spine.Unity.Editor { + public static class AssetDatabaseAvailabilityDetector { + const string MARKER_RESOURCE_NAME = "SpineAssetDatabaseMarker"; + private static bool _isMarkerLoaded; + + public static bool IsAssetDatabaseAvailable (bool forceCheck = false) { + if (!forceCheck && _isMarkerLoaded) + return true; + + TextAsset markerTextAsset = Resources.Load(MARKER_RESOURCE_NAME); + _isMarkerLoaded = markerTextAsset != null; + if (markerTextAsset != null) { + Resources.UnloadAsset(markerTextAsset); + } + + return _isMarkerLoaded; + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs.meta new file mode 100644 index 0000000..00b99c1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/AssetDatabaseAvailabilityDetector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 25086cd81e3158b439761b73d7366c47 +timeCreated: 1444587791 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/AtlasAssetInspector.cs b/Assets/Spine/Assets/spine-unity/Editor/AtlasAssetInspector.cs new file mode 100644 index 0000000..7b73493 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/AtlasAssetInspector.cs @@ -0,0 +1,366 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +//#define BAKE_ALL_BUTTON +//#define REGION_BAKING_MESH + +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine; +using Spine; + +namespace Spine.Unity.Editor { + using Event = UnityEngine.Event; + + [CustomEditor(typeof(AtlasAsset)), CanEditMultipleObjects] + public class AtlasAssetInspector : UnityEditor.Editor { + SerializedProperty atlasFile, materials; + AtlasAsset atlasAsset; + + GUIContent spriteSlicesLabel; + GUIContent SpriteSlicesLabel { + get { + if (spriteSlicesLabel == null) { + spriteSlicesLabel = new GUIContent( + "Apply Regions as Texture Sprite Slices", + SpineEditorUtilities.Icons.unity, + "Adds Sprite slices to atlas texture(s). " + + "Updates existing slices if ones with matching names exist. \n\n" + + "If your atlas was exported with Premultiply Alpha, " + + "your SpriteRenderer should use the generated Spine _Material asset (or any Material with a PMA shader) instead of Sprites-Default."); + } + return spriteSlicesLabel; + } + } + + static List GetRegions (Atlas atlas) { + FieldInfo regionsField = typeof(Atlas).GetField("regions", BindingFlags.Instance | BindingFlags.NonPublic); + return (List)regionsField.GetValue(atlas); + } + + void OnEnable () { + SpineEditorUtilities.ConfirmInitialization(); + atlasFile = serializedObject.FindProperty("atlasFile"); + materials = serializedObject.FindProperty("materials"); + materials.isExpanded = true; + atlasAsset = (AtlasAsset)target; + #if REGION_BAKING_MESH + UpdateBakedList(); + #endif + } + + #if REGION_BAKING_MESH + private List baked; + private List bakedObjects; + + void UpdateBakedList () { + AtlasAsset asset = (AtlasAsset)target; + baked = new List(); + bakedObjects = new List(); + if (atlasFile.objectReferenceValue != null) { + List regions = this.Regions; + string atlasAssetPath = AssetDatabase.GetAssetPath(atlasAsset); + string atlasAssetDirPath = Path.GetDirectoryName(atlasAssetPath); + string bakedDirPath = Path.Combine(atlasAssetDirPath, atlasAsset.name); + for (int i = 0; i < regions.Count; i++) { + AtlasRegion region = regions[i]; + string bakedPrefabPath = Path.Combine(bakedDirPath, SpineEditorUtilities.GetPathSafeRegionName(region) + ".prefab").Replace("\\", "/"); + GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath(bakedPrefabPath, typeof(GameObject)); + baked.Add(prefab != null); + bakedObjects.Add(prefab); + } + } + } + #endif + + override public void OnInspectorGUI () { + if (serializedObject.isEditingMultipleObjects) { + DrawDefaultInspector(); + return; + } + + serializedObject.Update(); + atlasAsset = atlasAsset ?? (AtlasAsset)target; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(atlasFile); + EditorGUILayout.PropertyField(materials, true); + if (EditorGUI.EndChangeCheck()) { + serializedObject.ApplyModifiedProperties(); + atlasAsset.Clear(); + atlasAsset.GetAtlas(); + } + + if (materials.arraySize == 0) { + EditorGUILayout.HelpBox("No materials", MessageType.Error); + return; + } + + for (int i = 0; i < materials.arraySize; i++) { + SerializedProperty prop = materials.GetArrayElementAtIndex(i); + var material = (Material)prop.objectReferenceValue; + if (material == null) { + EditorGUILayout.HelpBox("Materials cannot be null.", MessageType.Error); + return; + } + } + + EditorGUILayout.Space(); + if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent("Set Mipmap Bias to " + SpineEditorUtilities.DEFAULT_MIPMAPBIAS))) { + foreach (var m in atlasAsset.materials) { + var texture = m.mainTexture; + texture.mipMapBias = SpineEditorUtilities.DEFAULT_MIPMAPBIAS; + } + Debug.Log("Texture mipmap bias set to " + SpineEditorUtilities.DEFAULT_MIPMAPBIAS); + } + + EditorGUILayout.Space(); + if (atlasFile.objectReferenceValue != null) { + if (SpineInspectorUtility.LargeCenteredButton(SpriteSlicesLabel)) { + var atlas = atlasAsset.GetAtlas(); + foreach (var m in atlasAsset.materials) + UpdateSpriteSlices(m.mainTexture, atlas); + } + } + + EditorGUILayout.Space(); + + #if REGION_BAKING_MESH + if (atlasFile.objectReferenceValue != null) { + Atlas atlas = asset.GetAtlas(); + FieldInfo field = typeof(Atlas).GetField("regions", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.NonPublic); + List regions = (List)field.GetValue(atlas); + EditorGUILayout.LabelField(new GUIContent("Region Baking", SpineEditorUtilities.Icons.unityIcon)); + EditorGUI.indentLevel++; + AtlasPage lastPage = null; + for (int i = 0; i < regions.Count; i++) { + if (lastPage != regions[i].page) { + if (lastPage != null) { + EditorGUILayout.Separator(); + EditorGUILayout.Separator(); + } + lastPage = regions[i].page; + Material mat = ((Material)lastPage.rendererObject); + if (mat != null) { + GUILayout.BeginHorizontal(); + { + EditorGUI.BeginDisabledGroup(true); + EditorGUILayout.ObjectField(mat, typeof(Material), false, GUILayout.Width(250)); + EditorGUI.EndDisabledGroup(); + } + GUILayout.EndHorizontal(); + + } else { + EditorGUILayout.LabelField(new GUIContent("Page missing material!", SpineEditorUtilities.Icons.warning)); + } + } + GUILayout.BeginHorizontal(); + { + //EditorGUILayout.ToggleLeft(baked[i] ? "" : regions[i].name, baked[i]); + bool result = baked[i] ? EditorGUILayout.ToggleLeft("", baked[i], GUILayout.Width(24)) : EditorGUILayout.ToggleLeft(" " + regions[i].name, baked[i]); + if(baked[i]){ + EditorGUILayout.ObjectField(bakedObjects[i], typeof(GameObject), false, GUILayout.Width(250)); + } + if (result && !baked[i]) { + //bake + baked[i] = true; + bakedObjects[i] = SpineEditorUtilities.BakeRegion(atlasAsset, regions[i]); + EditorGUIUtility.PingObject(bakedObjects[i]); + } else if (!result && baked[i]) { + //unbake + bool unbakeResult = EditorUtility.DisplayDialog("Delete Baked Region", "Do you want to delete the prefab for " + regions[i].name, "Yes", "Cancel"); + switch (unbakeResult) { + case true: + //delete + string atlasAssetPath = AssetDatabase.GetAssetPath(atlasAsset); + string atlasAssetDirPath = Path.GetDirectoryName(atlasAssetPath); + string bakedDirPath = Path.Combine(atlasAssetDirPath, atlasAsset.name); + string bakedPrefabPath = Path.Combine(bakedDirPath, SpineEditorUtilities.GetPathSafeRegionName(regions[i]) + ".prefab").Replace("\\", "/"); + AssetDatabase.DeleteAsset(bakedPrefabPath); + baked[i] = false; + break; + case false: + //do nothing + break; + } + } + } + GUILayout.EndHorizontal(); + } + EditorGUI.indentLevel--; + + #if BAKE_ALL_BUTTON + // Check state + bool allBaked = true; + bool allUnbaked = true; + for (int i = 0; i < regions.Count; i++) { + allBaked &= baked[i]; + allUnbaked &= !baked[i]; + } + + if (!allBaked && GUILayout.Button("Bake All")) { + for (int i = 0; i < regions.Count; i++) { + if (!baked[i]) { + baked[i] = true; + bakedObjects[i] = SpineEditorUtilities.BakeRegion(atlasAsset, regions[i]); + } + } + + } else if (!allUnbaked && GUILayout.Button("Unbake All")) { + bool unbakeResult = EditorUtility.DisplayDialog("Delete All Baked Regions", "Are you sure you want to unbake all region prefabs? This cannot be undone.", "Yes", "Cancel"); + switch (unbakeResult) { + case true: + //delete + for (int i = 0; i < regions.Count; i++) { + if (baked[i]) { + string atlasAssetPath = AssetDatabase.GetAssetPath(atlasAsset); + string atlasAssetDirPath = Path.GetDirectoryName(atlasAssetPath); + string bakedDirPath = Path.Combine(atlasAssetDirPath, atlasAsset.name); + string bakedPrefabPath = Path.Combine(bakedDirPath, SpineEditorUtilities.GetPathSafeRegionName(regions[i]) + ".prefab").Replace("\\", "/"); + AssetDatabase.DeleteAsset(bakedPrefabPath); + baked[i] = false; + } + } + break; + case false: + //do nothing + break; + } + + } + #endif + + } + #else + if (atlasFile.objectReferenceValue != null) { + EditorGUILayout.LabelField("Atlas Regions", EditorStyles.boldLabel); + int baseIndent = EditorGUI.indentLevel; + + var regions = AtlasAssetInspector.GetRegions(atlasAsset.GetAtlas()); + AtlasPage lastPage = null; + for (int i = 0; i < regions.Count; i++) { + if (lastPage != regions[i].page) { + if (lastPage != null) { + EditorGUILayout.Separator(); + EditorGUILayout.Separator(); + } + lastPage = regions[i].page; + Material mat = ((Material)lastPage.rendererObject); + if (mat != null) { + EditorGUI.indentLevel = baseIndent; + using (new GUILayout.HorizontalScope()) + using (new EditorGUI.DisabledGroupScope(true)) + EditorGUILayout.ObjectField(mat, typeof(Material), false, GUILayout.Width(250)); + EditorGUI.indentLevel = baseIndent + 1; + } else { + EditorGUILayout.HelpBox("Page missing material!", MessageType.Warning); + } + } + + EditorGUILayout.LabelField(new GUIContent(regions[i].name, SpineEditorUtilities.Icons.image)); + } + EditorGUI.indentLevel = baseIndent; + } + #endif + + if (serializedObject.ApplyModifiedProperties() || SpineInspectorUtility.UndoRedoPerformed(Event.current)) + atlasAsset.Clear(); + } + + static public void UpdateSpriteSlices (Texture texture, Atlas atlas) { + string texturePath = AssetDatabase.GetAssetPath(texture.GetInstanceID()); + var t = (TextureImporter)TextureImporter.GetAtPath(texturePath); + t.spriteImportMode = SpriteImportMode.Multiple; + var spriteSheet = t.spritesheet; + var sprites = new List(spriteSheet); + + var regions = AtlasAssetInspector.GetRegions(atlas); + char[] FilenameDelimiter = {'.'}; + int updatedCount = 0; + int addedCount = 0; + + foreach (var r in regions) { + string pageName = r.page.name.Split(FilenameDelimiter, StringSplitOptions.RemoveEmptyEntries)[0]; + string textureName = texture.name; + bool pageMatch = string.Equals(pageName, textureName, StringComparison.Ordinal); + +// if (pageMatch) { +// int pw = r.page.width; +// int ph = r.page.height; +// bool mismatchSize = pw != texture.width || pw > t.maxTextureSize || ph != texture.height || ph > t.maxTextureSize; +// if (mismatchSize) +// Debug.LogWarningFormat("Size mismatch found.\nExpected atlas size is {0}x{1}. Texture Import Max Size of texture '{2}'({4}x{5}) is currently set to {3}.", pw, ph, texture.name, t.maxTextureSize, texture.width, texture.height); +// } + + int spriteIndex = pageMatch ? sprites.FindIndex( + (s) => string.Equals(s.name, r.name, StringComparison.Ordinal) + ) : -1; + bool spriteNameMatchExists = spriteIndex >= 0; + + if (pageMatch) { + Rect spriteRect = new Rect(); + + if (r.rotate) { + spriteRect.width = r.height; + spriteRect.height = r.width; + } else { + spriteRect.width = r.width; + spriteRect.height = r.height; + } + spriteRect.x = r.x; + spriteRect.y = r.page.height - spriteRect.height - r.y; + + if (spriteNameMatchExists) { + var s = sprites[spriteIndex]; + s.rect = spriteRect; + sprites[spriteIndex] = s; + updatedCount++; + } else { + sprites.Add(new SpriteMetaData { + name = r.name, + pivot = new Vector2(0.5f, 0.5f), + rect = spriteRect + }); + addedCount++; + } + } + + } + + t.spritesheet = sprites.ToArray(); + EditorUtility.SetDirty(t); + AssetDatabase.ImportAsset(texturePath, ImportAssetOptions.ForceUpdate); + EditorGUIUtility.PingObject(texture); + Debug.Log(string.Format("Applied sprite slices to {2}. {0} added. {1} updated.", addedCount, updatedCount, texture.name)); + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/AtlasAssetInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/AtlasAssetInspector.cs.meta new file mode 100644 index 0000000..2f5962a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/AtlasAssetInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ca9b3ce36d70a05408e3bdd5e92c7f64 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/BoneFollowerInspector.cs b/Assets/Spine/Assets/spine-unity/Editor/BoneFollowerInspector.cs new file mode 100644 index 0000000..f1cb32f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/BoneFollowerInspector.cs @@ -0,0 +1,208 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEditor; +using UnityEngine; + +namespace Spine.Unity.Editor { + + using Editor = UnityEditor.Editor; + using Event = UnityEngine.Event; + + [CustomEditor(typeof(BoneFollower)), CanEditMultipleObjects] + public class BoneFollowerInspector : Editor { + SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip; + BoneFollower targetBoneFollower; + bool needsReset; + + #region Context Menu Item + [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject")] + static void AddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + var go = new GameObject("BoneFollower"); + var t = go.transform; + t.SetParent(skeletonRenderer.transform); + t.localPosition = Vector3.zero; + + var f = go.AddComponent(); + f.skeletonRenderer = skeletonRenderer; + + EditorGUIUtility.PingObject(t); + + Undo.RegisterCreatedObjectUndo(go, "Add BoneFollower"); + } + + // Validate + [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject", true)] + static bool ValidateAddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + return skeletonRenderer.valid; + } + #endregion + + void OnEnable () { + skeletonRenderer = serializedObject.FindProperty("skeletonRenderer"); + boneName = serializedObject.FindProperty("boneName"); + followBoneRotation = serializedObject.FindProperty("followBoneRotation"); + followZPosition = serializedObject.FindProperty("followZPosition"); + followLocalScale = serializedObject.FindProperty("followLocalScale"); + followSkeletonFlip = serializedObject.FindProperty("followSkeletonFlip"); + + targetBoneFollower = (BoneFollower)target; + if (targetBoneFollower.SkeletonRenderer != null) + targetBoneFollower.SkeletonRenderer.Initialize(false); + + if (!targetBoneFollower.valid || needsReset) { + targetBoneFollower.Initialize(); + targetBoneFollower.LateUpdate(); + needsReset = false; + SceneView.RepaintAll(); + } + } + + public void OnSceneGUI () { + var tbf = target as BoneFollower; + var skeletonRendererComponent = tbf.skeletonRenderer; + if (skeletonRendererComponent == null) return; + + var transform = skeletonRendererComponent.transform; + var skeleton = skeletonRendererComponent.skeleton; + + if (string.IsNullOrEmpty(boneName.stringValue)) { + SpineHandles.DrawBones(transform, skeleton); + SpineHandles.DrawBoneNames(transform, skeleton); + Handles.Label(tbf.transform.position, "No bone selected", EditorStyles.helpBox); + } else { + var targetBone = tbf.bone; + if (targetBone == null) return; + SpineHandles.DrawBoneWireframe(transform, targetBone, SpineHandles.TransformContraintColor); + Handles.Label(targetBone.GetWorldPosition(transform), targetBone.Data.Name, SpineHandles.BoneNameStyle); + } + } + + override public void OnInspectorGUI () { + if (serializedObject.isEditingMultipleObjects) { + if (needsReset) { + needsReset = false; + foreach (var o in targets) { + var bf = (BoneFollower)o; + bf.Initialize(); + bf.LateUpdate(); + } + SceneView.RepaintAll(); + } + + EditorGUI.BeginChangeCheck(); + DrawDefaultInspector(); + needsReset |= EditorGUI.EndChangeCheck(); + return; + } + + if (needsReset && Event.current.type == EventType.Layout) { + targetBoneFollower.Initialize(); + targetBoneFollower.LateUpdate(); + needsReset = false; + SceneView.RepaintAll(); + } + serializedObject.Update(); + + // Find Renderer + if (skeletonRenderer.objectReferenceValue == null) { + SkeletonRenderer parentRenderer = targetBoneFollower.GetComponentInParent(); + if (parentRenderer != null && parentRenderer.gameObject != targetBoneFollower.gameObject) { + skeletonRenderer.objectReferenceValue = parentRenderer; + Debug.Log("Inspector automatically assigned BoneFollower.SkeletonRenderer"); + } + } + + EditorGUILayout.PropertyField(skeletonRenderer); + var skeletonRendererReference = skeletonRenderer.objectReferenceValue as SkeletonRenderer; + if (skeletonRendererReference != null) { + if (skeletonRendererReference.gameObject == targetBoneFollower.gameObject) { + skeletonRenderer.objectReferenceValue = null; + EditorUtility.DisplayDialog("Invalid assignment.", "BoneFollower can only follow a skeleton on a separate GameObject.\n\nCreate a new GameObject for your BoneFollower, or choose a SkeletonRenderer from a different GameObject.", "Ok"); + } + } + + if (!targetBoneFollower.valid) { + needsReset = true; + } + + if (targetBoneFollower.valid) { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(boneName); + needsReset |= EditorGUI.EndChangeCheck(); + + EditorGUILayout.PropertyField(followBoneRotation); + EditorGUILayout.PropertyField(followZPosition); + EditorGUILayout.PropertyField(followLocalScale); + EditorGUILayout.PropertyField(followSkeletonFlip); + + BoneFollowerInspector.RecommendRigidbodyButton(targetBoneFollower); + } else { + var boneFollowerSkeletonRenderer = targetBoneFollower.skeletonRenderer; + if (boneFollowerSkeletonRenderer == null) { + EditorGUILayout.HelpBox("SkeletonRenderer is unassigned. Please assign a SkeletonRenderer (SkeletonAnimation or SkeletonAnimator).", MessageType.Warning); + } else { + boneFollowerSkeletonRenderer.Initialize(false); + + if (boneFollowerSkeletonRenderer.skeletonDataAsset == null) + EditorGUILayout.HelpBox("Assigned SkeletonRenderer does not have SkeletonData assigned to it.", MessageType.Warning); + + if (!boneFollowerSkeletonRenderer.valid) + EditorGUILayout.HelpBox("Assigned SkeletonRenderer is invalid. Check target SkeletonRenderer, its SkeletonDataAsset or the console for other errors.", MessageType.Warning); + } + } + + var current = Event.current; + bool wasUndo = (current.type == EventType.ValidateCommand && current.commandName == "UndoRedoPerformed"); + if (wasUndo) + targetBoneFollower.Initialize(); + + serializedObject.ApplyModifiedProperties(); + } + + internal static void RecommendRigidbodyButton (Component component) { + bool hasCollider2D = component.GetComponent() != null || component.GetComponent() != null; + bool hasCollider3D = !hasCollider2D && component.GetComponent(); + bool missingRigidBody = (hasCollider2D && component.GetComponent() == null) || (hasCollider3D && component.GetComponent() == null); + if (missingRigidBody) { + using (new SpineInspectorUtility.BoxScope()) { + EditorGUILayout.HelpBox("Collider detected. Unity recommends adding a Rigidbody to the parent Transforms of any colliders that are intended to be dynamically repositioned and rotated.", MessageType.Warning); + var rbType = hasCollider2D ? typeof(Rigidbody2D) : typeof(Rigidbody); + string rbLabel = string.Format("Add {0}", rbType.Name); + var rbContent = SpineInspectorUtility.TempContent(rbLabel, SpineInspectorUtility.UnityIcon(rbType), "Add a rigidbody to this GameObject to be the Physics body parent of the attached collider."); + if (SpineInspectorUtility.CenteredButton(rbContent)) component.gameObject.AddComponent(rbType); + } + } + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/BoneFollowerInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/BoneFollowerInspector.cs.meta new file mode 100644 index 0000000..0448ccb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/BoneFollowerInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c71ca35fd6241cb49a0b0756a664fcf7 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI.meta new file mode 100644 index 0000000..d730a55 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: bfaea6b7e7f52bc46b8d1c3cb5e9eaa1 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/AtlasAsset Icon.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/AtlasAsset Icon.png new file mode 100644 index 0000000..4792130 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/AtlasAsset Icon.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/AtlasAsset Icon.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/AtlasAsset Icon.png.meta new file mode 100644 index 0000000..ef7eb69 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/AtlasAsset Icon.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 3fc714a0dc1cf6b4b959e073fff2844e +timeCreated: 1508165143 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/SkeletonDataAsset Icon.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/SkeletonDataAsset Icon.png new file mode 100644 index 0000000..61c0f18 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/SkeletonDataAsset Icon.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/SkeletonDataAsset Icon.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/SkeletonDataAsset Icon.png.meta new file mode 100644 index 0000000..22239ca --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/SkeletonDataAsset Icon.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 68defdbc95b30a74a9ad396bfc9a2277 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animation.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animation.png new file mode 100644 index 0000000..f44d38e Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animation.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animation.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animation.png.meta new file mode 100644 index 0000000..dcf6806 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animation.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 52b12ec801461494185a4d3dc66f3d1d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animationRoot.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animationRoot.png new file mode 100644 index 0000000..6107546 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animationRoot.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animationRoot.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animationRoot.png.meta new file mode 100644 index 0000000..1bbca1c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-animationRoot.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 3d1be4ea889f3a14b864352fe49a1bde +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-attachment.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-attachment.png new file mode 100644 index 0000000..4e14f98 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-attachment.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-attachment.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-attachment.png.meta new file mode 100644 index 0000000..1316c3d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-attachment.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 04ae56b3698d3e844844cfcef2f009e7 +timeCreated: 1494928093 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-bone.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-bone.png new file mode 100644 index 0000000..ec66a6a Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-bone.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-bone.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-bone.png.meta new file mode 100644 index 0000000..f0cbaea --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-bone.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 8322793223a533a4ca8be6f430256dfc +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boneNib.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boneNib.png new file mode 100644 index 0000000..87373b8 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boneNib.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boneNib.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boneNib.png.meta new file mode 100644 index 0000000..a0b91be --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boneNib.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 97a43f11e00735147a9dc3dff6d68191 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boundingBox.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boundingBox.png new file mode 100644 index 0000000..82beedf Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boundingBox.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boundingBox.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boundingBox.png.meta new file mode 100644 index 0000000..0e5d628 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-boundingBox.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 955aed20030d0504b8a9c6934a5cb47a +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-clipping.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-clipping.png new file mode 100644 index 0000000..398137c Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-clipping.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-clipping.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-clipping.png.meta new file mode 100644 index 0000000..9cb5d0c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-clipping.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: f5fff1b5caee03642ab77c9984b4bb6a +timeCreated: 1497479335 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintIK.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintIK.png new file mode 100644 index 0000000..1c93d75 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintIK.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintIK.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintIK.png.meta new file mode 100644 index 0000000..1e11b1d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintIK.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 02822eb69e09dd947b434ab81e3d938f +timeCreated: 1494878353 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintNib.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintNib.png new file mode 100644 index 0000000..175bcb0 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintNib.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintNib.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintNib.png.meta new file mode 100644 index 0000000..a692728 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintNib.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: de1a4f5ad4bdf1a4ea072c4d59ba87d8 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintPath.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintPath.png new file mode 100644 index 0000000..9663b85 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintPath.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintPath.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintPath.png.meta new file mode 100644 index 0000000..4459669 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintPath.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: c1aae98dd56b14c4b8c25360000b7e9e +timeCreated: 1494878353 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintTransform.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintTransform.png new file mode 100644 index 0000000..2264aaa Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintTransform.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintTransform.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintTransform.png.meta new file mode 100644 index 0000000..181bb92 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraintTransform.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 4709175437c21f64bab9b061f98a49fc +timeCreated: 1494878353 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraints.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraints.png new file mode 100644 index 0000000..9c61ee5 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraints.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraints.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraints.png.meta new file mode 100644 index 0000000..306364d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-constraints.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: ed0736a1eb519ef42b4892d1db2426b3 +timeCreated: 1494878353 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-event.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-event.png new file mode 100644 index 0000000..4547f25 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-event.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-event.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-event.png.meta new file mode 100644 index 0000000..0bf19db --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-event.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: d226a80acc775714aa78b85e16a00e9b +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-hingeChain.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-hingeChain.png new file mode 100644 index 0000000..a27af1c Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-hingeChain.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-hingeChain.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-hingeChain.png.meta new file mode 100644 index 0000000..e61da1e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-hingeChain.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 2c2c6d283dcf3654baf40001c982891c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-image.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-image.png new file mode 100644 index 0000000..663d113 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-image.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-image.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-image.png.meta new file mode 100644 index 0000000..421c654 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-image.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 2b3a6f35bbaa8414eb51a344743ee641 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-mesh.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-mesh.png new file mode 100644 index 0000000..1035553 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-mesh.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-mesh.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-mesh.png.meta new file mode 100644 index 0000000..2b49d8b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-mesh.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: a309a2e14638a204091b915126910f45 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-null.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-null.png new file mode 100644 index 0000000..9a6d738 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-null.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-null.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-null.png.meta new file mode 100644 index 0000000..29da564 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-null.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: d1de1604dfe4cb64c9d31246a8e43c78 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-path.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-path.png new file mode 100644 index 0000000..604ae0d Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-path.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-path.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-path.png.meta new file mode 100644 index 0000000..8aebfb7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-path.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: dbc817a6c9e9c5747b7f6261bf5d1d09 +timeCreated: 1482240904 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-point.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-point.png new file mode 100644 index 0000000..0e5099f Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-point.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-point.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-point.png.meta new file mode 100644 index 0000000..9df5c2a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-point.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: d7a76922e4dd9fa429da15c018ff127f +timeCreated: 1524196821 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-poseBones.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-poseBones.png new file mode 100644 index 0000000..102700a Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-poseBones.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-poseBones.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-poseBones.png.meta new file mode 100644 index 0000000..800466b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-poseBones.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: da6f6d414e43aac46a57cc5a87208db4 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeleton.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeleton.png new file mode 100644 index 0000000..b5d5adf Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeleton.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeleton.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeleton.png.meta new file mode 100644 index 0000000..9c2a1a7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeleton.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: f2216037084d99d4481810cb521ed96f +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png new file mode 100644 index 0000000..ce4d937 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png.meta new file mode 100644 index 0000000..3a77fd7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skeletonUtility.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 5bb0631368b462047869d8788673cb48 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skin.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skin.png new file mode 100644 index 0000000..4dc8e7f Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skin.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skin.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skin.png.meta new file mode 100644 index 0000000..f02b09c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skin.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: bfd9f3d2607e9e44c97384d7575a17dc +timeCreated: 1494878353 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 1024 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png new file mode 100644 index 0000000..17bfef0 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png.meta new file mode 100644 index 0000000..92955a9 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinPlaceholder.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 04c82a4acf7b5244e947f2709ec3a6cf +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinsRoot.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinsRoot.png new file mode 100644 index 0000000..31857cf Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinsRoot.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinsRoot.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinsRoot.png.meta new file mode 100644 index 0000000..b8ce214 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-skinsRoot.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 8bd14c7643597a74ba2edc10a5e4c4ed +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slot.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slot.png new file mode 100644 index 0000000..ca93872 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slot.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slot.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slot.png.meta new file mode 100644 index 0000000..66d52b0 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slot.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 0338faf3e7d93e2478fcbc022d13e081 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slotRoot.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slotRoot.png new file mode 100644 index 0000000..dfca413 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slotRoot.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slotRoot.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slotRoot.png.meta new file mode 100644 index 0000000..3d9fdd7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-slotRoot.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 4a1646cf39026224c85ecba92d7d6948 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-spine.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-spine.png new file mode 100644 index 0000000..7fd5473 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-spine.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-spine.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-spine.png.meta new file mode 100644 index 0000000..811e17a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-spine.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 4e7c964fa5e07024c8bf1debecc3b7c8 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png new file mode 100644 index 0000000..ec7c9e6 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png.meta new file mode 100644 index 0000000..fa37928 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-subMeshRenderer.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: f31c0c0d608e8ba4f9a1afb032092287 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-warning.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-warning.png new file mode 100644 index 0000000..05e3f4c Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-warning.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-warning.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-warning.png.meta new file mode 100644 index 0000000..87c616f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-warning.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 754d724c1bd750048852e8cf3d4a05ee +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-weights.png b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-weights.png new file mode 100644 index 0000000..fa8f190 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-weights.png differ diff --git a/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-weights.png.meta b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-weights.png.meta new file mode 100644 index 0000000..e25807b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/GUI/icon-weights.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 0b1bcb09fa228d049ba3c9ea6a57e1ee +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/Menus.cs b/Assets/Spine/Assets/spine-unity/Editor/Menus.cs new file mode 100644 index 0000000..64cfa4f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/Menus.cs @@ -0,0 +1,84 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace Spine.Unity.Editor { + public static class Menus { + [MenuItem("Assets/Create/Spine/Atlas Asset")] + static public void CreateAtlas () { + CreateAsset("New Atlas"); + } + + [MenuItem("Assets/Create/Spine/SkeletonData Asset")] + static public void CreateSkeletonData () { + CreateAsset("New SkeletonData"); + } + + static void CreateAsset (String name) where T : ScriptableObject { + var dir = "Assets/"; + var selected = Selection.activeObject; + if (selected != null) { + var assetDir = AssetDatabase.GetAssetPath(selected.GetInstanceID()); + if (assetDir.Length > 0 && Directory.Exists(assetDir)) + dir = assetDir + "/"; + } + ScriptableObject asset = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(asset, dir + name + ".asset"); + AssetDatabase.SaveAssets(); + EditorUtility.FocusProjectWindow(); + Selection.activeObject = asset; + } + + [MenuItem("GameObject/Spine/SkeletonRenderer", false, 10)] + static public void CreateSkeletonRendererGameObject () { + CreateSpineGameObject("New SkeletonRenderer"); + } + + [MenuItem("GameObject/Spine/SkeletonAnimation", false, 10)] + static public void CreateSkeletonAnimationGameObject () { + CreateSpineGameObject("New SkeletonAnimation"); + } + + static void CreateSpineGameObject (string name) where T : MonoBehaviour { + var parentGameObject = Selection.activeObject as GameObject; + var parentTransform = parentGameObject == null ? null : parentGameObject.transform; + + var gameObject = new GameObject(name, typeof(T)); + gameObject.transform.SetParent(parentTransform, false); + EditorUtility.FocusProjectWindow(); + Selection.activeObject = gameObject; + EditorGUIUtility.PingObject(Selection.activeObject); + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/Menus.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/Menus.cs.meta new file mode 100644 index 0000000..d33433f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/Menus.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: cf21125cbd8928844a85a3ad9002693b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/PointFollowerEditor.cs b/Assets/Spine/Assets/spine-unity/Editor/PointFollowerEditor.cs new file mode 100644 index 0000000..4baf305 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/PointFollowerEditor.cs @@ -0,0 +1,188 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEditor; +using UnityEngine; + +namespace Spine.Unity.Editor { + + using Editor = UnityEditor.Editor; + using Event = UnityEngine.Event; + + [CustomEditor(typeof(PointFollower)), CanEditMultipleObjects] + public class PointFollowerEditor : Editor { + SerializedProperty slotName, pointAttachmentName, skeletonRenderer, followZPosition, followBoneRotation, followSkeletonFlip; + PointFollower targetPointFollower; + bool needsReset; + + #region Context Menu Item + [MenuItem("CONTEXT/SkeletonRenderer/Add PointFollower GameObject")] + static void AddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + var go = new GameObject("PointFollower"); + var t = go.transform; + t.SetParent(skeletonRenderer.transform); + t.localPosition = Vector3.zero; + + var f = go.AddComponent(); + f.skeletonRenderer = skeletonRenderer; + + EditorGUIUtility.PingObject(t); + + Undo.RegisterCreatedObjectUndo(go, "Add PointFollower"); + } + + // Validate + [MenuItem("CONTEXT/SkeletonRenderer/Add PointFollower GameObject", true)] + static bool ValidateAddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + return skeletonRenderer.valid; + } + #endregion + + void OnEnable () { + skeletonRenderer = serializedObject.FindProperty("skeletonRenderer"); + slotName = serializedObject.FindProperty("slotName"); + pointAttachmentName = serializedObject.FindProperty("pointAttachmentName"); + + targetPointFollower = (PointFollower)target; + if (targetPointFollower.skeletonRenderer != null) + targetPointFollower.skeletonRenderer.Initialize(false); + + if (!targetPointFollower.IsValid || needsReset) { + targetPointFollower.Initialize(); + targetPointFollower.LateUpdate(); + needsReset = false; + SceneView.RepaintAll(); + } + } + + public void OnSceneGUI () { + var tbf = target as PointFollower; + var skeletonRendererComponent = tbf.skeletonRenderer; + if (skeletonRendererComponent == null) + return; + + var skeleton = skeletonRendererComponent.skeleton; + var skeletonTransform = skeletonRendererComponent.transform; + + if (string.IsNullOrEmpty(pointAttachmentName.stringValue)) { + // Draw all active PointAttachments in the current skin + var currentSkin = skeleton.Skin; + if (currentSkin != skeleton.Data.DefaultSkin) DrawPointsInSkin(skeleton.Data.DefaultSkin, skeleton, skeletonTransform); + if (currentSkin != null) DrawPointsInSkin(currentSkin, skeleton, skeletonTransform); + } else { + int slotIndex = skeleton.FindSlotIndex(slotName.stringValue); + if (slotIndex >= 0) { + var slot = skeleton.Slots.Items[slotIndex]; + var point = skeleton.GetAttachment(slotIndex, pointAttachmentName.stringValue) as PointAttachment; + if (point != null) { + DrawPointAttachmentWithLabel(point, slot.Bone, skeletonTransform); + } + } + } + } + + static void DrawPointsInSkin (Skin skin, Skeleton skeleton, Transform transform) { + foreach (var skinEntry in skin.Attachments) { + var attachment = skinEntry.Value as PointAttachment; + if (attachment != null) { + var skinKey = skinEntry.Key; + var slot = skeleton.Slots.Items[skinKey.slotIndex]; + DrawPointAttachmentWithLabel(attachment, slot.Bone, transform); + } + } + } + + static void DrawPointAttachmentWithLabel (PointAttachment point, Bone bone, Transform transform) { + Vector3 labelOffset = new Vector3(0f, -0.2f, 0f); + SpineHandles.DrawPointAttachment(bone, point, transform); + Handles.Label(labelOffset + point.GetWorldPosition(bone, transform), point.Name, SpineHandles.PointNameStyle); + } + + override public void OnInspectorGUI () { + if (serializedObject.isEditingMultipleObjects) { + if (needsReset) { + needsReset = false; + foreach (var o in targets) { + var bf = (BoneFollower)o; + bf.Initialize(); + bf.LateUpdate(); + } + SceneView.RepaintAll(); + } + + EditorGUI.BeginChangeCheck(); + DrawDefaultInspector(); + needsReset |= EditorGUI.EndChangeCheck(); + return; + } + + if (needsReset && Event.current.type == EventType.Layout) { + targetPointFollower.Initialize(); + targetPointFollower.LateUpdate(); + needsReset = false; + SceneView.RepaintAll(); + } + serializedObject.Update(); + + DrawDefaultInspector(); + + // Find Renderer + if (skeletonRenderer.objectReferenceValue == null) { + SkeletonRenderer parentRenderer = targetPointFollower.GetComponentInParent(); + if (parentRenderer != null && parentRenderer.gameObject != targetPointFollower.gameObject) { + skeletonRenderer.objectReferenceValue = parentRenderer; + Debug.Log("Inspector automatically assigned PointFollower.SkeletonRenderer"); + } + } + + var skeletonRendererReference = skeletonRenderer.objectReferenceValue as SkeletonRenderer; + if (skeletonRendererReference != null) { + if (skeletonRendererReference.gameObject == targetPointFollower.gameObject) { + skeletonRenderer.objectReferenceValue = null; + EditorUtility.DisplayDialog("Invalid assignment.", "PointFollower can only follow a skeleton on a separate GameObject.\n\nCreate a new GameObject for your PointFollower, or choose a SkeletonRenderer from a different GameObject.", "Ok"); + } + } + + if (!targetPointFollower.IsValid) { + needsReset = true; + } + + var current = Event.current; + bool wasUndo = (current.type == EventType.ValidateCommand && current.commandName == "UndoRedoPerformed"); + if (wasUndo) + targetPointFollower.Initialize(); + + serializedObject.ApplyModifiedProperties(); + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/PointFollowerEditor.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/PointFollowerEditor.cs.meta new file mode 100644 index 0000000..2106156 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/PointFollowerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7c7e838a8ec295a4e9c53602f690f42f +timeCreated: 1518163038 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/Resources.meta b/Assets/Spine/Assets/spine-unity/Editor/Resources.meta new file mode 100644 index 0000000..8d1a705 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 24903fdac57ee784b9597fcb751ec22f +folderAsset: yes +timeCreated: 1444565388 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/Resources/SpineAssetDatabaseMarker.txt b/Assets/Spine/Assets/spine-unity/Editor/Resources/SpineAssetDatabaseMarker.txt new file mode 100644 index 0000000..1a3c1a3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/Resources/SpineAssetDatabaseMarker.txt @@ -0,0 +1 @@ +DO NOT MOVE OR DELETE THIS FILE \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Editor/Resources/SpineAssetDatabaseMarker.txt.meta b/Assets/Spine/Assets/spine-unity/Editor/Resources/SpineAssetDatabaseMarker.txt.meta new file mode 100644 index 0000000..7569884 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/Resources/SpineAssetDatabaseMarker.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57281c00bdd90ad4392f811f2b9f0da1 +timeCreated: 1444565392 +licenseType: Pro +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs new file mode 100644 index 0000000..b5755dc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs @@ -0,0 +1,143 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEditor; +using UnityEngine; +using Spine; + +namespace Spine.Unity.Editor { + + [CustomEditor(typeof(SkeletonAnimation))] + [CanEditMultipleObjects] + public class SkeletonAnimationInspector : SkeletonRendererInspector { + protected SerializedProperty animationName, loop, timeScale, autoReset; + protected bool wasAnimationNameChanged; + protected bool requireRepaint; + readonly GUIContent LoopLabel = new GUIContent("Loop", "Whether or not .AnimationName should loop. This only applies to the initial animation specified in the inspector, or any subsequent Animations played through .AnimationName. Animations set through state.SetAnimation are unaffected."); + readonly GUIContent TimeScaleLabel = new GUIContent("Time Scale", "The rate at which animations progress over time. 1 means normal speed. 0.5 means 50% speed."); + + protected override void OnEnable () { + base.OnEnable(); + animationName = serializedObject.FindProperty("_animationName"); + loop = serializedObject.FindProperty("loop"); + timeScale = serializedObject.FindProperty("timeScale"); + } + + protected override void DrawInspectorGUI (bool multi) { + base.DrawInspectorGUI(multi); + if (!TargetIsValid) return; + bool sameData = SpineInspectorUtility.TargetsUseSameData(serializedObject); + + if (multi) { + foreach (var o in targets) + TrySetAnimation(o, multi); + + EditorGUILayout.Space(); + if (!sameData) { + #if UNITY_5_3_OR_NEWER + EditorGUILayout.DelayedTextField(animationName); + #else + animationName.stringValue = EditorGUILayout.TextField(animationName.displayName, animationName.stringValue); + #endif + } else { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(animationName); + wasAnimationNameChanged |= EditorGUI.EndChangeCheck(); // Value used in the next update. + } + EditorGUILayout.PropertyField(loop); + EditorGUILayout.PropertyField(timeScale); + foreach (var o in targets) { + var component = o as SkeletonAnimation; + component.timeScale = Mathf.Max(component.timeScale, 0); + } + } else { + TrySetAnimation(target, multi); + + EditorGUILayout.Space(); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(animationName); + wasAnimationNameChanged |= EditorGUI.EndChangeCheck(); // Value used in the next update. + EditorGUILayout.PropertyField(loop, LoopLabel); + EditorGUILayout.PropertyField(timeScale, TimeScaleLabel); + var component = (SkeletonAnimation)target; + component.timeScale = Mathf.Max(component.timeScale, 0); + EditorGUILayout.Space(); + } + + if (!isInspectingPrefab) { + if (requireRepaint) { + SceneView.RepaintAll(); + requireRepaint = false; + } + } + } + + protected void TrySetAnimation (Object o, bool multi) { + var skeletonAnimation = o as SkeletonAnimation; + if (skeletonAnimation == null) return; + if (!skeletonAnimation.valid) + return; + + if (!isInspectingPrefab) { + if (wasAnimationNameChanged) { + if (!Application.isPlaying) { + if (skeletonAnimation.state != null) skeletonAnimation.state.ClearTrack(0); + skeletonAnimation.skeleton.SetToSetupPose(); + } + + Spine.Animation animationToUse = skeletonAnimation.skeleton.Data.FindAnimation(animationName.stringValue); + + if (!Application.isPlaying) { + if (animationToUse != null) animationToUse.PoseSkeleton(skeletonAnimation.Skeleton, 0f); + skeletonAnimation.Update(0); + skeletonAnimation.LateUpdate(); + requireRepaint = true; + } else { + if (animationToUse != null) + skeletonAnimation.state.SetAnimation(0, animationToUse, loop.boolValue); + else + skeletonAnimation.state.ClearTrack(0); + } + + wasAnimationNameChanged = false; + } + + // Reflect animationName serialized property in the inspector even if SetAnimation API was used. + if (!multi && Application.isPlaying) { + TrackEntry current = skeletonAnimation.state.GetCurrent(0); + if (current != null) { + if (skeletonAnimation.AnimationName != animationName.stringValue) + animationName.stringValue = current.Animation.Name; + } + } + } + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs.meta new file mode 100644 index 0000000..1ca7941 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 39fbfef61034ca045b5aa80088e1e8a4 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimatorInspector.cs b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimatorInspector.cs new file mode 100644 index 0000000..d33a3b3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimatorInspector.cs @@ -0,0 +1,51 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEditor; + +namespace Spine.Unity.Editor { + [CustomEditor(typeof(SkeletonAnimator))] + [CanEditMultipleObjects] + public class SkeletonAnimatorInspector : SkeletonRendererInspector { + protected SerializedProperty mecanimTranslator; + + protected override void OnEnable () { + base.OnEnable(); + mecanimTranslator = serializedObject.FindProperty("translator"); + } + + protected override void DrawInspectorGUI (bool multi) { + base.DrawInspectorGUI(multi); + EditorGUILayout.PropertyField(mecanimTranslator, true); + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimatorInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimatorInspector.cs.meta new file mode 100644 index 0000000..9ef306e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonAnimatorInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6a9ca5213a3a4614c9a9f2e60909bc33 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonBaker.cs b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBaker.cs new file mode 100644 index 0000000..e2c2a67 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBaker.cs @@ -0,0 +1,1426 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +#define SPINE_SKELETON_ANIMATOR + +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.IO; +using Spine; + +namespace Spine.Unity.Editor { + + /// + /// [SUPPORTS] + /// Linear, Constant, and Bezier Curves* + /// Inverse Kinematics* + /// Inherit Rotation + /// Translate Timeline + /// Rotate Timeline + /// Scale Timeline** + /// Event Timeline*** + /// Attachment Timeline + /// + /// RegionAttachment + /// MeshAttachment (optionally Skinned) + /// + /// [LIMITATIONS] + /// *Bezier Curves are baked into the animation at 60fps and are not realtime. Use bakeIncrement constant to adjust key density if desired. + /// *Inverse Kinematics is baked into the animation at 60fps and are not realtime. Use bakeIncrement constant to adjust key density if desired. + /// ***Events may only fire 1 type of data per event in Unity safely so priority to String data if present in Spine key, otherwise a Float is sent whether the Spine key was Int or Float with priority given to Int. + /// + /// [DOES NOT SUPPORT] + /// FFD (Unity does not provide access to BlendShapes with code) + /// Color Keys (Maybe one day when Unity supports full FBX standard and provides access with code) + /// Draw Order Keyframes + /// + public static class SkeletonBaker { + + #region SkeletonAnimator's Mecanim Clips + #if SPINE_SKELETON_ANIMATOR + public static void GenerateMecanimAnimationClips (SkeletonDataAsset skeletonDataAsset) { + var data = skeletonDataAsset.GetSkeletonData(true); + if (data == null) { + Debug.LogError("SkeletonData loading failed!", skeletonDataAsset); + return; + } + + string dataPath = AssetDatabase.GetAssetPath(skeletonDataAsset); + string controllerPath = dataPath.Replace(SpineEditorUtilities.SkeletonDataSuffix, "_Controller").Replace(".asset", ".controller"); + UnityEditor.Animations.AnimatorController controller; + if (skeletonDataAsset.controller != null) { + controller = (UnityEditor.Animations.AnimatorController)skeletonDataAsset.controller; + controllerPath = AssetDatabase.GetAssetPath(controller); + } else { + if (File.Exists(controllerPath)) { + if (EditorUtility.DisplayDialog("Controller Overwrite Warning", "Unknown Controller already exists at: " + controllerPath, "Update", "Overwrite")) { + controller = (UnityEditor.Animations.AnimatorController)AssetDatabase.LoadAssetAtPath(controllerPath, typeof(RuntimeAnimatorController)); + } else { + controller = (UnityEditor.Animations.AnimatorController)UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(controllerPath); + } + } else { + controller = (UnityEditor.Animations.AnimatorController)UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(controllerPath); + } + + } + + skeletonDataAsset.controller = controller; + EditorUtility.SetDirty(skeletonDataAsset); + + UnityEngine.Object[] objs = AssetDatabase.LoadAllAssetsAtPath(controllerPath); + + var unityAnimationClipTable = new Dictionary(); + var spineAnimationTable = new Dictionary(); + + foreach (var o in objs) { + //Debug.LogFormat("({0}){1} : {3} + {2} + {4}", o.GetType(), o.name, o.hideFlags, o.GetInstanceID(), o.GetHashCode()); + // There is a bug in Unity 5.3.3 (and likely before) that creates + // a duplicate AnimationClip when you duplicate a Mecanim Animator State. + // These duplicates seem to be identifiable by their HideFlags, so we'll exclude them. + if (o is AnimationClip) { + var clip = o as AnimationClip; + if (!clip.HasFlag(HideFlags.HideInHierarchy)) { + if (unityAnimationClipTable.ContainsKey(clip.name)) { + Debug.LogWarningFormat("Duplicate AnimationClips were found named {0}", clip.name); + } + unityAnimationClipTable.Add(clip.name, clip); + } + } + } + + foreach (var animations in data.Animations) { + string animationName = animations.Name; // Review for unsafe names. Requires runtime implementation too. + spineAnimationTable.Add(animationName, animations); + + if (unityAnimationClipTable.ContainsKey(animationName) == false) { + AnimationClip newClip = new AnimationClip { + name = animationName + }; + //AssetDatabase.CreateAsset(newClip, Path.GetDirectoryName(dataPath) + "/" + animationName + ".asset"); + AssetDatabase.AddObjectToAsset(newClip, controller); + unityAnimationClipTable.Add(animationName, newClip); + } + + AnimationClip clip = unityAnimationClipTable[animationName]; + clip.SetCurve("", typeof(GameObject), "dummy", AnimationCurve.Linear(0, 0, animations.Duration, 0)); + var settings = AnimationUtility.GetAnimationClipSettings(clip); + settings.stopTime = animations.Duration; + SetAnimationSettings(clip, settings); + + AnimationUtility.SetAnimationEvents(clip, new AnimationEvent[0]); + foreach (Timeline t in animations.Timelines) { + if (t is EventTimeline) + ParseEventTimeline((EventTimeline)t, clip, SendMessageOptions.DontRequireReceiver); + } + + EditorUtility.SetDirty(clip); + unityAnimationClipTable.Remove(animationName); + } + + foreach (var clip in unityAnimationClipTable.Values) { + AnimationClip.DestroyImmediate(clip, true); + } + + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); + } + + static bool HasFlag (this UnityEngine.Object o, HideFlags flagToCheck) { + return (o.hideFlags & flagToCheck) == flagToCheck; + } + #endif + #endregion + + #region Prefab and AnimationClip Baking + /// + /// Interval between key sampling for Bezier curves, IK controlled bones, and Inherit Rotation effected bones. + /// + const float BakeIncrement = 1 / 60f; + + public static void BakeToPrefab (SkeletonDataAsset skeletonDataAsset, ExposedList skins, string outputPath = "", bool bakeAnimations = true, bool bakeIK = true, SendMessageOptions eventOptions = SendMessageOptions.DontRequireReceiver) { + if (skeletonDataAsset == null || skeletonDataAsset.GetSkeletonData(true) == null) { + Debug.LogError("Could not export Spine Skeleton because SkeletonDataAsset is null or invalid!"); + return; + } + + if (outputPath == "") { + outputPath = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(skeletonDataAsset)) + "/Baked"; + System.IO.Directory.CreateDirectory(outputPath); + } + + var skeletonData = skeletonDataAsset.GetSkeletonData(true); + bool hasAnimations = bakeAnimations && skeletonData.Animations.Count > 0; + UnityEditor.Animations.AnimatorController controller = null; + if (hasAnimations) { + string controllerPath = outputPath + "/" + skeletonDataAsset.skeletonJSON.name + " Controller.controller"; + bool newAnimContainer = false; + + var runtimeController = AssetDatabase.LoadAssetAtPath(controllerPath, typeof(RuntimeAnimatorController)); + + if (runtimeController != null) { + controller = (UnityEditor.Animations.AnimatorController)runtimeController; + } else { + controller = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(controllerPath); + newAnimContainer = true; + } + + var existingClipTable = new Dictionary(); + var unusedClipNames = new List(); + Object[] animObjs = AssetDatabase.LoadAllAssetsAtPath(controllerPath); + + foreach (Object o in animObjs) { + if (o is AnimationClip) { + var clip = (AnimationClip)o; + existingClipTable.Add(clip.name, clip); + unusedClipNames.Add(clip.name); + } + } + + Dictionary> slotLookup = new Dictionary>(); + + int skinCount = skins.Count; + + for (int s = 0; s < skeletonData.Slots.Count; s++) { + List attachmentNames = new List(); + for (int i = 0; i < skinCount; i++) { + var skin = skins.Items[i]; + List temp = new List(); + skin.FindNamesForSlot(s, temp); + foreach (string str in temp) { + if (!attachmentNames.Contains(str)) + attachmentNames.Add(str); + } + } + slotLookup.Add(s, attachmentNames); + } + + foreach (var anim in skeletonData.Animations) { + + AnimationClip clip = null; + if (existingClipTable.ContainsKey(anim.Name)) { + clip = existingClipTable[anim.Name]; + } + + clip = ExtractAnimation(anim.Name, skeletonData, slotLookup, bakeIK, eventOptions, clip); + + if (unusedClipNames.Contains(clip.name)) { + unusedClipNames.Remove(clip.name); + } else { + AssetDatabase.AddObjectToAsset(clip, controller); + controller.AddMotion(clip); + } + } + + if (newAnimContainer) { + EditorUtility.SetDirty(controller); + AssetDatabase.SaveAssets(); + AssetDatabase.ImportAsset(controllerPath, ImportAssetOptions.ForceUpdate); + AssetDatabase.Refresh(); + } else { + + foreach (string str in unusedClipNames) { + AnimationClip.DestroyImmediate(existingClipTable[str], true); + } + + EditorUtility.SetDirty(controller); + AssetDatabase.SaveAssets(); + AssetDatabase.ImportAsset(controllerPath, ImportAssetOptions.ForceUpdate); + AssetDatabase.Refresh(); + } + } + + foreach (var skin in skins) { + bool newPrefab = false; + + string prefabPath = outputPath + "/" + skeletonDataAsset.skeletonJSON.name + " (" + skin.Name + ").prefab"; + + + Object prefab = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); + if (prefab == null) { + prefab = PrefabUtility.CreateEmptyPrefab(prefabPath); + newPrefab = true; + } + + Dictionary meshTable = new Dictionary(); + List unusedMeshNames = new List(); + Object[] assets = AssetDatabase.LoadAllAssetsAtPath(prefabPath); + foreach (var obj in assets) { + if (obj is Mesh) { + meshTable.Add(obj.name, (Mesh)obj); + unusedMeshNames.Add(obj.name); + } + } + + GameObject prefabRoot = new GameObject("root"); + + Dictionary slotTable = new Dictionary(); + Dictionary boneTable = new Dictionary(); + List boneList = new List(); + + //create bones + for (int i = 0; i < skeletonData.Bones.Count; i++) { + var boneData = skeletonData.Bones.Items[i]; + Transform boneTransform = new GameObject(boneData.Name).transform; + boneTransform.parent = prefabRoot.transform; + boneTable.Add(boneTransform.name, boneTransform); + boneList.Add(boneTransform); + } + + for (int i = 0; i < skeletonData.Bones.Count; i++) { + + var boneData = skeletonData.Bones.Items[i]; + Transform boneTransform = boneTable[boneData.Name]; + Transform parentTransform = null; + if (i > 0) + parentTransform = boneTable[boneData.Parent.Name]; + else + parentTransform = boneTransform.parent; + + boneTransform.parent = parentTransform; + boneTransform.localPosition = new Vector3(boneData.X, boneData.Y, 0); + var tm = boneData.TransformMode; + if (tm.InheritsRotation()) + boneTransform.localRotation = Quaternion.Euler(0, 0, boneData.Rotation); + else + boneTransform.rotation = Quaternion.Euler(0, 0, boneData.Rotation); + + if (tm.InheritsScale()) + boneTransform.localScale = new Vector3(boneData.ScaleX, boneData.ScaleY, 1); + } + + //create slots and attachments + for (int i = 0; i < skeletonData.Slots.Count; i++) { + var slotData = skeletonData.Slots.Items[i]; + Transform slotTransform = new GameObject(slotData.Name).transform; + slotTransform.parent = prefabRoot.transform; + slotTable.Add(slotData.Name, slotTransform); + + List attachments = new List(); + List attachmentNames = new List(); + + skin.FindAttachmentsForSlot(i, attachments); + skin.FindNamesForSlot(i, attachmentNames); + + if (skin != skeletonData.DefaultSkin) { + skeletonData.DefaultSkin.FindAttachmentsForSlot(i, attachments); + skeletonData.DefaultSkin.FindNamesForSlot(i, attachmentNames); + } + + for (int a = 0; a < attachments.Count; a++) { + var attachment = attachments[a]; + string attachmentName = attachmentNames[a]; + string attachmentMeshName = "[" + slotData.Name + "] " + attachmentName; + Vector3 offset = Vector3.zero; + float rotation = 0; + Mesh mesh = null; + Material material = null; + bool isWeightedMesh = false; + + if (meshTable.ContainsKey(attachmentMeshName)) + mesh = meshTable[attachmentMeshName]; + if (attachment is RegionAttachment) { + var regionAttachment = (RegionAttachment)attachment; + offset.x = regionAttachment.X; + offset.y = regionAttachment.Y; + rotation = regionAttachment.Rotation; + mesh = ExtractRegionAttachment(attachmentMeshName, regionAttachment, mesh); + material = attachment.GetMaterial(); + unusedMeshNames.Remove(attachmentMeshName); + if (newPrefab || meshTable.ContainsKey(attachmentMeshName) == false) + AssetDatabase.AddObjectToAsset(mesh, prefab); + } else if (attachment is MeshAttachment) { + var meshAttachment = (MeshAttachment)attachment; + isWeightedMesh = (meshAttachment.Bones != null); + offset.x = 0; + offset.y = 0; + rotation = 0; + + if (isWeightedMesh) + mesh = ExtractWeightedMeshAttachment(attachmentMeshName, meshAttachment, i, skeletonData, boneList, mesh); + else + mesh = ExtractMeshAttachment(attachmentMeshName, meshAttachment, mesh); + + material = attachment.GetMaterial(); + unusedMeshNames.Remove(attachmentMeshName); + if (newPrefab || meshTable.ContainsKey(attachmentMeshName) == false) + AssetDatabase.AddObjectToAsset(mesh, prefab); + } else + continue; + + Transform attachmentTransform = new GameObject(attachmentName).transform; + + attachmentTransform.parent = slotTransform; + attachmentTransform.localPosition = offset; + attachmentTransform.localRotation = Quaternion.Euler(0, 0, rotation); + + if (isWeightedMesh) { + attachmentTransform.position = Vector3.zero; + attachmentTransform.rotation = Quaternion.identity; + var skinnedMeshRenderer = attachmentTransform.gameObject.AddComponent(); + skinnedMeshRenderer.rootBone = boneList[0]; + skinnedMeshRenderer.bones = boneList.ToArray(); + skinnedMeshRenderer.sharedMesh = mesh; + } else { + attachmentTransform.gameObject.AddComponent().sharedMesh = mesh; + attachmentTransform.gameObject.AddComponent(); + } + + attachmentTransform.GetComponent().sharedMaterial = material; + attachmentTransform.GetComponent().sortingOrder = i; + + if (attachmentName != slotData.AttachmentName) + attachmentTransform.gameObject.SetActive(false); + } + + } + + foreach (var slotData in skeletonData.Slots) { + Transform slotTransform = slotTable[slotData.Name]; + slotTransform.parent = boneTable[slotData.BoneData.Name]; + slotTransform.localPosition = Vector3.zero; + slotTransform.localRotation = Quaternion.identity; + slotTransform.localScale = Vector3.one; + } + + if (hasAnimations) { + var animator = prefabRoot.AddComponent(); + animator.applyRootMotion = false; + animator.runtimeAnimatorController = (RuntimeAnimatorController)controller; + EditorGUIUtility.PingObject(controller); + } + + + if (newPrefab) { + PrefabUtility.ReplacePrefab(prefabRoot, prefab, ReplacePrefabOptions.ConnectToPrefab); + } else { + + foreach (string str in unusedMeshNames) { + Mesh.DestroyImmediate(meshTable[str], true); + } + + PrefabUtility.ReplacePrefab(prefabRoot, prefab, ReplacePrefabOptions.ReplaceNameBased); + } + + EditorGUIUtility.PingObject(prefab); + + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); + + GameObject.DestroyImmediate(prefabRoot); + } + + } + + #region Attachment Baking + static Bone DummyBone; + static Slot DummySlot; + + internal static Bone GetDummyBone () { + if (DummyBone != null) + return DummyBone; + + SkeletonData skelData = new SkeletonData(); + BoneData data = new BoneData(0, "temp", null) { + ScaleX = 1, + ScaleY = 1, + Length = 100 + }; + + skelData.Bones.Add(data); + + Skeleton skeleton = new Skeleton(skelData); + + Bone bone = new Bone(data, skeleton, null); + bone.UpdateWorldTransform(); + + DummyBone = bone; + + return DummyBone; + } + + internal static Slot GetDummySlot () { + if (DummySlot != null) + return DummySlot; + + Bone bone = GetDummyBone(); + + SlotData data = new SlotData(0, "temp", bone.Data); + Slot slot = new Slot(data, bone); + DummySlot = slot; + return DummySlot; + } + + internal static Mesh ExtractRegionAttachment (string name, RegionAttachment attachment, Mesh mesh = null, bool centered = true) { + var bone = GetDummyBone(); + + if (centered) { + bone.X = -attachment.X; + bone.Y = -attachment.Y; + } + + bone.UpdateWorldTransform(); + + Vector2[] uvs = ExtractUV(attachment.UVs); + float[] floatVerts = new float[8]; + attachment.ComputeWorldVertices(bone, floatVerts, 0); + Vector3[] verts = ExtractVerts(floatVerts); + + //unrotate verts now that they're centered + if (centered) { + for (int i = 0; i < verts.Length; i++) + verts[i] = Quaternion.Euler(0, 0, -attachment.Rotation) * verts[i]; + } + + int[] triangles = { 1, 3, 0, 2, 3, 1 }; + Color color = attachment.GetColor(); + + if (mesh == null) + mesh = new Mesh(); + + mesh.triangles = new int[0]; + + mesh.vertices = verts; + mesh.uv = uvs; + mesh.triangles = triangles; + mesh.colors = new [] { color, color, color, color }; + mesh.RecalculateBounds(); + mesh.RecalculateNormals(); + mesh.name = name; + + return mesh; + } + + internal static Mesh ExtractMeshAttachment (string name, MeshAttachment attachment, Mesh mesh = null) { + var slot = GetDummySlot(); + + slot.Bone.X = 0; + slot.Bone.Y = 0; + slot.Bone.UpdateWorldTransform(); + + Vector2[] uvs = ExtractUV(attachment.UVs); + float[] floatVerts = new float[attachment.WorldVerticesLength]; + attachment.ComputeWorldVertices(slot, floatVerts); + Vector3[] verts = ExtractVerts(floatVerts); + + int[] triangles = attachment.Triangles; + Color color = attachment.GetColor(); + + if (mesh == null) + mesh = new Mesh(); + + mesh.triangles = new int[0]; + + mesh.vertices = verts; + mesh.uv = uvs; + mesh.triangles = triangles; + Color[] colors = new Color[verts.Length]; + for (int i = 0; i < verts.Length; i++) + colors[i] = color; + + mesh.colors = colors; + mesh.RecalculateBounds(); + mesh.RecalculateNormals(); + mesh.name = name; + + return mesh; + } + + public class BoneWeightContainer { + public struct Pair { + public Transform bone; + public float weight; + + public Pair (Transform bone, float weight) { + this.bone = bone; + this.weight = weight; + } + } + + public List bones; + public List weights; + public List pairs; + + + public BoneWeightContainer () { + this.bones = new List(); + this.weights = new List(); + this.pairs = new List(); + } + + public void Add (Transform transform, float weight) { + bones.Add(transform); + weights.Add(weight); + + pairs.Add(new Pair(transform, weight)); + } + } + + internal static Mesh ExtractWeightedMeshAttachment (string name, MeshAttachment attachment, int slotIndex, SkeletonData skeletonData, List boneList, Mesh mesh = null) { + if (!attachment.IsWeighted()) + throw new System.ArgumentException("Mesh is not weighted.", "attachment"); + + Skeleton skeleton = new Skeleton(skeletonData); + skeleton.UpdateWorldTransform(); + + float[] floatVerts = new float[attachment.WorldVerticesLength]; + attachment.ComputeWorldVertices(skeleton.Slots.Items[slotIndex], floatVerts); + + Vector2[] uvs = ExtractUV(attachment.UVs); + Vector3[] verts = ExtractVerts(floatVerts); + + int[] triangles = attachment.Triangles; + Color color = new Color(attachment.R, attachment.G, attachment.B, attachment.A); + + mesh = mesh ?? new Mesh(); + + mesh.triangles = new int[0]; + + mesh.vertices = verts; + mesh.uv = uvs; + mesh.triangles = triangles; + Color[] colors = new Color[verts.Length]; + for (int i = 0; i < verts.Length; i++) + colors[i] = color; + + mesh.colors = colors; + mesh.name = name; + mesh.RecalculateNormals(); + mesh.RecalculateBounds(); + + // Handle weights and binding + var weightTable = new Dictionary(); + var warningBuilder = new System.Text.StringBuilder(); + + int[] bones = attachment.Bones; + float[] weights = attachment.Vertices; + for (int w = 0, v = 0, b = 0, n = bones.Length; v < n; w += 2) { + + int nn = bones[v++] + v; + for (; v < nn; v++, b += 3) { + Transform boneTransform = boneList[bones[v]]; + int vIndex = w / 2; + BoneWeightContainer container; + if (weightTable.ContainsKey(vIndex)) + container = weightTable[vIndex]; + else { + container = new BoneWeightContainer(); + weightTable.Add(vIndex, container); + } + + float weight = weights[b + 2]; + container.Add(boneTransform, weight); + } + } + + BoneWeight[] boneWeights = new BoneWeight[weightTable.Count]; + + for (int i = 0; i < weightTable.Count; i++) { + BoneWeight bw = new BoneWeight(); + var container = weightTable[i]; + + var pairs = container.pairs.OrderByDescending(pair => pair.weight).ToList(); + + for (int b = 0; b < pairs.Count; b++) { + if (b > 3) { + if (warningBuilder.Length == 0) + warningBuilder.Insert(0, "[Weighted Mesh: " + name + "]\r\nUnity only supports 4 weight influences per vertex! The 4 strongest influences will be used.\r\n"); + + warningBuilder.AppendFormat("{0} ignored on vertex {1}!\r\n", pairs[b].bone.name, i); + continue; + } + + int boneIndex = boneList.IndexOf(pairs[b].bone); + float weight = pairs[b].weight; + + switch (b) { + case 0: + bw.boneIndex0 = boneIndex; + bw.weight0 = weight; + break; + case 1: + bw.boneIndex1 = boneIndex; + bw.weight1 = weight; + break; + case 2: + bw.boneIndex2 = boneIndex; + bw.weight2 = weight; + break; + case 3: + bw.boneIndex3 = boneIndex; + bw.weight3 = weight; + break; + } + } + + boneWeights[i] = bw; + } + + Matrix4x4[] bindPoses = new Matrix4x4[boneList.Count]; + for (int i = 0; i < boneList.Count; i++) { + bindPoses[i] = boneList[i].worldToLocalMatrix; + } + + mesh.boneWeights = boneWeights; + mesh.bindposes = bindPoses; + + string warningString = warningBuilder.ToString(); + if (warningString.Length > 0) + Debug.LogWarning(warningString); + + + return mesh; + } + + internal static Vector2[] ExtractUV (float[] floats) { + Vector2[] arr = new Vector2[floats.Length / 2]; + + for (int i = 0; i < floats.Length; i += 2) { + arr[i / 2] = new Vector2(floats[i], floats[i + 1]); + } + + return arr; + } + + internal static Vector3[] ExtractVerts (float[] floats) { + Vector3[] arr = new Vector3[floats.Length / 2]; + + for (int i = 0; i < floats.Length; i += 2) { + arr[i / 2] = new Vector3(floats[i], floats[i + 1], 0);// *scale; + } + + return arr; + } + #endregion + + #region Animation Baking + static AnimationClip ExtractAnimation (string name, SkeletonData skeletonData, Dictionary> slotLookup, bool bakeIK, SendMessageOptions eventOptions, AnimationClip clip = null) { + var animation = skeletonData.FindAnimation(name); + + var timelines = animation.Timelines; + + if (clip == null) { + clip = new AnimationClip(); + } else { + clip.ClearCurves(); + AnimationUtility.SetAnimationEvents(clip, new AnimationEvent[0]); + } + + clip.name = name; + + Skeleton skeleton = new Skeleton(skeletonData); + + List ignoreRotateTimelineIndexes = new List(); + + if (bakeIK) { + foreach (IkConstraint i in skeleton.IkConstraints) { + foreach (Bone b in i.Bones) { + int index = skeleton.FindBoneIndex(b.Data.Name); + ignoreRotateTimelineIndexes.Add(index); + BakeBoneConstraints(b, animation, clip); + } + } + } + + foreach (Bone b in skeleton.Bones) { + if (!b.Data.TransformMode.InheritsRotation()) { + int index = skeleton.FindBoneIndex(b.Data.Name); + + if (ignoreRotateTimelineIndexes.Contains(index) == false) { + ignoreRotateTimelineIndexes.Add(index); + BakeBoneConstraints(b, animation, clip); + } + } + } + + foreach (Timeline t in timelines) { + skeleton.SetToSetupPose(); + + if (t is ScaleTimeline) { + ParseScaleTimeline(skeleton, (ScaleTimeline)t, clip); + } else if (t is TranslateTimeline) { + ParseTranslateTimeline(skeleton, (TranslateTimeline)t, clip); + } else if (t is RotateTimeline) { + //bypass any rotation keys if they're going to get baked anyway to prevent localEulerAngles vs Baked collision + if (ignoreRotateTimelineIndexes.Contains(((RotateTimeline)t).BoneIndex) == false) + ParseRotateTimeline(skeleton, (RotateTimeline)t, clip); + } else if (t is AttachmentTimeline) { + ParseAttachmentTimeline(skeleton, (AttachmentTimeline)t, slotLookup, clip); + } else if (t is EventTimeline) { + ParseEventTimeline((EventTimeline)t, clip, eventOptions); + } + + } + + var settings = AnimationUtility.GetAnimationClipSettings(clip); + settings.loopTime = true; + settings.stopTime = Mathf.Max(clip.length, 0.001f); + + SetAnimationSettings(clip, settings); + + clip.EnsureQuaternionContinuity(); + + EditorUtility.SetDirty(clip); + + return clip; + } + + static int BinarySearch (float[] values, float target) { + int low = 0; + int high = values.Length - 2; + if (high == 0) return 1; + int current = (int)((uint)high >> 1); + while (true) { + if (values[(current + 1)] <= target) + low = current + 1; + else + high = current; + + if (low == high) return (low + 1); + current = (int)((uint)(low + high) >> 1); + } + } + + static void BakeBoneConstraints (Bone bone, Spine.Animation animation, AnimationClip clip) { + Skeleton skeleton = bone.Skeleton; + bool inheritRotation = bone.Data.TransformMode.InheritsRotation(); + + animation.PoseSkeleton(skeleton, 0); + skeleton.UpdateWorldTransform(); + float duration = animation.Duration; + + AnimationCurve curve = new AnimationCurve(); + + List keys = new List(); + + float rotation = bone.AppliedRotation; + if (!inheritRotation) + rotation = GetUninheritedAppliedRotation(bone); + + keys.Add(new Keyframe(0, rotation, 0, 0)); + + int listIndex = 1; + + float r = rotation; + + int steps = Mathf.CeilToInt(duration / BakeIncrement); + + float currentTime = 0; + float angle = rotation; + + for (int i = 1; i <= steps; i++) { + currentTime += BakeIncrement; + if (i == steps) + currentTime = duration; + + animation.PoseSkeleton(skeleton, currentTime, true); + skeleton.UpdateWorldTransform(); + + int pIndex = listIndex - 1; + + Keyframe pk = keys[pIndex]; + + pk = keys[pIndex]; + + rotation = inheritRotation ? bone.AppliedRotation : GetUninheritedAppliedRotation(bone); + + angle += Mathf.DeltaAngle(angle, rotation); + + r = angle; + + float rOut = (r - pk.value) / (currentTime - pk.time); + + pk.outTangent = rOut; + + keys.Add(new Keyframe(currentTime, r, rOut, 0)); + + keys[pIndex] = pk; + + listIndex++; + } + + curve = EnsureCurveKeyCount(new AnimationCurve(keys.ToArray())); + + string path = GetPath(bone.Data); + string propertyName = "localEulerAnglesBaked"; + + EditorCurveBinding xBind = EditorCurveBinding.FloatCurve(path, typeof(Transform), propertyName + ".x"); + AnimationUtility.SetEditorCurve(clip, xBind, new AnimationCurve()); + EditorCurveBinding yBind = EditorCurveBinding.FloatCurve(path, typeof(Transform), propertyName + ".y"); + AnimationUtility.SetEditorCurve(clip, yBind, new AnimationCurve()); + EditorCurveBinding zBind = EditorCurveBinding.FloatCurve(path, typeof(Transform), propertyName + ".z"); + AnimationUtility.SetEditorCurve(clip, zBind, curve); + } + + static void ParseTranslateTimeline (Skeleton skeleton, TranslateTimeline timeline, AnimationClip clip) { + var boneData = skeleton.Data.Bones.Items[timeline.BoneIndex]; + var bone = skeleton.Bones.Items[timeline.BoneIndex]; + + AnimationCurve xCurve = new AnimationCurve(); + AnimationCurve yCurve = new AnimationCurve(); + AnimationCurve zCurve = new AnimationCurve(); + + float endTime = timeline.Frames[(timeline.FrameCount * 3) - 3]; + + float currentTime = timeline.Frames[0]; + + List xKeys = new List(); + List yKeys = new List(); + + xKeys.Add(new Keyframe(timeline.Frames[0], timeline.Frames[1] + boneData.X, 0, 0)); + yKeys.Add(new Keyframe(timeline.Frames[0], timeline.Frames[2] + boneData.Y, 0, 0)); + + int listIndex = 1; + int frameIndex = 1; + int f = 3; + float[] frames = timeline.Frames; + skeleton.SetToSetupPose(); + float lastTime = 0; + while (currentTime < endTime) { + int pIndex = listIndex - 1; + + float curveType = timeline.GetCurveType(frameIndex - 1); + if (curveType == 0) { + //linear + Keyframe px = xKeys[pIndex]; + Keyframe py = yKeys[pIndex]; + + float time = frames[f]; + float x = frames[f + 1] + boneData.X; + float y = frames[f + 2] + boneData.Y; + + float xOut = (x - px.value) / (time - px.time); + float yOut = (y - py.value) / (time - py.time); + + px.outTangent = xOut; + py.outTangent = yOut; + + xKeys.Add(new Keyframe(time, x, xOut, 0)); + yKeys.Add(new Keyframe(time, y, yOut, 0)); + + xKeys[pIndex] = px; + yKeys[pIndex] = py; + + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + lastTime = time; + listIndex++; + } else if (curveType == 1) { + //stepped + Keyframe px = xKeys[pIndex]; + Keyframe py = yKeys[pIndex]; + + float time = frames[f]; + float x = frames[f + 1] + boneData.X; + float y = frames[f + 2] + boneData.Y; + + float xOut = float.PositiveInfinity; + float yOut = float.PositiveInfinity; + + px.outTangent = xOut; + py.outTangent = yOut; + + xKeys.Add(new Keyframe(time, x, xOut, 0)); + yKeys.Add(new Keyframe(time, y, yOut, 0)); + + xKeys[pIndex] = px; + yKeys[pIndex] = py; + + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + lastTime = time; + listIndex++; + } else if (curveType == 2) { + + //bezier + Keyframe px = xKeys[pIndex]; + Keyframe py = yKeys[pIndex]; + + float time = frames[f]; + + int steps = Mathf.FloorToInt((time - px.time) / BakeIncrement); + + for (int i = 1; i <= steps; i++) { + currentTime += BakeIncrement; + if (i == steps) + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + px = xKeys[listIndex - 1]; + py = yKeys[listIndex - 1]; + + float xOut = (bone.X - px.value) / (currentTime - px.time); + float yOut = (bone.Y - py.value) / (currentTime - py.time); + + px.outTangent = xOut; + py.outTangent = yOut; + + xKeys.Add(new Keyframe(currentTime, bone.X, xOut, 0)); + yKeys.Add(new Keyframe(currentTime, bone.Y, yOut, 0)); + + xKeys[listIndex - 1] = px; + yKeys[listIndex - 1] = py; + + listIndex++; + lastTime = currentTime; + } + } + + frameIndex++; + f += 3; + } + + xCurve = EnsureCurveKeyCount(new AnimationCurve(xKeys.ToArray())); + yCurve = EnsureCurveKeyCount(new AnimationCurve(yKeys.ToArray())); + + + + string path = GetPath(boneData); + const string propertyName = "localPosition"; + + clip.SetCurve(path, typeof(Transform), propertyName + ".x", xCurve); + clip.SetCurve(path, typeof(Transform), propertyName + ".y", yCurve); + clip.SetCurve(path, typeof(Transform), propertyName + ".z", zCurve); + } + + static void ParseScaleTimeline (Skeleton skeleton, ScaleTimeline timeline, AnimationClip clip) { + var boneData = skeleton.Data.Bones.Items[timeline.BoneIndex]; + var bone = skeleton.Bones.Items[timeline.BoneIndex]; + + AnimationCurve xCurve = new AnimationCurve(); + AnimationCurve yCurve = new AnimationCurve(); + AnimationCurve zCurve = new AnimationCurve(); + + float endTime = timeline.Frames[(timeline.FrameCount * 3) - 3]; + + float currentTime = timeline.Frames[0]; + + List xKeys = new List(); + List yKeys = new List(); + + xKeys.Add(new Keyframe(timeline.Frames[0], timeline.Frames[1] * boneData.ScaleX, 0, 0)); + yKeys.Add(new Keyframe(timeline.Frames[0], timeline.Frames[2] * boneData.ScaleY, 0, 0)); + + int listIndex = 1; + int frameIndex = 1; + int f = 3; + float[] frames = timeline.Frames; + skeleton.SetToSetupPose(); + float lastTime = 0; + while (currentTime < endTime) { + int pIndex = listIndex - 1; + float curveType = timeline.GetCurveType(frameIndex - 1); + + if (curveType == 0) { + //linear + Keyframe px = xKeys[pIndex]; + Keyframe py = yKeys[pIndex]; + + float time = frames[f]; + float x = frames[f + 1] * boneData.ScaleX; + float y = frames[f + 2] * boneData.ScaleY; + + float xOut = (x - px.value) / (time - px.time); + float yOut = (y - py.value) / (time - py.time); + + px.outTangent = xOut; + py.outTangent = yOut; + + xKeys.Add(new Keyframe(time, x, xOut, 0)); + yKeys.Add(new Keyframe(time, y, yOut, 0)); + + xKeys[pIndex] = px; + yKeys[pIndex] = py; + + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + lastTime = time; + listIndex++; + } else if (curveType == 1) { + //stepped + Keyframe px = xKeys[pIndex]; + Keyframe py = yKeys[pIndex]; + + float time = frames[f]; + float x = frames[f + 1] * boneData.ScaleX; + float y = frames[f + 2] * boneData.ScaleY; + + float xOut = float.PositiveInfinity; + float yOut = float.PositiveInfinity; + + px.outTangent = xOut; + py.outTangent = yOut; + + xKeys.Add(new Keyframe(time, x, xOut, 0)); + yKeys.Add(new Keyframe(time, y, yOut, 0)); + + xKeys[pIndex] = px; + yKeys[pIndex] = py; + + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + lastTime = time; + listIndex++; + } else if (curveType == 2) { + //bezier + Keyframe px = xKeys[pIndex]; + Keyframe py = yKeys[pIndex]; + + float time = frames[f]; + + int steps = Mathf.FloorToInt((time - px.time) / BakeIncrement); + + for (int i = 1; i <= steps; i++) { + currentTime += BakeIncrement; + if (i == steps) + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + px = xKeys[listIndex - 1]; + py = yKeys[listIndex - 1]; + + float xOut = (bone.ScaleX - px.value) / (currentTime - px.time); + float yOut = (bone.ScaleY - py.value) / (currentTime - py.time); + + px.outTangent = xOut; + py.outTangent = yOut; + + xKeys.Add(new Keyframe(currentTime, bone.ScaleX, xOut, 0)); + yKeys.Add(new Keyframe(currentTime, bone.ScaleY, yOut, 0)); + + xKeys[listIndex - 1] = px; + yKeys[listIndex - 1] = py; + + listIndex++; + lastTime = currentTime; + } + } + + frameIndex++; + f += 3; + } + + xCurve = EnsureCurveKeyCount(new AnimationCurve(xKeys.ToArray())); + yCurve = EnsureCurveKeyCount(new AnimationCurve(yKeys.ToArray())); + + string path = GetPath(boneData); + string propertyName = "localScale"; + + clip.SetCurve(path, typeof(Transform), propertyName + ".x", xCurve); + clip.SetCurve(path, typeof(Transform), propertyName + ".y", yCurve); + clip.SetCurve(path, typeof(Transform), propertyName + ".z", zCurve); + } + + static void ParseRotateTimeline (Skeleton skeleton, RotateTimeline timeline, AnimationClip clip) { + var boneData = skeleton.Data.Bones.Items[timeline.BoneIndex]; + var bone = skeleton.Bones.Items[timeline.BoneIndex]; + + AnimationCurve curve = new AnimationCurve(); + + float endTime = timeline.Frames[(timeline.FrameCount * 2) - 2]; + + float currentTime = timeline.Frames[0]; + + List keys = new List(); + + float rotation = timeline.Frames[1] + boneData.Rotation; + + keys.Add(new Keyframe(timeline.Frames[0], rotation, 0, 0)); + + int listIndex = 1; + int frameIndex = 1; + int f = 2; + float[] frames = timeline.Frames; + skeleton.SetToSetupPose(); + float lastTime = 0; + float angle = rotation; + while (currentTime < endTime) { + int pIndex = listIndex - 1; + float curveType = timeline.GetCurveType(frameIndex - 1); + + if (curveType == 0) { + //linear + Keyframe pk = keys[pIndex]; + + float time = frames[f]; + + rotation = frames[f + 1] + boneData.Rotation; + angle += Mathf.DeltaAngle(angle, rotation); + float r = angle; + + float rOut = (r - pk.value) / (time - pk.time); + + pk.outTangent = rOut; + + keys.Add(new Keyframe(time, r, rOut, 0)); + + keys[pIndex] = pk; + + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + lastTime = time; + listIndex++; + } else if (curveType == 1) { + //stepped + + Keyframe pk = keys[pIndex]; + + float time = frames[f]; + + rotation = frames[f + 1] + boneData.Rotation; + angle += Mathf.DeltaAngle(angle, rotation); + float r = angle; + + float rOut = float.PositiveInfinity; + + pk.outTangent = rOut; + + keys.Add(new Keyframe(time, r, rOut, 0)); + + keys[pIndex] = pk; + + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + + lastTime = time; + listIndex++; + } else if (curveType == 2) { + //bezier + Keyframe pk = keys[pIndex]; + + float time = frames[f]; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + skeleton.UpdateWorldTransform(); + + rotation = frames[f + 1] + boneData.Rotation; + angle += Mathf.DeltaAngle(angle, rotation); + float r = angle; + + int steps = Mathf.FloorToInt((time - pk.time) / BakeIncrement); + + for (int i = 1; i <= steps; i++) { + currentTime += BakeIncrement; + if (i == steps) + currentTime = time; + + timeline.Apply(skeleton, lastTime, currentTime, null, 1, MixPose.Setup, MixDirection.In); + skeleton.UpdateWorldTransform(); + pk = keys[listIndex - 1]; + + rotation = bone.Rotation; + angle += Mathf.DeltaAngle(angle, rotation); + r = angle; + + float rOut = (r - pk.value) / (currentTime - pk.time); + + pk.outTangent = rOut; + + keys.Add(new Keyframe(currentTime, r, rOut, 0)); + + keys[listIndex - 1] = pk; + + listIndex++; + lastTime = currentTime; + } + } + + frameIndex++; + f += 2; + } + + curve = EnsureCurveKeyCount(new AnimationCurve(keys.ToArray())); + + string path = GetPath(boneData); + const string propertyName = "localEulerAnglesBaked"; + + EditorCurveBinding xBind = EditorCurveBinding.FloatCurve(path, typeof(Transform), propertyName + ".x"); + AnimationUtility.SetEditorCurve(clip, xBind, new AnimationCurve()); + EditorCurveBinding yBind = EditorCurveBinding.FloatCurve(path, typeof(Transform), propertyName + ".y"); + AnimationUtility.SetEditorCurve(clip, yBind, new AnimationCurve()); + EditorCurveBinding zBind = EditorCurveBinding.FloatCurve(path, typeof(Transform), propertyName + ".z"); + AnimationUtility.SetEditorCurve(clip, zBind, curve); + } + + static void ParseEventTimeline (EventTimeline timeline, AnimationClip clip, SendMessageOptions eventOptions) { + + float[] frames = timeline.Frames; + var events = timeline.Events; + + List animEvents = new List(); + for (int i = 0; i < frames.Length; i++) { + var ev = events[i]; + + AnimationEvent ae = new AnimationEvent(); + //MITCH: left todo: Deal with Mecanim's zero-time missed event + ae.time = frames[i]; + ae.functionName = ev.Data.Name; + ae.messageOptions = eventOptions; + + if (!string.IsNullOrEmpty(ev.String)) { + ae.stringParameter = ev.String; + } else { + if (ev.Int == 0 && ev.Float == 0) { + //do nothing, raw function + } else { + if (ev.Int != 0) + ae.floatParameter = (float)ev.Int; + else + ae.floatParameter = ev.Float; + } + + } + + animEvents.Add(ae); + } + + AnimationUtility.SetAnimationEvents(clip, animEvents.ToArray()); + } + + static void ParseAttachmentTimeline (Skeleton skeleton, AttachmentTimeline timeline, Dictionary> slotLookup, AnimationClip clip) { + var attachmentNames = slotLookup[timeline.SlotIndex]; + + string bonePath = GetPath(skeleton.Slots.Items[timeline.SlotIndex].Bone.Data); + string slotPath = bonePath + "/" + skeleton.Slots.Items[timeline.SlotIndex].Data.Name; + + Dictionary curveTable = new Dictionary(); + + foreach (string str in attachmentNames) { + curveTable.Add(str, new AnimationCurve()); + } + + float[] frames = timeline.Frames; + + if (frames[0] != 0) { + string startingName = skeleton.Slots.Items[timeline.SlotIndex].Data.AttachmentName; + foreach (var pair in curveTable) { + if (startingName == "" || startingName == null) { + pair.Value.AddKey(new Keyframe(0, 0, float.PositiveInfinity, float.PositiveInfinity)); + } else { + if (pair.Key == startingName) { + pair.Value.AddKey(new Keyframe(0, 1, float.PositiveInfinity, float.PositiveInfinity)); + } else { + pair.Value.AddKey(new Keyframe(0, 0, float.PositiveInfinity, float.PositiveInfinity)); + } + } + } + } + + float currentTime = timeline.Frames[0]; + float endTime = frames[frames.Length - 1]; + int f = 0; + while (currentTime < endTime) { + float time = frames[f]; + + int frameIndex = (time >= frames[frames.Length - 1] ? frames.Length : BinarySearch(frames, time)) - 1; + + string name = timeline.AttachmentNames[frameIndex]; + foreach (var pair in curveTable) { + if (name == "") { + pair.Value.AddKey(new Keyframe(time, 0, float.PositiveInfinity, float.PositiveInfinity)); + } else { + if (pair.Key == name) { + pair.Value.AddKey(new Keyframe(time, 1, float.PositiveInfinity, float.PositiveInfinity)); + } else { + pair.Value.AddKey(new Keyframe(time, 0, float.PositiveInfinity, float.PositiveInfinity)); + } + } + } + + currentTime = time; + f += 1; + } + + foreach (var pair in curveTable) { + string path = slotPath + "/" + pair.Key; + string prop = "m_IsActive"; + + clip.SetCurve(path, typeof(GameObject), prop, pair.Value); + } + } + + static AnimationCurve EnsureCurveKeyCount (AnimationCurve curve) { + if (curve.length == 1) + curve.AddKey(curve.keys[0].time + 0.25f, curve.keys[0].value); + + return curve; + } + + static float GetUninheritedAppliedRotation (Bone b) { + Bone parent = b.Parent; + float angle = b.AppliedRotation; + + while (parent != null) { + angle -= parent.AppliedRotation; + parent = parent.Parent; + } + + return angle; + } + #endregion + #endregion + + static string GetPath (BoneData b) { + return GetPathRecurse(b).Substring(1); + } + + static string GetPathRecurse (BoneData b) { + if (b == null) return ""; + return GetPathRecurse(b.Parent) + "/" + b.Name; + } + + static void SetAnimationSettings (AnimationClip clip, AnimationClipSettings settings) { + AnimationUtility.SetAnimationClipSettings(clip, settings); + } + + + } + +} + diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonBaker.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBaker.cs.meta new file mode 100644 index 0000000..37b13c9 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBaker.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 687d9be457ea4eb44bf09c35c95ee5cd +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonBakingWindow.cs b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBakingWindow.cs new file mode 100644 index 0000000..0cadad2 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBakingWindow.cs @@ -0,0 +1,145 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace Spine.Unity.Editor { + + using Editor = UnityEditor.Editor; + using Icons = SpineEditorUtilities.Icons; + + public class SkeletonBakingWindow : EditorWindow { + const bool IsUtilityWindow = true; + + [MenuItem("CONTEXT/SkeletonDataAsset/Skeleton Baking", false, 5000)] + public static void Init (MenuCommand command) { + var window = EditorWindow.GetWindow(IsUtilityWindow); + window.minSize = new Vector2(330f, 530f); + window.maxSize = new Vector2(600f, 1000f); + window.titleContent = new GUIContent("Skeleton Baking", Icons.spine); + window.skeletonDataAsset = command.context as SkeletonDataAsset; + window.Show(); + } + + public SkeletonDataAsset skeletonDataAsset; + [SpineSkin(dataField:"skeletonDataAsset")] + public string skinToBake = "default"; + + // Settings + bool bakeAnimations = false; + bool bakeIK = true; + SendMessageOptions bakeEventOptions; + + SerializedObject so; + Skin bakeSkin; + + + void DataAssetChanged () { + bakeSkin = null; + } + + void OnGUI () { + so = so ?? new SerializedObject(this); + + EditorGUIUtility.wideMode = true; + EditorGUILayout.LabelField("Spine Skeleton Prefab Baking", EditorStyles.boldLabel); + + const string BakingWarningMessage = "\nSkeleton baking is not the primary use case for Spine skeletons." + + "\nUse baking if you have specialized uses, such as simplified skeletons with movement driven by physics." + + + "\n\nBaked Skeletons do not support the following:" + + "\n\tDisabled rotation or scale inheritance" + + "\n\tLocal Shear" + + "\n\tAll Constraint types" + + "\n\tWeighted mesh verts with more than 4 bound bones" + + + "\n\nBaked Animations do not support the following:" + + "\n\tMesh Deform Keys" + + "\n\tColor Keys" + + "\n\tDraw Order Keys" + + + "\n\nAnimation Curves are sampled at 60fps and are not realtime." + + "\nConstraint animations are also baked into animation curves." + + "\nSee SkeletonBaker.cs comments for full details.\n"; + + EditorGUILayout.HelpBox(BakingWarningMessage, MessageType.Info, true); + + EditorGUI.BeginChangeCheck(); + var skeletonDataAssetProperty = so.FindProperty("skeletonDataAsset"); + EditorGUILayout.PropertyField(skeletonDataAssetProperty, SpineInspectorUtility.TempContent("SkeletonDataAsset", Icons.spine)); + if (EditorGUI.EndChangeCheck()) { + so.ApplyModifiedProperties(); + DataAssetChanged(); + } + EditorGUILayout.Space(); + + if (skeletonDataAsset == null) return; + var skeletonData = skeletonDataAsset.GetSkeletonData(false); + if (skeletonData == null) return; + bool hasExtraSkins = skeletonData.Skins.Count > 1; + + using (new SpineInspectorUtility.BoxScope(false)) { + EditorGUILayout.LabelField(skeletonDataAsset.name, EditorStyles.boldLabel); + using (new SpineInspectorUtility.IndentScope()) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Bones: " + skeletonData.Bones.Count, Icons.bone)); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Slots: " + skeletonData.Slots.Count, Icons.slotRoot)); + + if (hasExtraSkins) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Skins: " + skeletonData.Skins.Count, Icons.skinsRoot)); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Current skin attachments: " + (bakeSkin == null ? 0 : bakeSkin.Attachments.Count), Icons.skinPlaceholder)); + } else if (skeletonData.Skins.Count == 1) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Skins: 1 (only default Skin)", Icons.skinsRoot)); + } + + int totalAttachments = 0; + foreach (var s in skeletonData.Skins) + totalAttachments += s.Attachments.Count; + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Total Attachments: " + totalAttachments, Icons.genericAttachment)); + } + } + using (new SpineInspectorUtility.BoxScope(false)) { + EditorGUILayout.LabelField("Animations", EditorStyles.boldLabel); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Animations: " + skeletonData.Animations.Count, Icons.animation)); + + using (new SpineInspectorUtility.IndentScope()) { + bakeAnimations = EditorGUILayout.Toggle(SpineInspectorUtility.TempContent("Bake Animations", Icons.animationRoot), bakeAnimations); + using (new EditorGUI.DisabledScope(!bakeAnimations)) { + using (new SpineInspectorUtility.IndentScope()) { + bakeIK = EditorGUILayout.Toggle(SpineInspectorUtility.TempContent("Bake IK", Icons.constraintIK), bakeIK); + bakeEventOptions = (SendMessageOptions)EditorGUILayout.EnumPopup(SpineInspectorUtility.TempContent("Event Options", Icons.userEvent), bakeEventOptions); + } + } + } + } + EditorGUILayout.Space(); + + if (!string.IsNullOrEmpty(skinToBake) && UnityEngine.Event.current.type == EventType.Repaint) + bakeSkin = skeletonData.FindSkin(skinToBake) ?? skeletonData.DefaultSkin; + + var prefabIcon = EditorGUIUtility.FindTexture("PrefabModel Icon"); + + if (hasExtraSkins) { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(so.FindProperty("skinToBake")); + if (EditorGUI.EndChangeCheck()) { + so.ApplyModifiedProperties(); + Repaint(); + } + + if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent(string.Format("Bake Skeleton with Skin ({0})", (bakeSkin == null ? "default" : bakeSkin.Name)), prefabIcon))) { + SkeletonBaker.BakeToPrefab(skeletonDataAsset, new ExposedList(new[] { bakeSkin }), "", bakeAnimations, bakeIK, bakeEventOptions); + } + + if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent(string.Format("Bake All ({0} skins)", skeletonData.Skins.Count), prefabIcon))) { + SkeletonBaker.BakeToPrefab(skeletonDataAsset, skeletonData.Skins, "", bakeAnimations, bakeIK, bakeEventOptions); + } + } else { + if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent("Bake Skeleton", prefabIcon))) { + SkeletonBaker.BakeToPrefab(skeletonDataAsset, new ExposedList(new[] { bakeSkin }), "", bakeAnimations, bakeIK, bakeEventOptions); + } + + } + + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonBakingWindow.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBakingWindow.cs.meta new file mode 100644 index 0000000..4e1aa1d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonBakingWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 868b0caae5b3e65408ece1ab400c4a99 +timeCreated: 1495203966 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs new file mode 100644 index 0000000..6eebbda --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs @@ -0,0 +1,1156 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define SPINE_SKELETON_ANIMATOR + +using System; +using System.Reflection; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +using Spine; + +namespace Spine.Unity.Editor { + using Event = UnityEngine.Event; + using Icons = SpineEditorUtilities.Icons; + using Animation = Spine.Animation; + + [CustomEditor(typeof(SkeletonDataAsset)), CanEditMultipleObjects] + public class SkeletonDataAssetInspector : UnityEditor.Editor { + internal static bool showAnimationStateData = true; + internal static bool showAnimationList = true; + internal static bool showSlotList = false; + internal static bool showAttachments = false; + + SerializedProperty atlasAssets, skeletonJSON, scale, fromAnimation, toAnimation, duration, defaultMix; + #if SPINE_TK2D + SerializedProperty spriteCollection; + #endif + + #if SPINE_SKELETON_ANIMATOR + static bool isMecanimExpanded = false; + SerializedProperty controller; + #endif + + SkeletonDataAsset targetSkeletonDataAsset; + SkeletonData targetSkeletonData; + + readonly List warnings = new List(); + readonly SkeletonInspectorPreview preview = new SkeletonInspectorPreview(); + + GUIStyle activePlayButtonStyle, idlePlayButtonStyle; + readonly GUIContent DefaultMixLabel = new GUIContent("Default Mix Duration", "Sets 'SkeletonDataAsset.defaultMix' in the asset and 'AnimationState.data.defaultMix' at runtime load time."); + + string TargetAssetGUID { get { return AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(targetSkeletonDataAsset)); } } + string LastSkinKey { get { return TargetAssetGUID + "_lastSkin"; } } + string LastSkinName { get { return EditorPrefs.GetString(LastSkinKey, ""); } } + + void OnEnable () { + InitializeEditor(); + } + + void OnDestroy () { + HandleOnDestroyPreview(); + AppDomain.CurrentDomain.DomainUnload -= OnDomainUnload; + EditorApplication.update -= preview.HandleEditorUpdate; + } + + private void OnDomainUnload (object sender, EventArgs e) { + OnDestroy(); + } + + void InitializeEditor () { + SpineEditorUtilities.ConfirmInitialization(); + targetSkeletonDataAsset = (SkeletonDataAsset)target; + + bool newAtlasAssets = atlasAssets == null; + if (newAtlasAssets) atlasAssets = serializedObject.FindProperty("atlasAssets"); + skeletonJSON = serializedObject.FindProperty("skeletonJSON"); + scale = serializedObject.FindProperty("scale"); + fromAnimation = serializedObject.FindProperty("fromAnimation"); + toAnimation = serializedObject.FindProperty("toAnimation"); + duration = serializedObject.FindProperty("duration"); + defaultMix = serializedObject.FindProperty("defaultMix"); + + #if SPINE_SKELETON_ANIMATOR + controller = serializedObject.FindProperty("controller"); + #endif + + #if SPINE_TK2D + if (newAtlasAssets) atlasAssets.isExpanded = false; + spriteCollection = serializedObject.FindProperty("spriteCollection"); + #else + // Analysis disable once ConvertIfToOrExpression + if (newAtlasAssets) atlasAssets.isExpanded = true; +#endif + + // This handles the case where the managed editor assembly is unloaded before recompilation when code changes. + AppDomain.CurrentDomain.DomainUnload -= OnDomainUnload; + AppDomain.CurrentDomain.DomainUnload += OnDomainUnload; + + EditorApplication.update -= preview.HandleEditorUpdate; + EditorApplication.update += preview.HandleEditorUpdate; + preview.OnSkinChanged -= HandlePreviewSkinChanged; + preview.OnSkinChanged += HandlePreviewSkinChanged; + + PopulateWarnings(); + if (targetSkeletonDataAsset.skeletonJSON == null) { + targetSkeletonData = null; + return; + } + + targetSkeletonData = warnings.Count == 0 ? targetSkeletonDataAsset.GetSkeletonData(false) : null; + + if (targetSkeletonData != null && warnings.Count <= 0) { + preview.Initialize(this.Repaint, targetSkeletonDataAsset, this.LastSkinName); + } + + } + + void Clear () { + preview.Clear(); + targetSkeletonDataAsset.Clear(); + targetSkeletonData = null; + } + + override public void OnInspectorGUI () { + // Multi-Editing + if (serializedObject.isEditingMultipleObjects) { + OnInspectorGUIMulti(); + return; + } + + { // Lazy initialization because accessing EditorStyles values in OnEnable during a recompile causes UnityEditor to throw null exceptions. (Unity 5.3.5) + idlePlayButtonStyle = idlePlayButtonStyle ?? new GUIStyle(EditorStyles.miniButton); + if (activePlayButtonStyle == null) { + activePlayButtonStyle = new GUIStyle(idlePlayButtonStyle); + activePlayButtonStyle.normal.textColor = Color.red; + } + } + + serializedObject.Update(); + + // Header + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(target.name + " (SkeletonDataAsset)", Icons.spine), EditorStyles.whiteLargeLabel); + if (targetSkeletonData != null) EditorGUILayout.LabelField("(Drag and Drop to instantiate.)", EditorStyles.miniLabel); + + // Main Serialized Fields + using (var changeCheck = new EditorGUI.ChangeCheckScope()) { + using (new SpineInspectorUtility.BoxScope()) + DrawSkeletonDataFields(); + + using (new SpineInspectorUtility.BoxScope()) { + DrawAtlasAssetsFields(); + HandleAtlasAssetsNulls(); + } + + if (changeCheck.changed) { + if (serializedObject.ApplyModifiedProperties()) { + this.Clear(); + this.InitializeEditor(); + return; + } + } + } + + // Unity Quirk: Some code depends on valid preview. If preview is initialized elsewhere, this can cause contents to change between Layout and Repaint events, causing GUILayout control count errors. + if (warnings.Count <= 0) + preview.Initialize(this.Repaint, targetSkeletonDataAsset, this.LastSkinName); + + if (targetSkeletonData != null) { + GUILayout.Space(20f); + + using (new SpineInspectorUtility.BoxScope(false)) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Mix Settings", Icons.animationRoot), EditorStyles.boldLabel); + DrawAnimationStateInfo(); + EditorGUILayout.Space(); + } + + EditorGUILayout.LabelField("Preview", EditorStyles.boldLabel); + DrawAnimationList(); + if (targetSkeletonData.Animations.Count > 0) { + const string AnimationReferenceButtonText = "Create Animation Reference Assets"; + const string AnimationReferenceTooltipText = "AnimationReferenceAsset acts as Unity asset for a reference to a Spine.Animation. This can be used in inspectors.\n\nIt serializes a reference to a SkeletonDataAsset and an animationName.\n\nAt runtime, a reference to its Spine.Animation is loaded and cached into the object to be used as needed. This skips the need to find and cache animation references in individual MonoBehaviours."; + if (GUILayout.Button(SpineInspectorUtility.TempContent(AnimationReferenceButtonText, Icons.animationRoot, AnimationReferenceTooltipText), GUILayout.Width(250), GUILayout.Height(26))) { + CreateAnimationReferenceAssets(); + } + } + EditorGUILayout.Space(); + DrawSlotList(); + EditorGUILayout.Space(); + + DrawUnityTools(); + + } else { + #if !SPINE_TK2D + // Draw Reimport Button + using (new EditorGUI.DisabledGroupScope(skeletonJSON.objectReferenceValue == null)) { + if (GUILayout.Button(SpineInspectorUtility.TempContent("Attempt Reimport", Icons.warning))) + DoReimport(); + } + #else + EditorGUILayout.HelpBox("Couldn't load SkeletonData.", MessageType.Error); + #endif + + DrawWarningList(); + } + + if (!Application.isPlaying) + serializedObject.ApplyModifiedProperties(); + } + + void CreateAnimationReferenceAssets () { + const string AssetFolderName = "ReferenceAssets"; + string parentFolder = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(targetSkeletonDataAsset)); + string dataPath = parentFolder + "/" + AssetFolderName; + if (!AssetDatabase.IsValidFolder(dataPath)) { + AssetDatabase.CreateFolder(parentFolder, AssetFolderName); + } + + FieldInfo nameField = typeof(AnimationReferenceAsset).GetField("animationName", BindingFlags.NonPublic | BindingFlags.Instance); + FieldInfo skeletonDataAssetField = typeof(AnimationReferenceAsset).GetField("skeletonDataAsset", BindingFlags.NonPublic | BindingFlags.Instance); + foreach (var animation in targetSkeletonData.Animations) { + string assetPath = string.Format("{0}/{1}.asset", dataPath, SpineEditorUtilities.GetPathSafeName(animation.Name)); + AnimationReferenceAsset existingAsset = AssetDatabase.LoadAssetAtPath(assetPath); + if (existingAsset == null) { + AnimationReferenceAsset newAsset = ScriptableObject.CreateInstance(); + skeletonDataAssetField.SetValue(newAsset, targetSkeletonDataAsset); + nameField.SetValue(newAsset, animation.Name); + AssetDatabase.CreateAsset(newAsset, assetPath); + } + } + + var folderObject = AssetDatabase.LoadAssetAtPath(dataPath, typeof(UnityEngine.Object)); + if (folderObject != null) { + Selection.activeObject = folderObject; + EditorGUIUtility.PingObject(folderObject); + } + } + + void OnInspectorGUIMulti () { + + // Skeleton data file field. + using (new SpineInspectorUtility.BoxScope()) { + EditorGUILayout.LabelField("SkeletonData", EditorStyles.boldLabel); + EditorGUILayout.PropertyField(skeletonJSON, SpineInspectorUtility.TempContent(skeletonJSON.displayName, Icons.spine)); + EditorGUILayout.PropertyField(scale); + } + + // Texture source field. + using (new SpineInspectorUtility.BoxScope()) { + EditorGUILayout.LabelField("Atlas", EditorStyles.boldLabel); + #if !SPINE_TK2D + EditorGUILayout.PropertyField(atlasAssets, true); + #else + using (new EditorGUI.DisabledGroupScope(spriteCollection.objectReferenceValue != null)) { + EditorGUILayout.PropertyField(atlasAssets, true); + } + EditorGUILayout.LabelField("spine-tk2d", EditorStyles.boldLabel); + EditorGUILayout.PropertyField(spriteCollection, true); + #endif + } + + // Mix settings. + using (new SpineInspectorUtility.BoxScope()) { + EditorGUILayout.LabelField("Mix Settings", EditorStyles.boldLabel); + SpineInspectorUtility.PropertyFieldWideLabel(defaultMix, DefaultMixLabel, 160); + EditorGUILayout.Space(); + } + + } + + void DrawSkeletonDataFields () { + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.LabelField("SkeletonData", EditorStyles.boldLabel); + if (targetSkeletonData != null) { + var sd = targetSkeletonData; + string m = string.Format("{8} - {0} {1}\nBones: {2}\nConstraints: \n {5} IK \n {6} Path \n {7} Transform\n\nSlots: {3}\nSkins: {4}\n\nAnimations: {9}", + sd.Version, string.IsNullOrEmpty(sd.Version) ? "" : "export ", sd.Bones.Count, sd.Slots.Count, sd.Skins.Count, sd.IkConstraints.Count, sd.PathConstraints.Count, sd.TransformConstraints.Count, skeletonJSON.objectReferenceValue.name, sd.Animations.Count); + EditorGUILayout.LabelField(GUIContent.none, new GUIContent(Icons.info, m), GUILayout.Width(30f)); + } + } + EditorGUILayout.PropertyField(skeletonJSON, SpineInspectorUtility.TempContent(skeletonJSON.displayName, Icons.spine)); + EditorGUILayout.PropertyField(scale); + } + + void DrawAtlasAssetsFields () { + EditorGUILayout.LabelField("Atlas", EditorStyles.boldLabel); + #if !SPINE_TK2D + EditorGUILayout.PropertyField(atlasAssets, true); + #else + using (new EditorGUI.DisabledGroupScope(spriteCollection.objectReferenceValue != null)) { + EditorGUILayout.PropertyField(atlasAssets, true); + } + EditorGUILayout.LabelField("spine-tk2d", EditorStyles.boldLabel); + EditorGUILayout.PropertyField(spriteCollection, true); + #endif + + if (atlasAssets.arraySize == 0) + EditorGUILayout.HelpBox("AtlasAssets array is empty. Skeleton's attachments will load without being mapped to images.", MessageType.Info); + } + + void HandleAtlasAssetsNulls () { + bool hasNulls = false; + foreach (var a in targetSkeletonDataAsset.atlasAssets) { + if (a == null) { + hasNulls = true; + break; + } + } + if (hasNulls) { + if (targetSkeletonDataAsset.atlasAssets.Length == 1) { + EditorGUILayout.HelpBox("Atlas array cannot have null entries!", MessageType.None); + } + else { + EditorGUILayout.HelpBox("Atlas array should not have null entries!", MessageType.Error); + if (SpineInspectorUtility.CenteredButton(SpineInspectorUtility.TempContent("Remove null entries"))) { + var trimmedAtlasAssets = new List(); + foreach (var a in targetSkeletonDataAsset.atlasAssets) { + if (a != null) + trimmedAtlasAssets.Add(a); + } + targetSkeletonDataAsset.atlasAssets = trimmedAtlasAssets.ToArray(); + serializedObject.Update(); + } + } + } + } + + void DrawAnimationStateInfo () { + using (new SpineInspectorUtility.IndentScope()) + showAnimationStateData = EditorGUILayout.Foldout(showAnimationStateData, "Animation State Data"); + + if (!showAnimationStateData) + return; + + using (var cc = new EditorGUI.ChangeCheckScope()) { + using (new SpineInspectorUtility.IndentScope()) + SpineInspectorUtility.PropertyFieldWideLabel(defaultMix, DefaultMixLabel, 160); + + // Do not use EditorGUIUtility.indentLevel. It will add spaces on every field. + for (int i = 0; i < fromAnimation.arraySize; i++) { + SerializedProperty from = fromAnimation.GetArrayElementAtIndex(i); + SerializedProperty to = toAnimation.GetArrayElementAtIndex(i); + SerializedProperty durationProp = duration.GetArrayElementAtIndex(i); + using (new EditorGUILayout.HorizontalScope()) { + GUILayout.Space(16f); + EditorGUILayout.PropertyField(from, GUIContent.none); + EditorGUILayout.PropertyField(to, GUIContent.none); + durationProp.floatValue = EditorGUILayout.FloatField(durationProp.floatValue, GUILayout.MinWidth(25f), GUILayout.MaxWidth(60f)); + if (GUILayout.Button("Delete", EditorStyles.miniButton)) { + duration.DeleteArrayElementAtIndex(i); + toAnimation.DeleteArrayElementAtIndex(i); + fromAnimation.DeleteArrayElementAtIndex(i); + } + } + } + + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.Space(); + if (GUILayout.Button("Add Mix")) { + duration.arraySize++; + toAnimation.arraySize++; + fromAnimation.arraySize++; + } + EditorGUILayout.Space(); + } + + if (cc.changed) { + targetSkeletonDataAsset.FillStateData(); + EditorUtility.SetDirty(targetSkeletonDataAsset); + serializedObject.ApplyModifiedProperties(); + } + } + } + + void DrawAnimationList () { + showAnimationList = EditorGUILayout.Foldout(showAnimationList, SpineInspectorUtility.TempContent(string.Format("Animations [{0}]", targetSkeletonData.Animations.Count), Icons.animationRoot)); + if (!showAnimationList) + return; + + bool isPreviewWindowOpen = preview.IsValid; + + if (isPreviewWindowOpen) { + if (GUILayout.Button(SpineInspectorUtility.TempContent("Setup Pose", Icons.skeleton), GUILayout.Width(105), GUILayout.Height(18))) { + preview.ClearAnimationSetupPose(); + preview.RefreshOnNextUpdate(); + } + } else { + EditorGUILayout.HelpBox("Animations can be previewed if you expand the Preview window below.", MessageType.Info); + } + + EditorGUILayout.LabelField("Name", " Duration"); + //bool nonessential = targetSkeletonData.ImagesPath != null; // Currently the only way to determine if skeleton data has nonessential data. (Spine 3.6) + //float fps = targetSkeletonData.Fps; + //if (nonessential && fps == 0) fps = 30; + + var activeTrack = preview.ActiveTrack; + foreach (Animation animation in targetSkeletonData.Animations) { + using (new GUILayout.HorizontalScope()) { + if (isPreviewWindowOpen) { + bool active = activeTrack != null && activeTrack.Animation == animation; + //bool sameAndPlaying = active && activeTrack.TimeScale > 0f; + if (GUILayout.Button("\u25BA", active ? activePlayButtonStyle : idlePlayButtonStyle, GUILayout.Width(24))) { + preview.PlayPauseAnimation(animation.Name, true); + activeTrack = preview.ActiveTrack; + } + } else { + GUILayout.Label("-", GUILayout.Width(24)); + } + //string frameCountString = (fps > 0) ? ("(" + (Mathf.RoundToInt(animation.Duration * fps)) + ")").PadLeft(12, ' ') : string.Empty; + //EditorGUILayout.LabelField(new GUIContent(animation.Name, Icons.animation), SpineInspectorUtility.TempContent(animation.Duration.ToString("f3") + "s" + frameCountString)); + EditorGUILayout.LabelField(new GUIContent(animation.Name, Icons.animation), SpineInspectorUtility.TempContent(animation.Duration.ToString("f3") + "s")); + } + } + } + + void DrawSlotList () { + showSlotList = EditorGUILayout.Foldout(showSlotList, SpineInspectorUtility.TempContent("Slots", Icons.slotRoot)); + + if (!showSlotList) return; + if (!preview.IsValid) return; + + EditorGUI.indentLevel++; + showAttachments = EditorGUILayout.ToggleLeft("Show Attachments", showAttachments); + var slotAttachments = new List(); + var slotAttachmentNames = new List(); + var defaultSkinAttachmentNames = new List(); + var defaultSkin = targetSkeletonData.Skins.Items[0]; + Skin skin = preview.Skeleton.Skin ?? defaultSkin; + var slotsItems = preview.Skeleton.Slots.Items; + + for (int i = preview.Skeleton.Slots.Count - 1; i >= 0; i--) { + Slot slot = slotsItems[i]; + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(slot.Data.Name, Icons.slot)); + if (showAttachments) { + + EditorGUI.indentLevel++; + slotAttachments.Clear(); + slotAttachmentNames.Clear(); + defaultSkinAttachmentNames.Clear(); + + skin.FindNamesForSlot(i, slotAttachmentNames); + skin.FindAttachmentsForSlot(i, slotAttachments); + + if (skin != defaultSkin) { + defaultSkin.FindNamesForSlot(i, defaultSkinAttachmentNames); + defaultSkin.FindNamesForSlot(i, slotAttachmentNames); + defaultSkin.FindAttachmentsForSlot(i, slotAttachments); + } else { + defaultSkin.FindNamesForSlot(i, defaultSkinAttachmentNames); + } + + for (int a = 0; a < slotAttachments.Count; a++) { + Attachment attachment = slotAttachments[a]; + string attachmentName = slotAttachmentNames[a]; + Texture2D icon = Icons.GetAttachmentIcon(attachment); + bool initialState = slot.Attachment == attachment; + bool toggled = EditorGUILayout.ToggleLeft(SpineInspectorUtility.TempContent(attachmentName, icon), slot.Attachment == attachment); + + if (!defaultSkinAttachmentNames.Contains(attachmentName)) { + Rect skinPlaceHolderIconRect = GUILayoutUtility.GetLastRect(); + skinPlaceHolderIconRect.width = Icons.skinPlaceholder.width; + skinPlaceHolderIconRect.height = Icons.skinPlaceholder.height; + GUI.DrawTexture(skinPlaceHolderIconRect, Icons.skinPlaceholder); + } + + if (toggled != initialState) { + slot.Attachment = toggled ? attachment : null; + preview.RefreshOnNextUpdate(); + } + } + EditorGUI.indentLevel--; + } + } + EditorGUI.indentLevel--; + } + + void DrawUnityTools () { + #if SPINE_SKELETON_ANIMATOR + using (new SpineInspectorUtility.BoxScope()) { + isMecanimExpanded = EditorGUILayout.Foldout(isMecanimExpanded, SpineInspectorUtility.TempContent("SkeletonAnimator", SpineInspectorUtility.UnityIcon())); + if (isMecanimExpanded) { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(controller, SpineInspectorUtility.TempContent("Controller", SpineInspectorUtility.UnityIcon())); + if (controller.objectReferenceValue == null) { + + // Generate Mecanim Controller Button + using (new GUILayout.HorizontalScope()) { + GUILayout.Space(EditorGUIUtility.labelWidth); + if (GUILayout.Button(SpineInspectorUtility.TempContent("Generate Mecanim Controller"), GUILayout.Height(20))) + SkeletonBaker.GenerateMecanimAnimationClips(targetSkeletonDataAsset); + } + EditorGUILayout.HelpBox("SkeletonAnimator is the Mecanim alternative to SkeletonAnimation.\nIt is not required.", MessageType.Info); + + } else { + + // Update AnimationClips button. + using (new GUILayout.HorizontalScope()) { + GUILayout.Space(EditorGUIUtility.labelWidth); + if (GUILayout.Button(SpineInspectorUtility.TempContent("Force Update AnimationClips"), GUILayout.Height(20))) + SkeletonBaker.GenerateMecanimAnimationClips(targetSkeletonDataAsset); + } + + } + EditorGUI.indentLevel--; + } + } + #endif + } + + void DrawWarningList () { + foreach (string line in warnings) + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(line, Icons.warning)); + } + + void PopulateWarnings () { + warnings.Clear(); + + if (skeletonJSON.objectReferenceValue == null) { + warnings.Add("Missing Skeleton JSON"); + } else { + var fieldValue = (TextAsset)skeletonJSON.objectReferenceValue; + if (!SpineEditorUtilities.SkeletonDataFileValidator.IsSpineData(fieldValue)) { + warnings.Add("Skeleton data file is not a valid JSON or binary file."); + } else { + #if SPINE_TK2D + bool searchForSpineAtlasAssets = true; + bool isSpriteCollectionNull = spriteCollection.objectReferenceValue == null; + if (!isSpriteCollectionNull) searchForSpineAtlasAssets = false; + #else + // Analysis disable once ConvertToConstant.Local + bool searchForSpineAtlasAssets = true; + #endif + + if (searchForSpineAtlasAssets) { + bool detectedNullAtlasEntry = false; + var atlasList = new List(); + var actualAtlasAssets = targetSkeletonDataAsset.atlasAssets; + + for (int i = 0; i < actualAtlasAssets.Length; i++) { + if (targetSkeletonDataAsset.atlasAssets[i] == null) { + detectedNullAtlasEntry = true; + break; + } else { + atlasList.Add(actualAtlasAssets[i].GetAtlas()); + } + } + + if (detectedNullAtlasEntry) { + warnings.Add("AtlasAsset elements should not be null."); + } else { + List missingPaths = null; + if (atlasAssets.arraySize > 0) { + missingPaths = SpineEditorUtilities.GetRequiredAtlasRegions(AssetDatabase.GetAssetPath(skeletonJSON.objectReferenceValue)); + + foreach (var atlas in atlasList) { + for (int i = 0; i < missingPaths.Count; i++) { + if (atlas.FindRegion(missingPaths[i]) != null) { + missingPaths.RemoveAt(i); + i--; + } + } + } + + #if SPINE_TK2D + if (missingPaths.Count > 0) + warnings.Add("Missing regions. SkeletonDataAsset requires tk2DSpriteCollectionData or Spine AtlasAssets."); + #endif + } + + if (missingPaths != null) { + foreach (string str in missingPaths) + warnings.Add("Missing Region: '" + str + "'"); + } + + } + } + + } + } + } + + void DoReimport () { + SpineEditorUtilities.ImportSpineContent(new [] { AssetDatabase.GetAssetPath(skeletonJSON.objectReferenceValue) }, true); + preview.Clear(); + InitializeEditor(); + EditorUtility.SetDirty(targetSkeletonDataAsset); + } + + void HandlePreviewSkinChanged (string skinName) { + EditorPrefs.SetString(LastSkinKey, skinName); + } + + #region Preview Handlers + void HandleOnDestroyPreview () { + EditorApplication.update -= preview.HandleEditorUpdate; + preview.OnDestroy(); + } + + override public bool HasPreviewGUI () { + if (serializedObject.isEditingMultipleObjects) + return false; + + for (int i = 0; i < atlasAssets.arraySize; i++) { + var prop = atlasAssets.GetArrayElementAtIndex(i); + if (prop.objectReferenceValue == null) + return false; + } + + return skeletonJSON.objectReferenceValue != null; + } + + override public void OnInteractivePreviewGUI (Rect r, GUIStyle background) { + if (warnings.Count <= 0) { + preview.Initialize(this.Repaint, targetSkeletonDataAsset, this.LastSkinName); + preview.HandleInteractivePreviewGUI(r, background); + } + } + + override public GUIContent GetPreviewTitle () { return SpineInspectorUtility.TempContent("Preview"); } + public override void OnPreviewSettings () { preview.HandleDrawSettings(); } + public override Texture2D RenderStaticPreview (string assetPath, UnityEngine.Object[] subAssets, int width, int height) { return preview.GetStaticPreview(width, height); } + #endregion + } + + internal class SkeletonInspectorPreview { + Color OriginColor = new Color(0.3f, 0.3f, 0.3f, 1); + static readonly int SliderHash = "Slider".GetHashCode(); + + SkeletonDataAsset skeletonDataAsset; + SkeletonData skeletonData; + + SkeletonAnimation skeletonAnimation; + GameObject previewGameObject; + internal bool requiresRefresh; + + #if !(UNITY_2017_4 || UNITY_2018) + float animationLastTime; + #endif + + static float CurrentTime { get { return (float)EditorApplication.timeSinceStartup; } } + + Action Repaint; + public event Action OnSkinChanged; + + Texture previewTexture; + PreviewRenderUtility previewRenderUtility; + Camera PreviewUtilityCamera { + get { + if (previewRenderUtility == null) return null; + #if UNITY_2017_1_OR_NEWER + return previewRenderUtility.camera; + #else + return previewRenderUtility.m_Camera; + #endif + } + } + + static Vector3 lastCameraPositionGoal; + static float lastCameraOrthoGoal; + float cameraOrthoGoal = 1; + Vector3 cameraPositionGoal = new Vector3(0, 0, -10); + double cameraAdjustEndFrame = 0; + + List currentAnimationEvents = new List(); + List currentAnimationEventTimes = new List(); + List currentAnimationEventTooltips = new List(); + + public bool IsValid { get { return skeletonAnimation != null && skeletonAnimation.valid; } } + + public Skeleton Skeleton { get { return IsValid ? skeletonAnimation.Skeleton : null; } } + + public float TimeScale { + get { return IsValid ? skeletonAnimation.timeScale : 1f; } + set { if (IsValid) skeletonAnimation.timeScale = value; } + } + + public bool IsPlayingAnimation { get { + if (!IsValid) return false; + var currentTrack = skeletonAnimation.AnimationState.GetCurrent(0); + return currentTrack != null && currentTrack.TimeScale > 0; + } + } + + public TrackEntry ActiveTrack { get { return IsValid ? skeletonAnimation.AnimationState.GetCurrent(0) : null; } } + + public Vector3 PreviewCameraPosition { + get { return PreviewUtilityCamera.transform.position; } + set { PreviewUtilityCamera.transform.position = value; } + } + + public void HandleDrawSettings () { + const float SliderWidth = 150; + const float SliderSnap = 0.25f; + const float SliderMin = 0f; + const float SliderMax = 2f; + + if (IsValid) { + float timeScale = GUILayout.HorizontalSlider(TimeScale, SliderMin, SliderMax, GUILayout.MaxWidth(SliderWidth)); + timeScale = Mathf.RoundToInt(timeScale / SliderSnap) * SliderSnap; + TimeScale = timeScale; + } + } + + public void HandleEditorUpdate () { + AdjustCamera(); + if (IsPlayingAnimation) { + RefreshOnNextUpdate(); + Repaint(); + } else if (requiresRefresh) { + Repaint(); + } + } + + public void Initialize (Action repaintCallback, SkeletonDataAsset skeletonDataAsset, string skinName = "") { + if (skeletonDataAsset == null) return; + if (skeletonDataAsset.GetSkeletonData(false) == null) { + DestroyPreviewGameObject(); + return; + } + + this.Repaint = repaintCallback; + this.skeletonDataAsset = skeletonDataAsset; + this.skeletonData = skeletonDataAsset.GetSkeletonData(false); + + if (skeletonData == null) { + DestroyPreviewGameObject(); + return; + } + + if (previewRenderUtility == null) { + previewRenderUtility = new PreviewRenderUtility(true); + #if !(UNITY_2017_4 || UNITY_2018) + animationLastTime = CurrentTime; + #endif + + const int PreviewLayer = 30; + const int PreviewCameraCullingMask = 1 << PreviewLayer; + + { + var c = this.PreviewUtilityCamera; + c.orthographic = true; + c.cullingMask = PreviewCameraCullingMask; + c.nearClipPlane = 0.01f; + c.farClipPlane = 1000f; + c.orthographicSize = lastCameraOrthoGoal; + c.transform.position = lastCameraPositionGoal; + } + + DestroyPreviewGameObject(); + + if (previewGameObject == null) { + try { + previewGameObject = SpineEditorUtilities.InstantiateSkeletonAnimation(skeletonDataAsset, skinName).gameObject; + + if (previewGameObject != null) { + previewGameObject.hideFlags = HideFlags.HideAndDontSave; + previewGameObject.layer = PreviewLayer; + skeletonAnimation = previewGameObject.GetComponent(); + skeletonAnimation.initialSkinName = skinName; + skeletonAnimation.LateUpdate(); + previewGameObject.GetComponent().enabled = false; + + #if UNITY_2017_4 || UNITY_2018 + previewRenderUtility.AddSingleGO(previewGameObject); + #endif + } + + if (this.ActiveTrack != null) cameraAdjustEndFrame = EditorApplication.timeSinceStartup + skeletonAnimation.AnimationState.GetCurrent(0).Alpha; + AdjustCameraGoals(); + } catch { + DestroyPreviewGameObject(); + } + + RefreshOnNextUpdate(); + } + } + } + + public void HandleInteractivePreviewGUI (Rect r, GUIStyle background) { + if (Event.current.type == EventType.Repaint) { + if (requiresRefresh) { + previewRenderUtility.BeginPreview(r, background); + DoRenderPreview(true); + previewTexture = previewRenderUtility.EndPreview(); + requiresRefresh = false; + } + if (previewTexture != null) + GUI.DrawTexture(r, previewTexture, ScaleMode.StretchToFill, false); + } + + DrawSkinToolbar(r); + //DrawSetupPoseButton(r); + DrawTimeBar(r); + HandleMouseScroll(r); + } + + public Texture2D GetStaticPreview (int width, int height) { + var c = this.PreviewUtilityCamera; + if (c == null) + return null; + + RefreshOnNextUpdate(); + AdjustCameraGoals(); + c.orthographicSize = cameraOrthoGoal / 2; + c.transform.position = cameraPositionGoal; + previewRenderUtility.BeginStaticPreview(new Rect(0, 0, width, height)); + DoRenderPreview(false); + var tex = previewRenderUtility.EndStaticPreview(); + + return tex; + } + + public void DoRenderPreview (bool drawHandles) { + if (this.PreviewUtilityCamera.targetTexture == null) + return; + + GameObject go = previewGameObject; + if (requiresRefresh && go != null) { + var renderer = go.GetComponent(); + renderer.enabled = true; + + + if (!EditorApplication.isPlaying) { + #if !(UNITY_2017_4 || UNITY_2018) + float current = CurrentTime; + float deltaTime = (current - animationLastTime); + skeletonAnimation.Update(deltaTime); + animationLastTime = current; + #endif + skeletonAnimation.LateUpdate(); + } + + var thisPreviewUtilityCamera = this.PreviewUtilityCamera; + + if (drawHandles) { + Handles.SetCamera(thisPreviewUtilityCamera); + Handles.color = OriginColor; + + // Draw Cross + float scale = skeletonDataAsset.scale; + float cl = 1000 * scale; + Handles.DrawLine(new Vector3(-cl, 0), new Vector3(cl, 0)); + Handles.DrawLine(new Vector3(0, cl), new Vector3(0, -cl)); + } + + thisPreviewUtilityCamera.Render(); + + if (drawHandles) { + Handles.SetCamera(thisPreviewUtilityCamera); + SpineHandles.DrawBoundingBoxes(skeletonAnimation.transform, skeletonAnimation.skeleton); + if (SkeletonDataAssetInspector.showAttachments) + SpineHandles.DrawPaths(skeletonAnimation.transform, skeletonAnimation.skeleton); + } + + renderer.enabled = false; + } + } + + public void AdjustCamera () { + if (previewRenderUtility == null) + return; + + if (CurrentTime < cameraAdjustEndFrame) + AdjustCameraGoals(); + + lastCameraPositionGoal = cameraPositionGoal; + lastCameraOrthoGoal = cameraOrthoGoal; + + var c = this.PreviewUtilityCamera; + float orthoSet = Mathf.Lerp(c.orthographicSize, cameraOrthoGoal, 0.1f); + + c.orthographicSize = orthoSet; + + float dist = Vector3.Distance(c.transform.position, cameraPositionGoal); + if (dist > 0f) { + Vector3 pos = Vector3.Lerp(c.transform.position, cameraPositionGoal, 0.1f); + pos.x = 0; + c.transform.position = pos; + c.transform.rotation = Quaternion.identity; + RefreshOnNextUpdate(); + } + } + + void AdjustCameraGoals () { + if (previewGameObject == null) return; + + Bounds bounds = previewGameObject.GetComponent().bounds; + cameraOrthoGoal = bounds.size.y; + cameraPositionGoal = bounds.center + new Vector3(0, 0, -10f); + } + + void HandleMouseScroll (Rect position) { + Event current = Event.current; + int controlID = GUIUtility.GetControlID(SliderHash, FocusType.Passive); + switch (current.GetTypeForControl(controlID)) { + case EventType.ScrollWheel: + if (position.Contains(current.mousePosition)) { + cameraOrthoGoal += current.delta.y * 0.06f; + cameraOrthoGoal = Mathf.Max(0.01f, cameraOrthoGoal); + GUIUtility.hotControl = controlID; + current.Use(); + } + break; + } + } + + public void RefreshOnNextUpdate () { + requiresRefresh = true; + } + + public void ClearAnimationSetupPose () { + if (skeletonAnimation == null) { + Debug.LogWarning("Animation was stopped but preview doesn't exist. It's possible that the Preview Panel is closed."); + } + + skeletonAnimation.AnimationState.ClearTracks(); + skeletonAnimation.Skeleton.SetToSetupPose(); + } + + public void PlayPauseAnimation (string animationName, bool loop) { + if (skeletonData == null) return; + + if (skeletonAnimation == null) { + //Debug.LogWarning("Animation was stopped but preview doesn't exist. It's possible that the Preview Panel is closed."); + return; + } + + if (!skeletonAnimation.valid) return; + + if (string.IsNullOrEmpty(animationName)) { + skeletonAnimation.Skeleton.SetToSetupPose(); + skeletonAnimation.AnimationState.ClearTracks(); + return; + } + + var targetAnimation = skeletonData.FindAnimation(animationName); + if (targetAnimation != null) { + var currentTrack = this.ActiveTrack; + bool isEmpty = (currentTrack == null); + bool isNewAnimation = isEmpty || currentTrack.Animation != targetAnimation; + + var skeleton = skeletonAnimation.Skeleton; + var animationState = skeletonAnimation.AnimationState; + + if (isEmpty) { + skeleton.SetToSetupPose(); + animationState.SetAnimation(0, targetAnimation, loop); + } else { + bool sameAnimation = (currentTrack.Animation == targetAnimation); + if (sameAnimation) { + currentTrack.TimeScale = (currentTrack.TimeScale == 0) ? 1f : 0f; // pause/play + } else { + currentTrack.TimeScale = 1f; + animationState.SetAnimation(0, targetAnimation, loop); + } + } + + if (isNewAnimation) { + currentAnimationEvents.Clear(); + currentAnimationEventTimes.Clear(); + foreach (Timeline timeline in targetAnimation.Timelines) { + var eventTimeline = timeline as EventTimeline; + if (eventTimeline != null) { + for (int i = 0; i < eventTimeline.Events.Length; i++) { + currentAnimationEvents.Add(eventTimeline.Events[i]); + currentAnimationEventTimes.Add(eventTimeline.Frames[i]); + } + } + } + } + } else { + Debug.LogFormat("The Spine.Animation named '{0}' was not found for this Skeleton.", animationName); + } + + } + + void DrawSkinToolbar (Rect r) { + if (!this.IsValid) return; + + var skeleton = this.Skeleton; + string label = (skeleton.Skin != null) ? skeleton.Skin.Name : "default"; + + Rect popRect = new Rect(r); + popRect.y += 32; + popRect.x += 4; + popRect.height = 24; + popRect.width = 40; + EditorGUI.DropShadowLabel(popRect, SpineInspectorUtility.TempContent("Skin")); + + popRect.y += 11; + popRect.width = 150; + popRect.x += 44; + + if (GUI.Button(popRect, SpineInspectorUtility.TempContent(label, Icons.skin), EditorStyles.popup)) { + DrawSkinDropdown(); + } + } + + void DrawSetupPoseButton (Rect r) { + if (!this.IsValid) + return; + + var skeleton = this.Skeleton; + + Rect popRect = new Rect(r); + popRect.y += 64; + popRect.x += 4; + popRect.height = 24; + popRect.width = 40; + + //popRect.y += 11; + popRect.width = 150; + //popRect.x += 44; + + if (GUI.Button(popRect, SpineInspectorUtility.TempContent("Reset to SetupPose", Icons.skeleton))) { + ClearAnimationSetupPose(); + RefreshOnNextUpdate(); + } + } + + void DrawSkinDropdown () { + var menu = new GenericMenu(); + foreach (Skin s in skeletonData.Skins) + menu.AddItem(new GUIContent(s.Name, Icons.skin), skeletonAnimation.skeleton.Skin == s, HandleSkinDropdownSelection, s); + + menu.ShowAsContext(); + } + + void HandleSkinDropdownSelection (object o) { + Skin skin = (Skin)o; + skeletonAnimation.initialSkinName = skin.Name; + skeletonAnimation.Initialize(true); + RefreshOnNextUpdate(); + if (OnSkinChanged != null) OnSkinChanged(skin.Name); + } + + void DrawTimeBar (Rect r) { + if (skeletonAnimation == null) + return; + + Rect barRect = new Rect(r); + barRect.height = 32; + barRect.x += 4; + barRect.width -= 4; + + GUI.Box(barRect, ""); + + Rect lineRect = new Rect(barRect); + float lineRectWidth = lineRect.width; + TrackEntry t = skeletonAnimation.AnimationState.GetCurrent(0); + + if (t != null) { + int loopCount = (int)(t.TrackTime / t.TrackEnd); + float currentTime = t.TrackTime - (t.TrackEnd * loopCount); + float normalizedTime = currentTime / t.Animation.Duration; + float wrappedTime = normalizedTime % 1f; + + lineRect.x = barRect.x + (lineRectWidth * wrappedTime) - 0.5f; + lineRect.width = 2; + + GUI.color = Color.red; + GUI.DrawTexture(lineRect, EditorGUIUtility.whiteTexture); + GUI.color = Color.white; + + currentAnimationEventTooltips = currentAnimationEventTooltips ?? new List(); + currentAnimationEventTooltips.Clear(); + for (int i = 0; i < currentAnimationEvents.Count; i++) { + float eventTime = currentAnimationEventTimes[i]; + var userEventIcon = Icons.userEvent; + var evRect = new Rect(barRect) { + x = Mathf.Max(((eventTime / t.Animation.Duration) * lineRectWidth) - (userEventIcon.width / 2), barRect.x), + y = barRect.y + userEventIcon.height, + width = userEventIcon.width, + height = userEventIcon.height + }; + GUI.DrawTexture(evRect, userEventIcon); + + Event ev = Event.current; + if (ev.type == EventType.Repaint) { + if (evRect.Contains(ev.mousePosition)) { + string eventName = currentAnimationEvents[i].Data.Name; + Rect tooltipRect = new Rect(evRect) { + width = EditorStyles.helpBox.CalcSize(new GUIContent(eventName)).x + }; + tooltipRect.y -= 4; + tooltipRect.y -= tooltipRect.height * currentAnimationEventTooltips.Count; // Avoid several overlapping tooltips. + tooltipRect.x += 4; + + // Handle tooltip overflowing to the right. + float rightEdgeOverflow = (tooltipRect.x + tooltipRect.width) - (barRect.x + barRect.width); + if (rightEdgeOverflow > 0) + tooltipRect.x -= rightEdgeOverflow; + + currentAnimationEventTooltips.Add(new SpineEventTooltip { rect = tooltipRect, text = eventName }); + } + } + } + + // Draw tooltips. + for (int i = 0; i < currentAnimationEventTooltips.Count; i++) { + GUI.Label(currentAnimationEventTooltips[i].rect, currentAnimationEventTooltips[i].text, EditorStyles.helpBox); + GUI.tooltip = currentAnimationEventTooltips[i].text; + } + } + } + + public void OnDestroy () { + DisposePreviewRenderUtility(); + DestroyPreviewGameObject(); + } + + public void Clear () { + DisposePreviewRenderUtility(); + DestroyPreviewGameObject(); + } + + void DisposePreviewRenderUtility () { + if (previewRenderUtility != null) { + previewRenderUtility.Cleanup(); + previewRenderUtility = null; + } + } + + void DestroyPreviewGameObject () { + if (previewGameObject != null) { + GameObject.DestroyImmediate(previewGameObject); + previewGameObject = null; + } + } + + internal struct SpineEventTooltip { + public Rect rect; + public string text; + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs.meta new file mode 100644 index 0000000..fba64b6 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDataAssetInspector.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 01cbef8f24d105f4bafa9668d669e040 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonDebugWindow.cs b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDebugWindow.cs new file mode 100644 index 0000000..cee6ecf --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDebugWindow.cs @@ -0,0 +1,558 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// With contributions from: Mitch Thompson + +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditor.AnimatedValues; + +namespace Spine.Unity.Editor { + using Editor = UnityEditor.Editor; + using Icons = SpineEditorUtilities.Icons; + + public class SkeletonDebugWindow : EditorWindow { + + const bool IsUtilityWindow = true; + internal static bool showBoneNames, showPaths = true, showShapes = true, showConstraints = true; + + [MenuItem("CONTEXT/SkeletonRenderer/Open Skeleton Debug Window", false, 5000)] + public static void Init () { + var window = EditorWindow.GetWindow(IsUtilityWindow); + window.minSize = new Vector2(330f, 360f); + window.maxSize = new Vector2(600f, 4000f); + window.titleContent = new GUIContent("Skeleton Debug", Icons.spine); + window.Show(); + window.OnSelectionChange(); + } + + + static AnimBool showSkeleton = new AnimBool(true); + static AnimBool showSlotsTree = new AnimBool(false); + static AnimBool showConstraintsTree = new AnimBool(false); + static AnimBool showDrawOrderTree = new AnimBool(false); + static AnimBool showEventDataTree = new AnimBool(false); + static AnimBool showDataTree = new AnimBool(false); + static AnimBool showInspectBoneTree = new AnimBool(false); + + Vector2 scrollPos; + + GUIContent SlotsRootLabel, SkeletonRootLabel; + GUIStyle BoldFoldoutStyle; + + public SkeletonRenderer skeletonRenderer; + Skeleton skeleton; + Skin activeSkin; + bool isPrefab; + + SerializedProperty bpo; + Bone bone; + + [SpineBone(dataField:"skeletonRenderer")] + public string boneName; + + readonly Dictionary> attachmentTable = new Dictionary>(); + + static bool staticLostValues = true; + + void OnSceneGUI (SceneView sceneView) { + if (skeleton == null || skeletonRenderer == null || !skeletonRenderer.valid || isPrefab) + return; + + var transform = skeletonRenderer.transform; + if (showPaths) SpineHandles.DrawPaths(transform, skeleton); + if (showConstraints) SpineHandles.DrawConstraints(transform, skeleton); + if (showBoneNames) SpineHandles.DrawBoneNames(transform, skeleton); + if (showShapes) SpineHandles.DrawBoundingBoxes(transform, skeleton); + + if (bone != null) { + SpineHandles.DrawBone(skeletonRenderer.transform, bone, 1.5f, Color.cyan); + Handles.Label(bone.GetWorldPosition(skeletonRenderer.transform) + (Vector3.down * 0.15f), bone.Data.Name, SpineHandles.BoneNameStyle); + } + } + + void OnSelectionChange () { + SceneView.onSceneGUIDelegate -= this.OnSceneGUI; + SceneView.onSceneGUIDelegate += this.OnSceneGUI; + + bool noSkeletonRenderer = false; + + var selectedObject = Selection.activeGameObject; + if (selectedObject == null) { + noSkeletonRenderer = true; + } else { + var selectedSkeletonRenderer = selectedObject.GetComponent(); + if (selectedSkeletonRenderer == null) { + noSkeletonRenderer = true; + } else if (skeletonRenderer != selectedSkeletonRenderer) { + + bone = null; + if (skeletonRenderer != null && skeletonRenderer.SkeletonDataAsset != selectedSkeletonRenderer.SkeletonDataAsset) + boneName = null; + + skeletonRenderer = selectedSkeletonRenderer; + skeletonRenderer.Initialize(false); + skeletonRenderer.LateUpdate(); + skeleton = skeletonRenderer.skeleton; + isPrefab |= PrefabUtility.GetPrefabType(selectedObject) == PrefabType.Prefab; + UpdateAttachments(); + } + } + + if (noSkeletonRenderer) Clear(); + Repaint(); + } + + void Clear () { + skeletonRenderer = null; + skeleton = null; + attachmentTable.Clear(); + isPrefab = false; + boneName = string.Empty; + bone = null; + SceneView.onSceneGUIDelegate -= this.OnSceneGUI; + } + + void OnDestroy () { + Clear(); + } + + static void FalseDropDown (string label, string stringValue, Texture2D icon = null, bool disabledGroup = false) { + if (disabledGroup) EditorGUI.BeginDisabledGroup(true); + var pos = EditorGUILayout.GetControlRect(true); + pos = EditorGUI.PrefixLabel(pos, SpineInspectorUtility.TempContent(label)); + GUI.Button(pos, SpineInspectorUtility.TempContent(stringValue, icon), EditorStyles.popup); + if (disabledGroup) EditorGUI.EndDisabledGroup(); + } + + // Window GUI + void OnGUI () { + bool requireRepaint = false; + + if (staticLostValues) { + Clear(); + OnSelectionChange(); + staticLostValues = false; + requireRepaint = true; + } + + if (SlotsRootLabel == null) { + SlotsRootLabel = new GUIContent("Slots", Icons.slotRoot); + SkeletonRootLabel = new GUIContent("Skeleton", Icons.skeleton); + BoldFoldoutStyle = new GUIStyle(EditorStyles.foldout); + BoldFoldoutStyle.fontStyle = FontStyle.Bold; + BoldFoldoutStyle.stretchWidth = true; + BoldFoldoutStyle.fixedWidth = 0; + } + + + EditorGUILayout.Space(); + EditorGUI.BeginDisabledGroup(true); + EditorGUILayout.ObjectField(SpineInspectorUtility.TempContent("Debug Selection", Icons.spine), skeletonRenderer, typeof(SkeletonRenderer), true); + EditorGUI.EndDisabledGroup(); + + if (skeleton == null || skeletonRenderer == null) { + EditorGUILayout.HelpBox("No SkeletonRenderer Spine GameObject selected.", MessageType.Info); + return; + } + + if (isPrefab) { + EditorGUILayout.HelpBox("SkeletonDebug only debugs Spine GameObjects in the scene.", MessageType.Warning); + return; + } + + if (!skeletonRenderer.valid) { + EditorGUILayout.HelpBox("Spine Component is invalid. Check SkeletonData Asset.", MessageType.Error); + return; + } + + if (activeSkin != skeleton.Skin) + UpdateAttachments(); + + scrollPos = EditorGUILayout.BeginScrollView(scrollPos); + + using (new SpineInspectorUtility.BoxScope(false)) { + if (SpineInspectorUtility.CenteredButton(SpineInspectorUtility.TempContent("Skeleton.SetToSetupPose()"))) { + skeleton.SetToSetupPose(); + requireRepaint = true; + } + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.LabelField("Scene View", EditorStyles.boldLabel); + using (new SpineInspectorUtility.LabelWidthScope()) { + showBoneNames = EditorGUILayout.Toggle("Show Bone Names", showBoneNames); + showPaths = EditorGUILayout.Toggle("Show Paths", showPaths); + showShapes = EditorGUILayout.Toggle("Show Shapes", showShapes); + showConstraints = EditorGUILayout.Toggle("Show Constraints", showConstraints); + } + requireRepaint |= EditorGUI.EndChangeCheck(); + + + // Skeleton + showSkeleton.target = EditorGUILayout.Foldout(showSkeleton.target, SkeletonRootLabel, BoldFoldoutStyle); + if (showSkeleton.faded > 0) { + using (new SpineInspectorUtility.IndentScope()) { + using (new EditorGUILayout.FadeGroupScope(showSkeleton.faded)) { + EditorGUI.BeginChangeCheck(); + + EditorGUI.BeginDisabledGroup(true); + FalseDropDown(".Skin", skeleton.Skin != null ? skeletonRenderer.Skeleton.Skin.Name : "", Icons.skin); + EditorGUI.EndDisabledGroup(); + + // Flip + EditorGUILayout.BeginHorizontal(GUILayout.MaxWidth(160f)); + EditorGUILayout.LabelField("Flip", GUILayout.MaxWidth(EditorGUIUtility.labelWidth - 20f)); + skeleton.FlipX = EditorGUILayout.ToggleLeft(".FlipX", skeleton.FlipX, GUILayout.MaxWidth(70f)); + skeleton.FlipY = EditorGUILayout.ToggleLeft(".FlipY", skeleton.FlipY, GUILayout.MaxWidth(70f)); + GUILayout.EndHorizontal(); + + // Color + skeleton.SetColor(EditorGUILayout.ColorField(".R .G .B .A", skeleton.GetColor())); + + requireRepaint |= EditorGUI.EndChangeCheck(); + } + } + } + + // Bone + showInspectBoneTree.target = EditorGUILayout.Foldout(showInspectBoneTree.target, SpineInspectorUtility.TempContent("Bone", Icons.bone), BoldFoldoutStyle); + if (showInspectBoneTree.faded > 0) { + using (new SpineInspectorUtility.IndentScope()) { + using (new EditorGUILayout.FadeGroupScope(showInspectBoneTree.faded)) { + showBoneNames = EditorGUILayout.Toggle("Show Bone Names", showBoneNames); + if (bpo == null) bpo = new SerializedObject(this).FindProperty("boneName"); + EditorGUILayout.PropertyField(bpo, SpineInspectorUtility.TempContent("Bone")); + if (!string.IsNullOrEmpty(bpo.stringValue)) { + if (bone == null || bone.Data.Name != bpo.stringValue) { + bone = skeleton.FindBone(bpo.stringValue); + } + + if (bone != null) { + using (new EditorGUI.DisabledGroupScope(true)) { + var wm = EditorGUIUtility.wideMode; + EditorGUIUtility.wideMode = true; + EditorGUILayout.Slider("Local Rotation", ViewRound(bone.Rotation), -180f, 180f); + EditorGUILayout.Vector2Field("Local Position", RoundVector2(bone.X, bone.Y)); + EditorGUILayout.Vector2Field("Local Scale", RoundVector2(bone.ScaleX, bone.ScaleY)); + EditorGUILayout.Vector2Field("Local Shear", RoundVector2(bone.ShearX, bone.ShearY)); + + EditorGUILayout.Space(); + + var boneParent = bone.Parent; + if (boneParent != null) FalseDropDown("Parent", boneParent.Data.Name, Icons.bone); + + const string RoundFormat = "0.##"; + var lw = EditorGUIUtility.labelWidth; + var fw = EditorGUIUtility.fieldWidth; + EditorGUIUtility.labelWidth *= 0.25f; + EditorGUIUtility.fieldWidth *= 0.5f; + EditorGUILayout.LabelField("LocalToWorld"); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.Space(); + EditorGUILayout.TextField(".A", bone.A.ToString(RoundFormat)); + EditorGUILayout.TextField(".B", bone.B.ToString(RoundFormat)); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.Space(); + EditorGUILayout.TextField(".C", bone.C.ToString(RoundFormat)); + EditorGUILayout.TextField(".D", bone.D.ToString(RoundFormat)); + EditorGUILayout.EndHorizontal(); + + EditorGUIUtility.labelWidth = lw * 0.5f; + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.Space(); + EditorGUILayout.Space(); + EditorGUILayout.TextField(".WorldX", bone.WorldX.ToString(RoundFormat)); + EditorGUILayout.TextField(".WorldY", bone.WorldY.ToString(RoundFormat)); + EditorGUILayout.EndHorizontal(); + + EditorGUIUtility.labelWidth = lw; + EditorGUIUtility.fieldWidth = fw; + EditorGUIUtility.wideMode = wm; + + } + } + requireRepaint = true; + } else { + bone = null; + } + } + } + } + + // Slots + int preSlotsIndent = EditorGUI.indentLevel; + showSlotsTree.target = EditorGUILayout.Foldout(showSlotsTree.target, SlotsRootLabel, BoldFoldoutStyle); + if (showSlotsTree.faded > 0) { + using (new EditorGUILayout.FadeGroupScope(showSlotsTree.faded)) { + if (SpineInspectorUtility.CenteredButton(SpineInspectorUtility.TempContent("Skeleton.SetSlotsToSetupPose()"))) { + skeleton.SetSlotsToSetupPose(); + requireRepaint = true; + } + + int baseIndent = EditorGUI.indentLevel; + foreach (KeyValuePair> pair in attachmentTable) { + Slot slot = pair.Key; + + using (new EditorGUILayout.HorizontalScope()) { + EditorGUI.indentLevel = baseIndent + 1; + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(slot.Data.Name, Icons.slot), GUILayout.ExpandWidth(false)); + EditorGUI.BeginChangeCheck(); + Color c = EditorGUILayout.ColorField(new Color(slot.R, slot.G, slot.B, slot.A), GUILayout.Width(60)); + if (EditorGUI.EndChangeCheck()) { + slot.SetColor(c); + requireRepaint = true; + } + } + + foreach (var attachment in pair.Value) { + GUI.contentColor = slot.Attachment == attachment ? Color.white : Color.grey; + EditorGUI.indentLevel = baseIndent + 2; + var icon = Icons.GetAttachmentIcon(attachment); + bool isAttached = (attachment == slot.Attachment); + bool swap = EditorGUILayout.ToggleLeft(SpineInspectorUtility.TempContent(attachment.Name, icon), attachment == slot.Attachment); + if (isAttached != swap) { + slot.Attachment = isAttached ? null : attachment; + requireRepaint = true; + } + GUI.contentColor = Color.white; + } + } + } + } + EditorGUI.indentLevel = preSlotsIndent; + + // Constraints + const string NoneText = ""; + showConstraintsTree.target = EditorGUILayout.Foldout(showConstraintsTree.target, SpineInspectorUtility.TempContent("Constraints", Icons.constraintRoot), BoldFoldoutStyle); + if (showConstraintsTree.faded > 0) { + using (new SpineInspectorUtility.IndentScope()) { + using (new EditorGUILayout.FadeGroupScope(showConstraintsTree.faded)) { + const float MixMin = 0f; + const float MixMax = 1f; + EditorGUI.BeginChangeCheck(); + showConstraints = EditorGUILayout.Toggle("Show Constraints", showConstraints); + requireRepaint |= EditorGUI.EndChangeCheck(); + + EditorGUILayout.Space(); + + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(string.Format("IK Constraints ({0})", skeleton.IkConstraints.Count), Icons.constraintIK), EditorStyles.boldLabel); + using (new SpineInspectorUtility.IndentScope()) { + if (skeleton.IkConstraints.Count > 0) { + foreach (var c in skeleton.IkConstraints) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(c.Data.Name, Icons.constraintIK)); + FalseDropDown("Goal", c.Data.Target.Name, Icons.bone, true); + + EditorGUI.BeginChangeCheck(); + c.Mix = EditorGUILayout.Slider("Mix", c.Mix, MixMin, MixMax); + c.BendDirection = EditorGUILayout.Toggle(SpineInspectorUtility.TempContent("Bend Clockwise", tooltip: "IkConstraint.BendDirection == 1 if clockwise; -1 if counterclockwise."), c.BendDirection > 0) ? 1 : -1; + if (EditorGUI.EndChangeCheck()) requireRepaint = true; + + EditorGUILayout.Space(); + } + + } else { + EditorGUILayout.LabelField(NoneText); + } + } + + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(string.Format("Transform Constraints ({0})", skeleton.TransformConstraints.Count), Icons.constraintTransform), EditorStyles.boldLabel); + using (new SpineInspectorUtility.IndentScope()) { + if (skeleton.TransformConstraints.Count > 0) { + foreach (var c in skeleton.TransformConstraints) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(c.Data.Name, Icons.constraintTransform)); + EditorGUI.BeginDisabledGroup(true); + FalseDropDown("Goal", c.Data.Target.Name, Icons.bone); + EditorGUI.EndDisabledGroup(); + + EditorGUI.BeginChangeCheck(); + c.TranslateMix = EditorGUILayout.Slider("TranslateMix", c.TranslateMix, MixMin, MixMax); + c.RotateMix = EditorGUILayout.Slider("RotateMix", c.RotateMix, MixMin, MixMax); + c.ScaleMix = EditorGUILayout.Slider("ScaleMix", c.ScaleMix, MixMin, MixMax); + c.ShearMix = EditorGUILayout.Slider("ShearMix", c.ShearMix, MixMin, MixMax); + if (EditorGUI.EndChangeCheck()) requireRepaint = true; + + EditorGUILayout.Space(); + } + } else { + EditorGUILayout.LabelField(NoneText); + } + } + + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(string.Format("Path Constraints ({0})", skeleton.PathConstraints.Count), Icons.constraintPath), EditorStyles.boldLabel); + + EditorGUI.BeginChangeCheck(); + showPaths = EditorGUILayout.Toggle("Show Paths", showPaths); + requireRepaint |= EditorGUI.EndChangeCheck(); + + using (new SpineInspectorUtility.IndentScope()) { + if (skeleton.PathConstraints.Count > 0) { + foreach (var c in skeleton.PathConstraints) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(c.Data.Name, Icons.constraintPath)); + EditorGUI.BeginDisabledGroup(true); + FalseDropDown("Path Slot", c.Data.Target.Name, Icons.slot); + var activeAttachment = c.Target.Attachment; + FalseDropDown("Active Path", activeAttachment != null ? activeAttachment.Name : "", activeAttachment is PathAttachment ? Icons.path : null); + EditorGUILayout.LabelField("PositionMode." + c.Data.PositionMode); + EditorGUILayout.LabelField("SpacingMode." + c.Data.SpacingMode); + EditorGUILayout.LabelField("RotateMode." + c.Data.RotateMode); + EditorGUI.EndDisabledGroup(); + + EditorGUI.BeginChangeCheck(); + c.RotateMix = EditorGUILayout.Slider("RotateMix", c.RotateMix, MixMin, MixMax); + c.TranslateMix = EditorGUILayout.Slider("TranslateMix", c.TranslateMix, MixMin, MixMax); + c.Position = EditorGUILayout.FloatField("Position", c.Position); + c.Spacing = EditorGUILayout.FloatField("Spacing", c.Spacing); + if (EditorGUI.EndChangeCheck()) requireRepaint = true; + + EditorGUILayout.Space(); + } + + } else { + EditorGUILayout.LabelField(NoneText); + } + } + } + } + } + + showDrawOrderTree.target = EditorGUILayout.Foldout(showDrawOrderTree.target, SpineInspectorUtility.TempContent("Draw Order and Separators", Icons.slotRoot), BoldFoldoutStyle); + if (showDrawOrderTree.faded > 0) { + using (new SpineInspectorUtility.IndentScope()) { + using (new EditorGUILayout.FadeGroupScope(showDrawOrderTree.faded)) { + + const string SeparatorString = "------------- v SEPARATOR v -------------"; + + if (Application.isPlaying) { + foreach (var slot in skeleton.DrawOrder) { + if (skeletonRenderer.separatorSlots.Contains(slot)) EditorGUILayout.LabelField(SeparatorString); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(slot.Data.Name, Icons.slot), GUILayout.ExpandWidth(false)); + } + } else { + foreach (var slot in skeleton.DrawOrder) { + var slotNames = skeletonRenderer.separatorSlotNames; + for (int i = 0, n = slotNames.Length; i < n; i++) { + if (string.Equals(slotNames[i], slot.Data.Name, System.StringComparison.Ordinal)) { + EditorGUILayout.LabelField(SeparatorString); + break; + } + } + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(slot.Data.Name, Icons.slot), GUILayout.ExpandWidth(false)); + } + } + + } + } + } + + showEventDataTree.target = EditorGUILayout.Foldout(showEventDataTree.target, SpineInspectorUtility.TempContent("Events", Icons.userEvent), BoldFoldoutStyle); + if (showEventDataTree.faded > 0) { + using (new SpineInspectorUtility.IndentScope()) { + using (new EditorGUILayout.FadeGroupScope(showEventDataTree.faded)) { + if (skeleton.Data.Events.Count > 0) { + foreach (var e in skeleton.Data.Events) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(e.Name, Icons.userEvent)); + } + } else { + EditorGUILayout.LabelField(NoneText); + } + } + } + } + + showDataTree.target = EditorGUILayout.Foldout(showDataTree.target, SpineInspectorUtility.TempContent("Data Counts", Icons.spine), BoldFoldoutStyle); + if (showDataTree.faded > 0) { + using (new SpineInspectorUtility.IndentScope()) { + using (new EditorGUILayout.FadeGroupScope(showDataTree.faded)) { + using (new SpineInspectorUtility.LabelWidthScope()) { + var skeletonData = skeleton.Data; + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Bones", Icons.bone, "Skeleton.Data.Bones"), new GUIContent(skeletonData.Bones.Count.ToString())); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Slots", Icons.slotRoot, "Skeleton.Data.Slots"), new GUIContent(skeletonData.Slots.Count.ToString())); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Skins", Icons.skinsRoot, "Skeleton.Data.Skins"), new GUIContent(skeletonData.Skins.Count.ToString())); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Events", Icons.userEvent, "Skeleton.Data.Events"), new GUIContent(skeletonData.Events.Count.ToString())); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("IK Constraints", Icons.constraintIK, "Skeleton.Data.IkConstraints"), new GUIContent(skeletonData.IkConstraints.Count.ToString())); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Transform Constraints", Icons.constraintTransform, "Skeleton.Data.TransformConstraints"), new GUIContent(skeletonData.TransformConstraints.Count.ToString())); + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Path Constraints", Icons.constraintPath, "Skeleton.Data.PathConstraints"), new GUIContent(skeletonData.PathConstraints.Count.ToString())); + } + } + } + } + + if (IsAnimating(showSlotsTree, showSkeleton, showConstraintsTree, showDrawOrderTree, showEventDataTree, showInspectBoneTree, showDataTree)) + Repaint(); + } + + if (requireRepaint) { + skeletonRenderer.LateUpdate(); + Repaint(); + SceneView.RepaintAll(); + } + + EditorGUILayout.EndScrollView(); + } + + static float ViewRound (float x) { + const float Factor = 100f; + const float Divisor = 1f/Factor; + return Mathf.Round(x * Factor) * Divisor; + } + + static Vector2 RoundVector2 (float x, float y) { + const float Factor = 100f; + const float Divisor = 1f/Factor; + return new Vector2(Mathf.Round(x * Factor) * Divisor, Mathf.Round(y * Factor) * Divisor); + } + + static bool IsAnimating (params AnimBool[] animBools) { + foreach (var a in animBools) + if (a.isAnimating) return true; + return false; + } + + void UpdateAttachments () { + //skeleton = skeletonRenderer.skeleton; + Skin defaultSkin = skeleton.Data.DefaultSkin; + Skin skin = skeleton.Skin ?? defaultSkin; + bool notDefaultSkin = skin != defaultSkin; + + attachmentTable.Clear(); + for (int i = skeleton.Slots.Count - 1; i >= 0; i--) { + var attachments = new List(); + attachmentTable.Add(skeleton.Slots.Items[i], attachments); + skin.FindAttachmentsForSlot(i, attachments); // Add skin attachments. + if (notDefaultSkin) defaultSkin.FindAttachmentsForSlot(i, attachments); // Add default skin attachments. + } + + activeSkin = skeleton.Skin; + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonDebugWindow.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDebugWindow.cs.meta new file mode 100644 index 0000000..d3697a0 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonDebugWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7093e73ff3cf6c543ac5865980070b49 +timeCreated: 1494837950 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonRendererInspector.cs b/Assets/Spine/Assets/spine-unity/Editor/SkeletonRendererInspector.cs new file mode 100644 index 0000000..7faef12 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonRendererInspector.cs @@ -0,0 +1,398 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define NO_PREFAB_MESH + +using UnityEditor; +using System.Collections.Generic; +using UnityEngine; + +namespace Spine.Unity.Editor { + using Event = UnityEngine.Event; + using Icons = SpineEditorUtilities.Icons; + + [CustomEditor(typeof(SkeletonRenderer))] + [CanEditMultipleObjects] + public class SkeletonRendererInspector : UnityEditor.Editor { + public static bool advancedFoldout; + + protected SerializedProperty skeletonDataAsset, initialSkinName; + protected SerializedProperty initialFlipX, initialFlipY; + protected SerializedProperty singleSubmesh, separatorSlotNames, clearStateOnDisable, immutableTriangles; + protected SerializedProperty normals, tangents, meshes, zSpacing, pmaVertexColors, tintBlack; // MeshGenerator settings + protected SpineInspectorUtility.SerializedSortingProperties sortingProperties; + protected bool isInspectingPrefab; + + protected GUIContent SkeletonDataAssetLabel, SkeletonUtilityButtonContent; + protected GUIContent PMAVertexColorsLabel, ClearStateOnDisableLabel, ZSpacingLabel, MeshesLabel, ImmubleTrianglesLabel, TintBlackLabel, SingleSubmeshLabel; + protected GUIContent NormalsLabel, TangentsLabel; + const string ReloadButtonLabel = "Reload"; + + protected bool TargetIsValid { + get { + if (serializedObject.isEditingMultipleObjects) { + foreach (var o in targets) { + var component = (SkeletonRenderer)o; + if (!component.valid) + return false; + } + return true; + } else { + var component = (SkeletonRenderer)target; + return component.valid; + } + } + } + + protected virtual void OnEnable () { + isInspectingPrefab = (PrefabUtility.GetPrefabType(target) == PrefabType.Prefab); + + SpineEditorUtilities.ConfirmInitialization(); + + // Labels + SkeletonDataAssetLabel = new GUIContent("SkeletonData Asset", Icons.spine); + SkeletonUtilityButtonContent = new GUIContent("Add Skeleton Utility", Icons.skeletonUtility); + MeshesLabel = new GUIContent("Render MeshAttachments", "Disable to optimize rendering for skeletons that don't use Mesh Attachments"); + ImmubleTrianglesLabel = new GUIContent("Immutable Triangles", "Enable to optimize rendering for skeletons that never change attachment visbility"); + PMAVertexColorsLabel = new GUIContent("PMA Vertex Colors", "Use this if you are using the default Spine/Skeleton shader or any premultiply-alpha shader."); + ClearStateOnDisableLabel = new GUIContent("Clear State On Disable", "Use this if you are pooling or enabling/disabling your Spine GameObject."); + ZSpacingLabel = new GUIContent("Z Spacing", "A value other than 0 adds a space between each rendered attachment to prevent Z Fighting when using shaders that read or write to the depth buffer. Large values may cause unwanted parallax and spaces depending on camera setup."); + NormalsLabel = new GUIContent("Add Normals", "Use this if your shader requires vertex normals. A more efficient solution for 2D setups is to modify the shader to assume a single normal value for the whole mesh."); + TangentsLabel = new GUIContent("Solve Tangents", "Calculates the tangents per frame. Use this if you are using lit shaders (usually with normal maps) that require vertex tangents."); + TintBlackLabel = new GUIContent("Tint Black (!)", "Adds black tint vertex data to the mesh as UV2 and UV3. Black tinting requires that the shader interpret UV2 and UV3 as black tint colors for this effect to work. You may also use the default [Spine/Skeleton Tint Black] shader.\n\nIf you only need to tint the whole skeleton and not individual parts, the [Spine/Skeleton Tint] shader is recommended for better efficiency and changing/animating the _Black material property via MaterialPropertyBlock."); + SingleSubmeshLabel = new GUIContent("Use Single Submesh", "Simplifies submesh determination by assuming you are only using one Material and need only one submesh. This is will disable render separation and custom slot materials."); + + var so = this.serializedObject; + skeletonDataAsset = so.FindProperty("skeletonDataAsset"); + initialSkinName = so.FindProperty("initialSkinName"); + initialFlipX = so.FindProperty("initialFlipX"); + initialFlipY = so.FindProperty("initialFlipY"); + normals = so.FindProperty("addNormals"); + tangents = so.FindProperty("calculateTangents"); + meshes = so.FindProperty("renderMeshes"); + immutableTriangles = so.FindProperty("immutableTriangles"); + pmaVertexColors = so.FindProperty("pmaVertexColors"); + clearStateOnDisable = so.FindProperty("clearStateOnDisable"); + tintBlack = so.FindProperty("tintBlack"); + singleSubmesh = so.FindProperty("singleSubmesh"); + + separatorSlotNames = so.FindProperty("separatorSlotNames"); + separatorSlotNames.isExpanded = true; + + zSpacing = so.FindProperty("zSpacing"); + + SerializedObject rso = SpineInspectorUtility.GetRenderersSerializedObject(serializedObject); + sortingProperties = new SpineInspectorUtility.SerializedSortingProperties(rso); + } + + public static void ReapplySeparatorSlotNames (SkeletonRenderer skeletonRenderer) { + if (!skeletonRenderer.valid) return; + + var separatorSlots = skeletonRenderer.separatorSlots; + var separatorSlotNames = skeletonRenderer.separatorSlotNames; + var skeleton = skeletonRenderer.skeleton; + + separatorSlots.Clear(); + for (int i = 0, n = separatorSlotNames.Length; i < n; i++) { + var slot = skeleton.FindSlot(separatorSlotNames[i]); + if (slot != null) { + separatorSlots.Add(slot); + } else { + Debug.LogWarning(separatorSlotNames[i] + " is not a slot in " + skeletonRenderer.skeletonDataAsset.skeletonJSON.name); + } + } + } + + GUIContent[] skins; + ExposedList loadedSkinList; + + protected virtual void DrawInspectorGUI (bool multi) { + bool valid = TargetIsValid; + var reloadWidth = GUILayout.Width(GUI.skin.label.CalcSize(new GUIContent(ReloadButtonLabel)).x + 20); + var reloadButtonStyle = EditorStyles.miniButtonRight; + + if (multi) { + using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) { + SpineInspectorUtility.PropertyFieldFitLabel(skeletonDataAsset, SkeletonDataAssetLabel); + if (GUILayout.Button(ReloadButtonLabel, reloadButtonStyle, reloadWidth)) { + foreach (var c in targets) { + var component = c as SkeletonRenderer; + if (component.skeletonDataAsset != null) { + foreach (AtlasAsset aa in component.skeletonDataAsset.atlasAssets) { + if (aa != null) + aa.Clear(); + } + component.skeletonDataAsset.Clear(); + } + component.Initialize(true); + } + } + } + + foreach (var c in targets) { + var component = c as SkeletonRenderer; + if (!component.valid) { + if (Event.current.type == EventType.Layout) { + component.Initialize(true); + component.LateUpdate(); + } + if (!component.valid) + continue; + } + + #if NO_PREFAB_MESH + if (isInspectingPrefab) { + MeshFilter meshFilter = component.GetComponent(); + if (meshFilter != null && meshFilter.sharedMesh != null) + meshFilter.sharedMesh = null; + } + #endif + } + + if (valid) + EditorGUILayout.PropertyField(initialSkinName); + + } else { + var component = (SkeletonRenderer)target; + + if (!component.valid && Event.current.type == EventType.Layout) { + component.Initialize(true); + component.LateUpdate(); + } + + using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) { + SpineInspectorUtility.PropertyFieldFitLabel(skeletonDataAsset, SkeletonDataAssetLabel); + if (component.valid) { + if (GUILayout.Button(ReloadButtonLabel, reloadButtonStyle, reloadWidth)) { + if (component.skeletonDataAsset != null) { + foreach (AtlasAsset aa in component.skeletonDataAsset.atlasAssets) { + if (aa != null) + aa.Clear(); + } + component.skeletonDataAsset.Clear(); + } + component.Initialize(true); + } + } + } + + if (component.skeletonDataAsset == null) { + EditorGUILayout.HelpBox("Skeleton Data Asset required", MessageType.Warning); + return; + } + + #if NO_PREFAB_MESH + if (isInspectingPrefab) { + MeshFilter meshFilter = component.GetComponent(); + if (meshFilter != null && meshFilter.sharedMesh != null) + meshFilter.sharedMesh = null; + } + #endif + + // Initial skin name. + if (component.valid) { + var skeletonDataSkins = component.skeleton.Data.Skins; + int skinCount = skeletonDataSkins.Count; + if (loadedSkinList != skeletonDataSkins) { + skins = new GUIContent[skinCount]; + loadedSkinList = skeletonDataSkins; + for (int i = 0; i < skins.Length; i++) { + string skinNameString = skeletonDataSkins.Items[i].Name; + skins[i] = new GUIContent(skinNameString, Icons.skin); + } + } + + int skinIndex = 0; + for (int i = 0; i < skins.Length; i++) { + string skinNameString = skeletonDataSkins.Items[i].Name; + if (skinNameString == initialSkinName.stringValue) + skinIndex = i; + } + + skinIndex = EditorGUILayout.Popup(SpineInspectorUtility.TempContent("Initial Skin"), skinIndex, skins); + if (skins.Length > 0) // Support attachmentless/skinless SkeletonData. + initialSkinName.stringValue = skins[skinIndex].text; + } + } + + EditorGUILayout.Space(); + + // Sorting Layers + SpineInspectorUtility.SortingPropertyFields(sortingProperties, applyModifiedProperties: true); + + if (!TargetIsValid) return; + + // More Render Options... + using (new SpineInspectorUtility.BoxScope()) { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.BeginHorizontal(GUILayout.Height(EditorGUIUtility.singleLineHeight + 5)); + advancedFoldout = EditorGUILayout.Foldout(advancedFoldout, "Advanced"); + if (advancedFoldout) { + EditorGUILayout.Space(); + if (GUILayout.Button("Debug", EditorStyles.miniButton, GUILayout.Width(65f))) + SkeletonDebugWindow.Init(); + } else { + EditorGUILayout.Space(); + } + EditorGUILayout.EndHorizontal(); + + if (advancedFoldout) { + + using (new SpineInspectorUtility.IndentScope()) { + using (new EditorGUILayout.HorizontalScope()) { + SpineInspectorUtility.ToggleLeftLayout(initialFlipX); + SpineInspectorUtility.ToggleLeftLayout(initialFlipY); + EditorGUILayout.Space(); + } + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Renderer Settings", EditorStyles.boldLabel); + using (new SpineInspectorUtility.LabelWidthScope()) { + // Optimization options + if (singleSubmesh != null) EditorGUILayout.PropertyField(singleSubmesh, SingleSubmeshLabel); + //if (meshes != null) EditorGUILayout.PropertyField(meshes, MeshesLabel); + if (immutableTriangles != null) EditorGUILayout.PropertyField(immutableTriangles, ImmubleTrianglesLabel); + EditorGUILayout.PropertyField(clearStateOnDisable, ClearStateOnDisableLabel); + EditorGUILayout.Space(); + } + + SeparatorsField(separatorSlotNames); + EditorGUILayout.Space(); + + // Render options + const float MinZSpacing = -0.1f; + const float MaxZSpacing = 0f; + EditorGUILayout.Slider(zSpacing, MinZSpacing, MaxZSpacing, ZSpacingLabel); + EditorGUILayout.Space(); + + using (new SpineInspectorUtility.LabelWidthScope()) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Vertex Data", SpineInspectorUtility.UnityIcon()), EditorStyles.boldLabel); + if (pmaVertexColors != null) EditorGUILayout.PropertyField(pmaVertexColors, PMAVertexColorsLabel); + EditorGUILayout.PropertyField(tintBlack, TintBlackLabel); + + // Optional fields. May be disabled in SkeletonRenderer. + if (normals != null) EditorGUILayout.PropertyField(normals, NormalsLabel); + if (tangents != null) EditorGUILayout.PropertyField(tangents, TangentsLabel); + } + + EditorGUILayout.Space(); + + if (TargetIsValid && !isInspectingPrefab) { + if (multi) { + // Support multi-edit SkeletonUtility button. + // EditorGUILayout.Space(); + // bool addSkeletonUtility = GUILayout.Button(buttonContent, GUILayout.Height(30)); + // foreach (var t in targets) { + // var component = t as Component; + // if (addSkeletonUtility && component.GetComponent() == null) + // component.gameObject.AddComponent(); + // } + } else { + var component = (Component)target; + if (component.GetComponent() == null) { + if (SpineInspectorUtility.CenteredButton(SkeletonUtilityButtonContent, 21, true, 200f)) + component.gameObject.AddComponent(); + } + } + } + + EditorGUILayout.Space(); + } + } + + if (EditorGUI.EndChangeCheck()) + SceneView.RepaintAll(); + } + } + + public static void SeparatorsField (SerializedProperty separatorSlotNames) { + bool multi = separatorSlotNames.serializedObject.isEditingMultipleObjects; + bool hasTerminalSlot = false; + if (!multi) { + var sr = separatorSlotNames.serializedObject.targetObject as ISkeletonComponent; + var skeleton = sr.Skeleton; + int lastSlot = skeleton.Slots.Count - 1; + if (skeleton != null) { + for (int i = 0, n = separatorSlotNames.arraySize; i < n; i++) { + int index = skeleton.FindSlotIndex(separatorSlotNames.GetArrayElementAtIndex(i).stringValue); + if (index == 0 || index == lastSlot) { + hasTerminalSlot = true; + break; + } + } + } + } + + string terminalSlotWarning = hasTerminalSlot ? " (!)" : ""; + + using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) { + const string SeparatorsDescription = "Stored names of slots where the Skeleton's render will be split into different batches. This is used by separate components that split the render into different MeshRenderers or GameObjects."; + if (separatorSlotNames.isExpanded) { + EditorGUILayout.PropertyField(separatorSlotNames, SpineInspectorUtility.TempContent(separatorSlotNames.displayName + terminalSlotWarning, Icons.slotRoot, SeparatorsDescription), true); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("+", GUILayout.MaxWidth(28f), GUILayout.MaxHeight(15f))) { + separatorSlotNames.arraySize++; + } + GUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + } else + EditorGUILayout.PropertyField(separatorSlotNames, new GUIContent(separatorSlotNames.displayName + string.Format("{0} [{1}]", terminalSlotWarning, separatorSlotNames.arraySize), SeparatorsDescription), true); + } + } + + public void OnSceneGUI () { + var skeletonRenderer = (SkeletonRenderer)target; + var skeleton = skeletonRenderer.skeleton; + var transform = skeletonRenderer.transform; + if (skeleton == null) return; + + SpineHandles.DrawBones(transform, skeleton); + } + + override public void OnInspectorGUI () { + //serializedObject.Update(); + bool multi = serializedObject.isEditingMultipleObjects; + DrawInspectorGUI(multi); + if (serializedObject.ApplyModifiedProperties() || SpineInspectorUtility.UndoRedoPerformed(Event.current)) { + if (!Application.isPlaying) { + if (multi) + foreach (var o in targets) + ((SkeletonRenderer)o).Initialize(true); + else + ((SkeletonRenderer)target).Initialize(true); + } + } + } + + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SkeletonRendererInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SkeletonRendererInspector.cs.meta new file mode 100644 index 0000000..d7791c6 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SkeletonRendererInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d0fc5db9788bce4418ad3252d43faa8a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SpineAttributeDrawers.cs b/Assets/Spine/Assets/spine-unity/Editor/SpineAttributeDrawers.cs new file mode 100644 index 0000000..20b6ff6 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SpineAttributeDrawers.cs @@ -0,0 +1,557 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; +using System.Reflection; +using Spine; + +namespace Spine.Unity.Editor { + public struct SpineDrawerValuePair { + public string str; + public SerializedProperty property; + + public SpineDrawerValuePair (string val, SerializedProperty property) { + this.str = val; + this.property = property; + } + } + + public abstract class SpineTreeItemDrawerBase : PropertyDrawer where T:SpineAttributeBase { + protected SkeletonDataAsset skeletonDataAsset; + internal const string NoneString = ""; + + // Analysis disable once StaticFieldInGenericType + static GUIContent noneLabel; + static GUIContent NoneLabel (Texture2D image = null) { + if (noneLabel == null) + noneLabel = new GUIContent(NoneString); + noneLabel.image = image; + return noneLabel; + } + + protected T TargetAttribute { get { return (T)attribute; } } + protected SerializedProperty SerializedProperty { get; private set; } + + protected abstract Texture2D Icon { get; } + + public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) { + SerializedProperty = property; + + if (property.propertyType != SerializedPropertyType.String) { + EditorGUI.LabelField(position, "ERROR:", "May only apply to type string"); + return; + } + + SerializedProperty dataField = property.FindBaseOrSiblingProperty(TargetAttribute.dataField); + + if (dataField != null) { + var objectReferenceValue = dataField.objectReferenceValue; + if (objectReferenceValue is SkeletonDataAsset) { + skeletonDataAsset = (SkeletonDataAsset)objectReferenceValue; + } else if (objectReferenceValue is IHasSkeletonDataAsset) { + var hasSkeletonDataAsset = (IHasSkeletonDataAsset)objectReferenceValue; + if (hasSkeletonDataAsset != null) + skeletonDataAsset = hasSkeletonDataAsset.SkeletonDataAsset; + } else if (objectReferenceValue != null) { + EditorGUI.LabelField(position, "ERROR:", "Invalid reference type"); + return; + } + + } else { + var targetObject = property.serializedObject.targetObject; + + IHasSkeletonDataAsset hasSkeletonDataAsset = targetObject as IHasSkeletonDataAsset; + if (hasSkeletonDataAsset == null) { + var component = targetObject as Component; + if (component != null) + hasSkeletonDataAsset = component.GetComponentInChildren(typeof(IHasSkeletonDataAsset)) as IHasSkeletonDataAsset; + } + + if (hasSkeletonDataAsset != null) + skeletonDataAsset = hasSkeletonDataAsset.SkeletonDataAsset; + } + + if (skeletonDataAsset == null) { + if (TargetAttribute.fallbackToTextField) { + EditorGUI.PropertyField(position, property); //EditorGUI.TextField(position, label, property.stringValue); + } else { + EditorGUI.LabelField(position, "ERROR:", "Must have reference to a SkeletonDataAsset"); + } + + skeletonDataAsset = property.serializedObject.targetObject as SkeletonDataAsset; + if (skeletonDataAsset == null) return; + } + + position = EditorGUI.PrefixLabel(position, label); + + var image = Icon; + var propertyStringValue = (property.hasMultipleDifferentValues) ? SpineInspectorUtility.EmDash : property.stringValue; + if (GUI.Button(position, string.IsNullOrEmpty(propertyStringValue) ? NoneLabel(image) : SpineInspectorUtility.TempContent(propertyStringValue, image), EditorStyles.popup)) + Selector(property); + } + + public ISkeletonComponent GetTargetSkeletonComponent (SerializedProperty property) { + var dataField = property.FindBaseOrSiblingProperty(TargetAttribute.dataField); + + if (dataField != null) { + var skeletonComponent = dataField.objectReferenceValue as ISkeletonComponent; + if (dataField.objectReferenceValue != null && skeletonComponent != null) // note the overloaded UnityEngine.Object == null check. Do not simplify. + return skeletonComponent; + } else { + var component = property.serializedObject.targetObject as Component; + if (component != null) + return component.GetComponentInChildren(typeof(ISkeletonComponent)) as ISkeletonComponent; + } + + return null; + } + + protected virtual void Selector (SerializedProperty property) { + SkeletonData data = skeletonDataAsset.GetSkeletonData(true); + if (data == null) return; + + var menu = new GenericMenu(); + PopulateMenu(menu, property, this.TargetAttribute, data); + menu.ShowAsContext(); + } + + protected abstract void PopulateMenu (GenericMenu menu, SerializedProperty property, T targetAttribute, SkeletonData data); + + protected virtual void HandleSelect (object menuItemObject) { + var clickedItem = (SpineDrawerValuePair)menuItemObject; + clickedItem.property.stringValue = clickedItem.str; + clickedItem.property.serializedObject.ApplyModifiedProperties(); + } + + public override float GetPropertyHeight (SerializedProperty property, GUIContent label) { + return 18; + } + + } + + [CustomPropertyDrawer(typeof(SpineSlot))] + public class SpineSlotDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.slot; } } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineSlot targetAttribute, SkeletonData data) { + + if (TargetAttribute.includeNone) + menu.AddItem(new GUIContent(NoneString), string.IsNullOrEmpty(property.stringValue), HandleSelect, new SpineDrawerValuePair(string.Empty, property)); + + for (int i = 0; i < data.Slots.Count; i++) { + string name = data.Slots.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) { + + if (targetAttribute.containsBoundingBoxes) { + int slotIndex = i; + var attachments = new List(); + foreach (var skin in data.Skins) + skin.FindAttachmentsForSlot(slotIndex, attachments); + + bool hasBoundingBox = false; + foreach (var attachment in attachments) { + var bbAttachment = attachment as BoundingBoxAttachment; + if (bbAttachment != null) { + string menuLabel = bbAttachment.IsWeighted() ? name + " (!)" : name; + menu.AddItem(new GUIContent(menuLabel), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + hasBoundingBox = true; + break; + } + } + + if (!hasBoundingBox) + menu.AddDisabledItem(new GUIContent(name)); + + } else { + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + + } + + } + } + + } + + [CustomPropertyDrawer(typeof(SpineSkin))] + public class SpineSkinDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.skin; } } + + public static void GetSkinMenuItems (SkeletonData data, List animationNames, List menuItems, bool includeNone = true) { + if (data == null) return; + + var skins = data.Skins; + + animationNames.Clear(); + menuItems.Clear(); + + var icon = SpineEditorUtilities.Icons.skin; + + if (includeNone) { + animationNames.Add(""); + menuItems.Add(new GUIContent(NoneString, icon)); + } + + foreach (var s in skins) { + var skinName = s.Name; + animationNames.Add(skinName); + menuItems.Add(new GUIContent(skinName, icon)); + } + } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineSkin targetAttribute, SkeletonData data) { + menu.AddDisabledItem(new GUIContent(skeletonDataAsset.name)); + menu.AddSeparator(""); + + for (int i = 0; i < data.Skins.Count; i++) { + string name = data.Skins.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + + } + + [CustomPropertyDrawer(typeof(SpineAnimation))] + public class SpineAnimationDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.animation; } } + + public static void GetAnimationMenuItems (SkeletonData data, List animationNames, List menuItems, bool includeNone = true) { + if (data == null) return; + + var animations = data.Animations; + + animationNames.Clear(); + menuItems.Clear(); + + if (includeNone) { + animationNames.Add(""); + menuItems.Add(new GUIContent(NoneString, SpineEditorUtilities.Icons.animation)); + } + + foreach (var a in animations) { + var animationName = a.Name; + animationNames.Add(animationName); + menuItems.Add(new GUIContent(animationName, SpineEditorUtilities.Icons.animation)); + } + } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineAnimation targetAttribute, SkeletonData data) { + var animations = skeletonDataAsset.GetAnimationStateData().SkeletonData.Animations; + + if (TargetAttribute.includeNone) + menu.AddItem(new GUIContent(NoneString), string.IsNullOrEmpty(property.stringValue), HandleSelect, new SpineDrawerValuePair(string.Empty, property)); + + for (int i = 0; i < animations.Count; i++) { + string name = animations.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + + } + + [CustomPropertyDrawer(typeof(SpineEvent))] + public class SpineEventNameDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.userEvent; } } + + public static void GetEventMenuItems (SkeletonData data, List eventNames, List menuItems, bool includeNone = true) { + if (data == null) return; + + var animations = data.Events; + + eventNames.Clear(); + menuItems.Clear(); + + if (includeNone) { + eventNames.Add(""); + menuItems.Add(new GUIContent(NoneString, SpineEditorUtilities.Icons.userEvent)); + } + + foreach (var a in animations) { + var animationName = a.Name; + eventNames.Add(animationName); + menuItems.Add(new GUIContent(animationName, SpineEditorUtilities.Icons.userEvent)); + } + } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineEvent targetAttribute, SkeletonData data) { + var events = skeletonDataAsset.GetSkeletonData(false).Events; + + if (TargetAttribute.includeNone) + menu.AddItem(new GUIContent(NoneString), string.IsNullOrEmpty(property.stringValue), HandleSelect, new SpineDrawerValuePair(string.Empty, property)); + + for (int i = 0; i < events.Count; i++) { + string name = events.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + + } + + [CustomPropertyDrawer(typeof(SpineIkConstraint))] + public class SpineIkConstraintDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.constraintIK; } } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineIkConstraint targetAttribute, SkeletonData data) { + var constraints = skeletonDataAsset.GetSkeletonData(false).IkConstraints; + + if (TargetAttribute.includeNone) + menu.AddItem(new GUIContent(NoneString), string.IsNullOrEmpty(property.stringValue), HandleSelect, new SpineDrawerValuePair(string.Empty, property)); + + for (int i = 0; i < constraints.Count; i++) { + string name = constraints.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + + } + + [CustomPropertyDrawer(typeof(SpineTransformConstraint))] + public class SpineTransformConstraintDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.constraintTransform; } } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineTransformConstraint targetAttribute, SkeletonData data) { + var constraints = skeletonDataAsset.GetSkeletonData(false).TransformConstraints; + + if (TargetAttribute.includeNone) + menu.AddItem(new GUIContent(NoneString), string.IsNullOrEmpty(property.stringValue), HandleSelect, new SpineDrawerValuePair(string.Empty, property)); + + for (int i = 0; i < constraints.Count; i++) { + string name = constraints.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + } + + [CustomPropertyDrawer(typeof(SpinePathConstraint))] + public class SpinePathConstraintDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.constraintPath; } } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpinePathConstraint targetAttribute, SkeletonData data) { + var constraints = skeletonDataAsset.GetSkeletonData(false).PathConstraints; + + if (TargetAttribute.includeNone) + menu.AddItem(new GUIContent(NoneString), string.IsNullOrEmpty(property.stringValue), HandleSelect, new SpineDrawerValuePair(string.Empty, property)); + + for (int i = 0; i < constraints.Count; i++) { + string name = constraints.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + } + + [CustomPropertyDrawer(typeof(SpineAttachment))] + public class SpineAttachmentDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.genericAttachment; } } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineAttachment targetAttribute, SkeletonData data) { + ISkeletonComponent skeletonComponent = GetTargetSkeletonComponent(property); + var validSkins = new List(); + + if (skeletonComponent != null && targetAttribute.currentSkinOnly) { + Skin currentSkin = null; + + var skinProperty = property.FindBaseOrSiblingProperty(targetAttribute.skinField); + if (skinProperty != null) currentSkin = skeletonComponent.Skeleton.Data.FindSkin(skinProperty.stringValue); + + currentSkin = currentSkin ?? skeletonComponent.Skeleton.Skin; + if (currentSkin != null) + validSkins.Add(currentSkin); + else + validSkins.Add(data.Skins.Items[0]); + + } else { + foreach (Skin skin in data.Skins) + if (skin != null) validSkins.Add(skin); + } + + var attachmentNames = new List(); + var placeholderNames = new List(); + string prefix = ""; + + if (skeletonComponent != null && targetAttribute.currentSkinOnly) + menu.AddDisabledItem(new GUIContent((skeletonComponent as Component).gameObject.name + " (Skeleton)")); + else + menu.AddDisabledItem(new GUIContent(skeletonDataAsset.name)); + + menu.AddSeparator(""); + if (TargetAttribute.includeNone) { + const string NullAttachmentName = ""; + menu.AddItem(new GUIContent("Null"), property.stringValue == NullAttachmentName, HandleSelect, new SpineDrawerValuePair(NullAttachmentName, property)); + menu.AddSeparator(""); + } + + Skin defaultSkin = data.Skins.Items[0]; + var slotProperty = property.FindBaseOrSiblingProperty(TargetAttribute.slotField); + + string slotMatch = ""; + if (slotProperty != null) { + if (slotProperty.propertyType == SerializedPropertyType.String) + slotMatch = slotProperty.stringValue.ToLower(); + } + + foreach (Skin skin in validSkins) { + string skinPrefix = skin.Name + "/"; + + if (validSkins.Count > 1) + prefix = skinPrefix; + + for (int i = 0; i < data.Slots.Count; i++) { + if (slotMatch.Length > 0 && !(data.Slots.Items[i].Name.Equals(slotMatch, StringComparison.OrdinalIgnoreCase))) + continue; + + attachmentNames.Clear(); + placeholderNames.Clear(); + + skin.FindNamesForSlot(i, attachmentNames); + if (skin != defaultSkin) { + defaultSkin.FindNamesForSlot(i, attachmentNames); + skin.FindNamesForSlot(i, placeholderNames); + } + + for (int a = 0; a < attachmentNames.Count; a++) { + string attachmentPath = attachmentNames[a]; + string menuPath = prefix + data.Slots.Items[i].Name + "/" + attachmentPath; + string name = attachmentNames[a]; + + if (targetAttribute.returnAttachmentPath) + name = skin.Name + "/" + data.Slots.Items[i].Name + "/" + attachmentPath; + + if (targetAttribute.placeholdersOnly && !placeholderNames.Contains(attachmentPath)) { + menu.AddDisabledItem(new GUIContent(menuPath)); + } else { + menu.AddItem(new GUIContent(menuPath), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + + } + } + } + + } + + [CustomPropertyDrawer(typeof(SpineBone))] + public class SpineBoneDrawer : SpineTreeItemDrawerBase { + + protected override Texture2D Icon { get { return SpineEditorUtilities.Icons.bone; } } + + protected override void PopulateMenu (GenericMenu menu, SerializedProperty property, SpineBone targetAttribute, SkeletonData data) { + menu.AddDisabledItem(new GUIContent(skeletonDataAsset.name)); + menu.AddSeparator(""); + + if (TargetAttribute.includeNone) + menu.AddItem(new GUIContent(NoneString), string.IsNullOrEmpty(property.stringValue), HandleSelect, new SpineDrawerValuePair(string.Empty, property)); + + for (int i = 0; i < data.Bones.Count; i++) { + string name = data.Bones.Items[i].Name; + if (name.StartsWith(targetAttribute.startsWith, StringComparison.Ordinal)) + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + } + + } + + [CustomPropertyDrawer(typeof(SpineAtlasRegion))] + public class SpineAtlasRegionDrawer : PropertyDrawer { + SerializedProperty atlasProp; + + protected SpineAtlasRegion TargetAttribute { get { return (SpineAtlasRegion)attribute; } } + + public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) { + if (property.propertyType != SerializedPropertyType.String) { + EditorGUI.LabelField(position, "ERROR:", "May only apply to type string"); + return; + } + + string atlasAssetFieldName = TargetAttribute.atlasAssetField; + if (string.IsNullOrEmpty(atlasAssetFieldName)) + atlasAssetFieldName = "atlasAsset"; + + atlasProp = property.FindBaseOrSiblingProperty(atlasAssetFieldName); + + if (atlasProp == null) { + EditorGUI.LabelField(position, "ERROR:", "Must have AtlasAsset variable!"); + return; + } else if (atlasProp.objectReferenceValue == null) { + EditorGUI.LabelField(position, "ERROR:", "Atlas variable must not be null!"); + return; + } else if (atlasProp.objectReferenceValue.GetType() != typeof(AtlasAsset)) { + EditorGUI.LabelField(position, "ERROR:", "Atlas variable must be of type AtlasAsset!"); + } + + position = EditorGUI.PrefixLabel(position, label); + + if (GUI.Button(position, property.stringValue, EditorStyles.popup)) + Selector(property); + + } + + void Selector (SerializedProperty property) { + GenericMenu menu = new GenericMenu(); + AtlasAsset atlasAsset = (AtlasAsset)atlasProp.objectReferenceValue; + Atlas atlas = atlasAsset.GetAtlas(); + FieldInfo field = typeof(Atlas).GetField("regions", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + List regions = (List)field.GetValue(atlas); + + for (int i = 0; i < regions.Count; i++) { + string name = regions[i].name; + menu.AddItem(new GUIContent(name), name == property.stringValue, HandleSelect, new SpineDrawerValuePair(name, property)); + } + + menu.ShowAsContext(); + } + + static void HandleSelect (object val) { + var pair = (SpineDrawerValuePair)val; + pair.property.stringValue = pair.str; + pair.property.serializedObject.ApplyModifiedProperties(); + } + + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SpineAttributeDrawers.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SpineAttributeDrawers.cs.meta new file mode 100644 index 0000000..901111a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SpineAttributeDrawers.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f2de282d583d4a641bf1c349f0a3eef9 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/Assets/Spine/Assets/spine-unity/Editor/SpineEditorUtilities.cs new file mode 100644 index 0000000..28ed6bd --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -0,0 +1,2029 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#pragma warning disable 0219 + +// Original contribution by: Mitch Thompson + +#define SPINE_SKELETONANIMATOR +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Linq; +using System.Reflection; +using Spine; + +namespace Spine.Unity.Editor { + using EventType = UnityEngine.EventType; + + // Analysis disable once ConvertToStaticType + [InitializeOnLoad] + public class SpineEditorUtilities : AssetPostprocessor { + + public static class Icons { + public static Texture2D skeleton; + public static Texture2D nullBone; + public static Texture2D bone; + public static Texture2D poseBones; + public static Texture2D boneNib; + public static Texture2D slot; + public static Texture2D slotRoot; + public static Texture2D skinPlaceholder; + public static Texture2D image; + public static Texture2D genericAttachment; + public static Texture2D boundingBox; + public static Texture2D point; + public static Texture2D mesh; + public static Texture2D weights; + public static Texture2D path; + public static Texture2D clipping; + public static Texture2D skin; + public static Texture2D skinsRoot; + public static Texture2D animation; + public static Texture2D animationRoot; + public static Texture2D spine; + public static Texture2D userEvent; + public static Texture2D constraintNib; + public static Texture2D constraintRoot; + public static Texture2D constraintTransform; + public static Texture2D constraintPath; + public static Texture2D constraintIK; + public static Texture2D warning; + public static Texture2D skeletonUtility; + public static Texture2D hingeChain; + public static Texture2D subMeshRenderer; + public static Texture2D skeletonDataAssetIcon; + public static Texture2D info; + public static Texture2D unity; +// public static Texture2D controllerIcon; + + static Texture2D LoadIcon (string filename) { + return (Texture2D)AssetDatabase.LoadMainAssetAtPath(SpineEditorUtilities.editorGUIPath + "/" + filename); + } + + public static void Initialize () { + skeleton = LoadIcon("icon-skeleton.png"); + nullBone = LoadIcon("icon-null.png"); + bone = LoadIcon("icon-bone.png"); + poseBones = LoadIcon("icon-poseBones.png"); + boneNib = LoadIcon("icon-boneNib.png"); + slot = LoadIcon("icon-slot.png"); + slotRoot = LoadIcon("icon-slotRoot.png"); + skinPlaceholder = LoadIcon("icon-skinPlaceholder.png"); + + genericAttachment = LoadIcon("icon-attachment.png"); + image = LoadIcon("icon-image.png"); + boundingBox = LoadIcon("icon-boundingBox.png"); + point = LoadIcon("icon-point.png"); + mesh = LoadIcon("icon-mesh.png"); + weights = LoadIcon("icon-weights.png"); + path = LoadIcon("icon-path.png"); + clipping = LoadIcon("icon-clipping.png"); + + skin = LoadIcon("icon-skin.png"); + skinsRoot = LoadIcon("icon-skinsRoot.png"); + animation = LoadIcon("icon-animation.png"); + animationRoot = LoadIcon("icon-animationRoot.png"); + spine = LoadIcon("icon-spine.png"); + userEvent = LoadIcon("icon-event.png"); + constraintNib = LoadIcon("icon-constraintNib.png"); + + constraintRoot = LoadIcon("icon-constraints.png"); + constraintTransform = LoadIcon("icon-constraintTransform.png"); + constraintPath = LoadIcon("icon-constraintPath.png"); + constraintIK = LoadIcon("icon-constraintIK.png"); + + warning = LoadIcon("icon-warning.png"); + skeletonUtility = LoadIcon("icon-skeletonUtility.png"); + hingeChain = LoadIcon("icon-hingeChain.png"); + subMeshRenderer = LoadIcon("icon-subMeshRenderer.png"); + + skeletonDataAssetIcon = LoadIcon("SkeletonDataAsset Icon.png"); + + info = EditorGUIUtility.FindTexture("console.infoicon.sml"); + unity = EditorGUIUtility.FindTexture("SceneAsset Icon"); +// controllerIcon = EditorGUIUtility.FindTexture("AnimatorController Icon"); + } + + public static Texture2D GetAttachmentIcon (Attachment attachment) { + // Analysis disable once CanBeReplacedWithTryCastAndCheckForNull + if (attachment is RegionAttachment) + return Icons.image; + else if (attachment is MeshAttachment) + return ((MeshAttachment)attachment).IsWeighted() ? Icons.weights : Icons.mesh; + else if (attachment is BoundingBoxAttachment) + return Icons.boundingBox; + else if (attachment is PointAttachment) + return Icons.point; + else if (attachment is PathAttachment) + return Icons.path; + else if (attachment is ClippingAttachment) + return Icons.clipping; + else + return Icons.warning; + } + } + + public static string editorPath = ""; + public static string editorGUIPath = ""; + public static bool initialized; + + /// HACK: This list keeps the asset reference temporarily during importing. + /// + /// In cases of very large projects/sufficient RAM pressure, when AssetDatabase.SaveAssets is called, + /// Unity can mistakenly unload assets whose references are only on the stack. + /// This leads to MissingReferenceException and other errors. + static readonly List protectFromStackGarbageCollection = new List(); + static HashSet assetsImportedInWrongState = new HashSet(); + + #if SPINE_TK2D + const float DEFAULT_DEFAULT_SCALE = 1f; + #else + const float DEFAULT_DEFAULT_SCALE = 0.01f; + #endif + const string DEFAULT_SCALE_KEY = "SPINE_DEFAULT_SCALE"; + public static float defaultScale = DEFAULT_DEFAULT_SCALE; + + const float DEFAULT_DEFAULT_MIX = 0.2f; + const string DEFAULT_MIX_KEY = "SPINE_DEFAULT_MIX"; + public static float defaultMix = DEFAULT_DEFAULT_MIX; + + const string DEFAULT_DEFAULT_SHADER = "Spine/Skeleton"; + const string DEFAULT_SHADER_KEY = "SPINE_DEFAULT_SHADER"; + public static string defaultShader = DEFAULT_DEFAULT_SHADER; + + const float DEFAULT_DEFAULT_ZSPACING = 0f; + const string DEFAULT_ZSPACING_KEY = "SPINE_DEFAULT_ZSPACING"; + public static float defaultZSpacing = DEFAULT_DEFAULT_ZSPACING; + + const bool DEFAULT_SHOW_HIERARCHY_ICONS = true; + const string SHOW_HIERARCHY_ICONS_KEY = "SPINE_SHOW_HIERARCHY_ICONS"; + public static bool showHierarchyIcons = DEFAULT_SHOW_HIERARCHY_ICONS; + + const bool DEFAULT_SET_TEXTUREIMPORTER_SETTINGS = true; + const string SET_TEXTUREIMPORTER_SETTINGS_KEY = "SPINE_SET_TEXTUREIMPORTER_SETTINGS"; + public static bool setTextureImporterSettings = DEFAULT_SET_TEXTUREIMPORTER_SETTINGS; + + internal const float DEFAULT_MIPMAPBIAS = -0.5f; + + public const float DEFAULT_SCENE_ICONS_SCALE = 1f; + public const string SCENE_ICONS_SCALE_KEY = "SPINE_SCENE_ICONS_SCALE"; + + #region Initialization + static SpineEditorUtilities () { + Initialize(); + } + + static void LoadPreferences () { + defaultMix = EditorPrefs.GetFloat(DEFAULT_MIX_KEY, DEFAULT_DEFAULT_MIX); + defaultScale = EditorPrefs.GetFloat(DEFAULT_SCALE_KEY, DEFAULT_DEFAULT_SCALE); + defaultZSpacing = EditorPrefs.GetFloat(DEFAULT_ZSPACING_KEY, DEFAULT_DEFAULT_ZSPACING); + defaultShader = EditorPrefs.GetString(DEFAULT_SHADER_KEY, DEFAULT_DEFAULT_SHADER); + showHierarchyIcons = EditorPrefs.GetBool(SHOW_HIERARCHY_ICONS_KEY, DEFAULT_SHOW_HIERARCHY_ICONS); + setTextureImporterSettings = EditorPrefs.GetBool(SET_TEXTUREIMPORTER_SETTINGS_KEY, DEFAULT_SET_TEXTUREIMPORTER_SETTINGS); + SpineHandles.handleScale = EditorPrefs.GetFloat(SCENE_ICONS_SCALE_KEY, DEFAULT_SCENE_ICONS_SCALE); + preferencesLoaded = true; + } + + static void Initialize () { + LoadPreferences(); + + DirectoryInfo rootDir = new DirectoryInfo(Application.dataPath); + FileInfo[] files = rootDir.GetFiles("SpineEditorUtilities.cs", SearchOption.AllDirectories); + editorPath = Path.GetDirectoryName(files[0].FullName.Replace("\\", "/").Replace(Application.dataPath, "Assets")); + editorGUIPath = editorPath + "/GUI"; + + Icons.Initialize(); + + // Drag and Drop + SceneView.onSceneGUIDelegate -= SceneViewDragAndDrop; + SceneView.onSceneGUIDelegate += SceneViewDragAndDrop; + EditorApplication.hierarchyWindowItemOnGUI -= SpineEditorHierarchyHandler.HierarchyDragAndDrop; + EditorApplication.hierarchyWindowItemOnGUI += SpineEditorHierarchyHandler.HierarchyDragAndDrop; + + // Hierarchy Icons + #if UNITY_2017_2_OR_NEWER + EditorApplication.playModeStateChanged -= SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged; + EditorApplication.playModeStateChanged += SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged; + SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode); + #else + EditorApplication.playmodeStateChanged -= SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged; + EditorApplication.playmodeStateChanged += SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged; + SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged(); + #endif + + initialized = true; + } + + public static void ConfirmInitialization () { + if (!initialized || Icons.skeleton == null) + Initialize(); + } + #endregion + + #region Spine Preferences and Defaults + static bool preferencesLoaded = false; + + [PreferenceItem("Spine")] + static void PreferencesGUI () { + if (!preferencesLoaded) + LoadPreferences(); + + EditorGUI.BeginChangeCheck(); + showHierarchyIcons = EditorGUILayout.Toggle(new GUIContent("Show Hierarchy Icons", "Show relevant icons on GameObjects with Spine Components on them. Disable this if you have large, complex scenes."), showHierarchyIcons); + if (EditorGUI.EndChangeCheck()) { + EditorPrefs.SetBool(SHOW_HIERARCHY_ICONS_KEY, showHierarchyIcons); + #if UNITY_2017_2_OR_NEWER + SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode); + #else + SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged(); + #endif + } + + EditorGUILayout.Separator(); + + EditorGUILayout.LabelField("Auto-Import Settings", EditorStyles.boldLabel); + + EditorGUI.BeginChangeCheck(); + defaultMix = EditorGUILayout.FloatField("Default Mix", defaultMix); + if (EditorGUI.EndChangeCheck()) + EditorPrefs.SetFloat(DEFAULT_MIX_KEY, defaultMix); + + EditorGUI.BeginChangeCheck(); + defaultScale = EditorGUILayout.FloatField("Default SkeletonData Scale", defaultScale); + if (EditorGUI.EndChangeCheck()) + EditorPrefs.SetFloat(DEFAULT_SCALE_KEY, defaultScale); + + EditorGUI.BeginChangeCheck(); + var shader = (EditorGUILayout.ObjectField("Default Shader", Shader.Find(defaultShader), typeof(Shader), false) as Shader); + defaultShader = shader != null ? shader.name : DEFAULT_DEFAULT_SHADER; + if (EditorGUI.EndChangeCheck()) + EditorPrefs.SetString(DEFAULT_SHADER_KEY, defaultShader); + + EditorGUI.BeginChangeCheck(); + setTextureImporterSettings = EditorGUILayout.Toggle(new GUIContent("Apply Atlas Texture Settings", "Apply the recommended settings for Texture Importers."), setTextureImporterSettings); + if (EditorGUI.EndChangeCheck()) { + EditorPrefs.SetBool(SET_TEXTUREIMPORTER_SETTINGS_KEY, setTextureImporterSettings); + } + + EditorGUILayout.Space(); + + EditorGUILayout.LabelField("Editor Instantiation", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + defaultZSpacing = EditorGUILayout.Slider("Default Slot Z-Spacing", defaultZSpacing, -0.1f, 0f); + if (EditorGUI.EndChangeCheck()) + EditorPrefs.SetFloat(DEFAULT_ZSPACING_KEY, defaultZSpacing); + + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Handles and Gizmos", EditorStyles.boldLabel); + EditorGUI.BeginChangeCheck(); + SpineHandles.handleScale = EditorGUILayout.Slider("Editor Bone Scale", SpineHandles.handleScale, 0.01f, 2f); + SpineHandles.handleScale = Mathf.Max(0.01f, SpineHandles.handleScale); + if (EditorGUI.EndChangeCheck()) { + EditorPrefs.SetFloat(SCENE_ICONS_SCALE_KEY, SpineHandles.handleScale); + SceneView.RepaintAll(); + } + + + GUILayout.Space(20); + EditorGUILayout.LabelField("3rd Party Settings", EditorStyles.boldLabel); + using (new GUILayout.HorizontalScope()) { + EditorGUILayout.PrefixLabel("Define TK2D"); + if (GUILayout.Button("Enable", GUILayout.Width(64))) + SpineTK2DEditorUtility.EnableTK2D(); + if (GUILayout.Button("Disable", GUILayout.Width(64))) + SpineTK2DEditorUtility.DisableTK2D(); + } + } + #endregion + + #region Drag and Drop Instantiation + public delegate Component InstantiateDelegate (SkeletonDataAsset skeletonDataAsset); + + public struct SpawnMenuData { + public Vector3 spawnPoint; + public SkeletonDataAsset skeletonDataAsset; + public InstantiateDelegate instantiateDelegate; + public bool isUI; + } + + public class SkeletonComponentSpawnType { + public string menuLabel; + public InstantiateDelegate instantiateDelegate; + public bool isUI; + } + + internal static readonly List additionalSpawnTypes = new List(); + + static void SceneViewDragAndDrop (SceneView sceneview) { + var current = UnityEngine.Event.current; + var references = DragAndDrop.objectReferences; + if (current.type == EventType.Layout) return; + + // Allow drag and drop of one SkeletonDataAsset. + if (references.Length == 1) { + var skeletonDataAsset = references[0] as SkeletonDataAsset; + if (skeletonDataAsset != null) { + var mousePos = current.mousePosition; + + bool invalidSkeletonData = skeletonDataAsset.GetSkeletonData(true) == null; + if (invalidSkeletonData) { + DragAndDrop.visualMode = DragAndDropVisualMode.Rejected; + Handles.BeginGUI(); + GUI.Label(new Rect(mousePos + new Vector2(20f, 20f), new Vector2(400f, 40f)), new GUIContent(string.Format("{0} is invalid.\nCannot create new Spine GameObject.", skeletonDataAsset.name), SpineEditorUtilities.Icons.warning)); + Handles.EndGUI(); + return; + } else { + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + Handles.BeginGUI(); + GUI.Label(new Rect(mousePos + new Vector2(20f, 20f), new Vector2(400f, 20f)), new GUIContent(string.Format("Create Spine GameObject ({0})", skeletonDataAsset.skeletonJSON.name), SpineEditorUtilities.Icons.skeletonDataAssetIcon)); + Handles.EndGUI(); + + if (current.type == EventType.DragPerform) { + RectTransform rectTransform = (Selection.activeGameObject == null) ? null : Selection.activeGameObject.GetComponent(); + Plane plane = (rectTransform == null) ? new Plane(Vector3.back, Vector3.zero) : new Plane(-rectTransform.forward, rectTransform.position); + Vector3 spawnPoint = MousePointToWorldPoint2D(mousePos, sceneview.camera, plane); + ShowInstantiateContextMenu(skeletonDataAsset, spawnPoint); + DragAndDrop.AcceptDrag(); + current.Use(); + } + } + } + } + } + + public static void ShowInstantiateContextMenu (SkeletonDataAsset skeletonDataAsset, Vector3 spawnPoint) { + var menu = new GenericMenu(); + + // SkeletonAnimation + menu.AddItem(new GUIContent("SkeletonAnimation"), false, HandleSkeletonComponentDrop, new SpawnMenuData { + skeletonDataAsset = skeletonDataAsset, + spawnPoint = spawnPoint, + instantiateDelegate = (data) => InstantiateSkeletonAnimation(data), + isUI = false + }); + + // SkeletonGraphic + var skeletonGraphicInspectorType = System.Type.GetType("Spine.Unity.Editor.SkeletonGraphicInspector"); + if (skeletonGraphicInspectorType != null) { + var graphicInstantiateDelegate = skeletonGraphicInspectorType.GetMethod("SpawnSkeletonGraphicFromDrop", BindingFlags.Static | BindingFlags.Public); + if (graphicInstantiateDelegate != null) + menu.AddItem(new GUIContent("SkeletonGraphic (UI)"), false, HandleSkeletonComponentDrop, new SpawnMenuData { + skeletonDataAsset = skeletonDataAsset, + spawnPoint = spawnPoint, + instantiateDelegate = System.Delegate.CreateDelegate(typeof(InstantiateDelegate), graphicInstantiateDelegate) as InstantiateDelegate, + isUI = true + }); + } + + #if SPINE_SKELETONANIMATOR + menu.AddSeparator(""); + // SkeletonAnimator + menu.AddItem(new GUIContent("SkeletonAnimator"), false, HandleSkeletonComponentDrop, new SpawnMenuData { + skeletonDataAsset = skeletonDataAsset, + spawnPoint = spawnPoint, + instantiateDelegate = (data) => InstantiateSkeletonAnimator(data) + }); + #endif + + menu.ShowAsContext(); + } + + public static void HandleSkeletonComponentDrop (object spawnMenuData) { + var data = (SpawnMenuData)spawnMenuData; + + if (data.skeletonDataAsset.GetSkeletonData(true) == null) { + EditorUtility.DisplayDialog("Invalid SkeletonDataAsset", "Unable to create Spine GameObject.\n\nPlease check your SkeletonDataAsset.", "Ok"); + return; + } + + bool isUI = data.isUI; + + Component newSkeletonComponent = data.instantiateDelegate.Invoke(data.skeletonDataAsset); + GameObject newGameObject = newSkeletonComponent.gameObject; + Transform newTransform = newGameObject.transform; + + var activeGameObject = Selection.activeGameObject; + if (isUI && activeGameObject != null) + newTransform.SetParent(activeGameObject.transform, false); + + newTransform.position = isUI ? data.spawnPoint : RoundVector(data.spawnPoint, 2); + + if (isUI && (activeGameObject == null || activeGameObject.GetComponent() == null)) + Debug.Log("Created a UI Skeleton GameObject not under a RectTransform. It may not be visible until you parent it to a canvas."); + + if (!isUI && activeGameObject != null && activeGameObject.transform.localScale != Vector3.one) + Debug.Log("New Spine GameObject was parented to a scaled Transform. It may not be the intended size."); + + Selection.activeGameObject = newGameObject; + //EditorGUIUtility.PingObject(newGameObject); // Doesn't work when setting activeGameObject. + Undo.RegisterCreatedObjectUndo(newGameObject, "Create Spine GameObject"); + } + + /// + /// Rounds off vector components to a number of decimal digits. + /// + public static Vector3 RoundVector (Vector3 vector, int digits) { + vector.x = (float)System.Math.Round(vector.x, digits); + vector.y = (float)System.Math.Round(vector.y, digits); + vector.z = (float)System.Math.Round(vector.z, digits); + return vector; + } + + /// + /// Converts a mouse point to a world point on a plane. + /// + static Vector3 MousePointToWorldPoint2D (Vector2 mousePosition, Camera camera, Plane plane) { + var screenPos = new Vector3(mousePosition.x, camera.pixelHeight - mousePosition.y, 0f); + var ray = camera.ScreenPointToRay(screenPos); + float distance; + bool hit = plane.Raycast(ray, out distance); + return ray.GetPoint(distance); + } + #endregion + + #region Hierarchy + static class SpineEditorHierarchyHandler { + static Dictionary skeletonRendererTable = new Dictionary(); + static Dictionary skeletonUtilityBoneTable = new Dictionary(); + static Dictionary boundingBoxFollowerTable = new Dictionary(); + + #if UNITY_2017_2_OR_NEWER + internal static void HierarchyIconsOnPlaymodeStateChanged (PlayModeStateChange stateChange) { + #else + internal static void HierarchyIconsOnPlaymodeStateChanged () { + #endif + skeletonRendererTable.Clear(); + skeletonUtilityBoneTable.Clear(); + boundingBoxFollowerTable.Clear(); + + #if UNITY_2018 + EditorApplication.hierarchyChanged -= HierarchyIconsOnChanged; + #else + EditorApplication.hierarchyWindowChanged -= HierarchyIconsOnChanged; + #endif + EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI; + + if (!Application.isPlaying && showHierarchyIcons) { + #if UNITY_2018 + EditorApplication.hierarchyChanged += HierarchyIconsOnChanged; + #else + EditorApplication.hierarchyWindowChanged += HierarchyIconsOnChanged; + #endif + EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI; + HierarchyIconsOnChanged(); + } + } + + internal static void HierarchyIconsOnChanged () { + skeletonRendererTable.Clear(); + skeletonUtilityBoneTable.Clear(); + boundingBoxFollowerTable.Clear(); + + SkeletonRenderer[] arr = Object.FindObjectsOfType(); + foreach (SkeletonRenderer r in arr) + skeletonRendererTable[r.gameObject.GetInstanceID()] = r.gameObject; + + SkeletonUtilityBone[] boneArr = Object.FindObjectsOfType(); + foreach (SkeletonUtilityBone b in boneArr) + skeletonUtilityBoneTable[b.gameObject.GetInstanceID()] = b; + + BoundingBoxFollower[] bbfArr = Object.FindObjectsOfType(); + foreach (BoundingBoxFollower bbf in bbfArr) + boundingBoxFollowerTable[bbf.gameObject.GetInstanceID()] = bbf; + } + + internal static void HierarchyIconsOnGUI (int instanceId, Rect selectionRect) { + Rect r = new Rect(selectionRect); + if (skeletonRendererTable.ContainsKey(instanceId)) { + r.x = r.width - 15; + r.width = 15; + GUI.Label(r, Icons.spine); + } else if (skeletonUtilityBoneTable.ContainsKey(instanceId)) { + r.x -= 26; + if (skeletonUtilityBoneTable[instanceId] != null) { + if (skeletonUtilityBoneTable[instanceId].transform.childCount == 0) + r.x += 13; + r.y += 2; + r.width = 13; + r.height = 13; + if (skeletonUtilityBoneTable[instanceId].mode == SkeletonUtilityBone.Mode.Follow) + GUI.DrawTexture(r, Icons.bone); + else + GUI.DrawTexture(r, Icons.poseBones); + } + } else if (boundingBoxFollowerTable.ContainsKey(instanceId)) { + r.x -= 26; + if (boundingBoxFollowerTable[instanceId] != null) { + if (boundingBoxFollowerTable[instanceId].transform.childCount == 0) + r.x += 13; + r.y += 2; + r.width = 13; + r.height = 13; + GUI.DrawTexture(r, Icons.boundingBox); + } + } + } + + internal static void HierarchyDragAndDrop (int instanceId, Rect selectionRect) { + // HACK: Uses EditorApplication.hierarchyWindowItemOnGUI. + // Only works when there is at least one item in the scene. + var current = UnityEngine.Event.current; + var eventType = current.type; + bool isDraggingEvent = eventType == EventType.DragUpdated; + bool isDropEvent = eventType == EventType.DragPerform; + if (isDraggingEvent || isDropEvent) { + var mouseOverWindow = EditorWindow.mouseOverWindow; + if (mouseOverWindow != null) { + + // One, existing, valid SkeletonDataAsset + var references = DragAndDrop.objectReferences; + if (references.Length == 1) { + var skeletonDataAsset = references[0] as SkeletonDataAsset; + if (skeletonDataAsset != null && skeletonDataAsset.GetSkeletonData(true) != null) { + + // Allow drag-and-dropping anywhere in the Hierarchy Window. + // HACK: string-compare because we can't get its type via reflection. + const string HierarchyWindow = "UnityEditor.SceneHierarchyWindow"; + if (HierarchyWindow.Equals(mouseOverWindow.GetType().ToString(), System.StringComparison.Ordinal)) { + if (isDraggingEvent) { + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + current.Use(); + } else if (isDropEvent) { + ShowInstantiateContextMenu(skeletonDataAsset, Vector3.zero); + DragAndDrop.AcceptDrag(); + current.Use(); + return; + } + } + + } + } + } + } + + } + } + #endregion + + #region Auto-Import Entry Point + static void OnPostprocessAllAssets (string[] imported, string[] deleted, string[] moved, string[] movedFromAssetPaths) { + if (imported.Length == 0) + return; + + // In case user used "Assets -> Reimport All", during the import process, + // asset database is not initialized until some point. During that period, + // all attempts to load any assets using API (i.e. AssetDatabase.LoadAssetAtPath) + // will return null, and as result, assets won't be loaded even if they actually exists, + // which may lead to numerous importing errors. + // This situation also happens if Library folder is deleted from the project, which is a pretty + // common case, since when using version control systems, the Library folder must be excluded. + // + // So to avoid this, in case asset database is not available, we delay loading the assets + // until next time. + // + // Unity *always* reimports some internal assets after the process is done, so this method + // is always called once again in a state when asset database is available. + // + // Checking whether AssetDatabase is initialized is done by attempting to load + // a known "marker" asset that should always be available. Failing to load this asset + // means that AssetDatabase is not initialized. + assetsImportedInWrongState.UnionWith(imported); + if (AssetDatabaseAvailabilityDetector.IsAssetDatabaseAvailable()) { + string[] combinedAssets = assetsImportedInWrongState.ToArray(); + assetsImportedInWrongState.Clear(); + ImportSpineContent(combinedAssets); + } + } + + public static void ImportSpineContent (string[] imported, bool reimport = false) { + var atlasPaths = new List(); + var imagePaths = new List(); + var skeletonPaths = new List(); + + foreach (string str in imported) { + string extension = Path.GetExtension(str).ToLower(); + switch (extension) { + case ".txt": + if (str.EndsWith(".atlas.txt", System.StringComparison.Ordinal)) + atlasPaths.Add(str); + break; + case ".png": + case ".jpg": + imagePaths.Add(str); + break; + case ".json": + var jsonAsset = (TextAsset)AssetDatabase.LoadAssetAtPath(str, typeof(TextAsset)); + if (jsonAsset != null && SkeletonDataFileValidator.IsSpineData(jsonAsset)) + skeletonPaths.Add(str); + break; + case ".bytes": + if (str.ToLower().EndsWith(".skel.bytes", System.StringComparison.Ordinal)) { + if (SkeletonDataFileValidator.IsSpineData((TextAsset)AssetDatabase.LoadAssetAtPath(str, typeof(TextAsset)))) + skeletonPaths.Add(str); + } + break; + } + } + + // Import atlases first. + var atlases = new List(); + foreach (string ap in atlasPaths) { + TextAsset atlasText = (TextAsset)AssetDatabase.LoadAssetAtPath(ap, typeof(TextAsset)); + AtlasAsset atlas = IngestSpineAtlas(atlasText); + atlases.Add(atlas); + } + + // Import skeletons and match them with atlases. + bool abortSkeletonImport = false; + foreach (string sp in skeletonPaths) { + if (!reimport && SkeletonDataFileValidator.CheckForValidSkeletonData(sp)) { + ReloadSkeletonData(sp); + continue; + } + + string dir = Path.GetDirectoryName(sp); + + #if SPINE_TK2D + IngestSpineProject(AssetDatabase.LoadAssetAtPath(sp, typeof(TextAsset)) as TextAsset, null); + #else + var localAtlases = FindAtlasesAtPath(dir); + var requiredPaths = GetRequiredAtlasRegions(sp); + var atlasMatch = GetMatchingAtlas(requiredPaths, localAtlases); + if (atlasMatch != null || requiredPaths.Count == 0) { + IngestSpineProject(AssetDatabase.LoadAssetAtPath(sp, typeof(TextAsset)) as TextAsset, atlasMatch); + } else { + bool resolved = false; + while (!resolved) { + + string filename = Path.GetFileNameWithoutExtension(sp); + int result = EditorUtility.DisplayDialogComplex( + string.Format("AtlasAsset for \"{0}\"", filename), + string.Format("Could not automatically set the AtlasAsset for \"{0}\". You may set it manually.", filename), + "Choose AtlasAssets...", "Skip this", "Stop importing all" + ); + + switch (result) { + case -1: + //Debug.Log("Select Atlas"); + AtlasAsset selectedAtlas = GetAtlasDialog(Path.GetDirectoryName(sp)); + if (selectedAtlas != null) { + localAtlases.Clear(); + localAtlases.Add(selectedAtlas); + atlasMatch = GetMatchingAtlas(requiredPaths, localAtlases); + if (atlasMatch != null) { + resolved = true; + IngestSpineProject(AssetDatabase.LoadAssetAtPath(sp, typeof(TextAsset)) as TextAsset, atlasMatch); + } + } + break; + case 0: // Choose AtlasAssets... + var atlasList = MultiAtlasDialog(requiredPaths, Path.GetDirectoryName(sp), Path.GetFileNameWithoutExtension(sp)); + if (atlasList != null) + IngestSpineProject(AssetDatabase.LoadAssetAtPath(sp, typeof(TextAsset)) as TextAsset, atlasList.ToArray()); + + resolved = true; + break; + case 1: // Skip + Debug.Log("Skipped importing: " + Path.GetFileName(sp)); + resolved = true; + break; + case 2: // Stop importing all + abortSkeletonImport = true; + resolved = true; + break; + } + } + } + + if (abortSkeletonImport) + break; + #endif + } + // Any post processing of images + } + + static void ReloadSkeletonData (string skeletonJSONPath) { + string dir = Path.GetDirectoryName(skeletonJSONPath); + TextAsset textAsset = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonJSONPath, typeof(TextAsset)); + DirectoryInfo dirInfo = new DirectoryInfo(dir); + FileInfo[] files = dirInfo.GetFiles("*.asset"); + + foreach (var f in files) { + string localPath = dir + "/" + f.Name; + var obj = AssetDatabase.LoadAssetAtPath(localPath, typeof(Object)); + var skeletonDataAsset = obj as SkeletonDataAsset; + if (skeletonDataAsset != null) { + if (skeletonDataAsset.skeletonJSON == textAsset) { + if (Selection.activeObject == skeletonDataAsset) + Selection.activeObject = null; + + Debug.LogFormat("Changes to '{0}' detected. Clearing SkeletonDataAsset: {1}", skeletonJSONPath, localPath); + skeletonDataAsset.Clear(); + + string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(skeletonDataAsset)); + string lastHash = EditorPrefs.GetString(guid + "_hash"); + + // For some weird reason sometimes Unity loses the internal Object pointer, + // and as a result, all comparisons with null returns true. + // But the C# wrapper is still alive, so we can "restore" the object + // by reloading it from its Instance ID. + AtlasAsset[] skeletonDataAtlasAssets = skeletonDataAsset.atlasAssets; + if (skeletonDataAtlasAssets != null) { + for (int i = 0; i < skeletonDataAtlasAssets.Length; i++) { + if (!ReferenceEquals(null, skeletonDataAtlasAssets[i]) && + skeletonDataAtlasAssets[i].Equals(null) && + skeletonDataAtlasAssets[i].GetInstanceID() != 0 + ) { + skeletonDataAtlasAssets[i] = EditorUtility.InstanceIDToObject(skeletonDataAtlasAssets[i].GetInstanceID()) as AtlasAsset; + } + } + } + + SkeletonData skeletonData = skeletonDataAsset.GetSkeletonData(true); + string currentHash = skeletonData != null ? skeletonData.Hash : null; + + #if SPINE_SKELETONANIMATOR + if (currentHash == null || lastHash != currentHash) + UpdateMecanimClips(skeletonDataAsset); + #endif + + // if (currentHash == null || lastHash != currentHash) + // Do any upkeep on synchronized assets + + if (currentHash != null) + EditorPrefs.SetString(guid + "_hash", currentHash); + } + } + } + } + #endregion + + #region Match SkeletonData with Atlases + static readonly AttachmentType[] AtlasTypes = { AttachmentType.Region, AttachmentType.Linkedmesh, AttachmentType.Mesh }; + + static List MultiAtlasDialog (List requiredPaths, string initialDirectory, string filename = "") { + List atlasAssets = new List(); + bool resolved = false; + string lastAtlasPath = initialDirectory; + while (!resolved) { + + // Build dialog box message. + var missingRegions = new List(requiredPaths); + var dialogText = new StringBuilder(); + { + dialogText.AppendLine(string.Format("SkeletonDataAsset for \"{0}\"", filename)); + dialogText.AppendLine("has missing regions."); + dialogText.AppendLine(); + dialogText.AppendLine("Current Atlases:"); + + if (atlasAssets.Count == 0) + dialogText.AppendLine("\t--none--"); + + for (int i = 0; i < atlasAssets.Count; i++) + dialogText.AppendLine("\t" + atlasAssets[i].name); + + dialogText.AppendLine(); + dialogText.AppendLine("Missing Regions:"); + + foreach (var atlasAsset in atlasAssets) { + var atlas = atlasAsset.GetAtlas(); + for (int i = 0; i < missingRegions.Count; i++) { + if (atlas.FindRegion(missingRegions[i]) != null) { + missingRegions.RemoveAt(i); + i--; + } + } + } + + int n = missingRegions.Count; + if (n == 0) break; + + const int MaxListLength = 15; + for (int i = 0; (i < n && i < MaxListLength); i++) + dialogText.AppendLine("\t" + missingRegions[i]); + + if (n > MaxListLength) dialogText.AppendLine(string.Format("\t... {0} more...", n - MaxListLength)); + } + + // Show dialog box. + int result = EditorUtility.DisplayDialogComplex( + "SkeletonDataAsset has missing Atlas.", + dialogText.ToString(), + "Browse...", "Import anyway", "Cancel" + ); + + switch (result) { + case 0: // Browse... + AtlasAsset selectedAtlasAsset = GetAtlasDialog(lastAtlasPath); + if (selectedAtlasAsset != null) { + var atlas = selectedAtlasAsset.GetAtlas(); + bool hasValidRegion = false; + foreach (string str in missingRegions) { + if (atlas.FindRegion(str) != null) { + hasValidRegion = true; + break; + } + } + atlasAssets.Add(selectedAtlasAsset); + } + break; + case 1: // Import anyway + resolved = true; + break; + case 2: // Cancel + atlasAssets = null; + resolved = true; + break; + } + } + + return atlasAssets; + } + + static AtlasAsset GetAtlasDialog (string dirPath) { + string path = EditorUtility.OpenFilePanel("Select AtlasAsset...", dirPath, "asset"); + if (path == "") return null; // Canceled or closed by user. + + int subLen = Application.dataPath.Length - 6; + string assetRelativePath = path.Substring(subLen, path.Length - subLen).Replace("\\", "/"); + + Object obj = AssetDatabase.LoadAssetAtPath(assetRelativePath, typeof(AtlasAsset)); + + if (obj == null || obj.GetType() != typeof(AtlasAsset)) + return null; + + return (AtlasAsset)obj; + } + + static void AddRequiredAtlasRegionsFromBinary (string skeletonDataPath, List requiredPaths) { + SkeletonBinary binary = new SkeletonBinary(new AtlasRequirementLoader(requiredPaths)); + TextAsset data = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonDataPath, typeof(TextAsset)); + MemoryStream input = new MemoryStream(data.bytes); + binary.ReadSkeletonData(input); + binary = null; + } + + public static List GetRequiredAtlasRegions (string skeletonDataPath) { + List requiredPaths = new List(); + + if (skeletonDataPath.Contains(".skel")) { + AddRequiredAtlasRegionsFromBinary(skeletonDataPath, requiredPaths); + return requiredPaths; + } + + TextAsset spineJson = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonDataPath, typeof(TextAsset)); + + StringReader reader = new StringReader(spineJson.text); + var root = Json.Deserialize(reader) as Dictionary; + + if (!root.ContainsKey("skins")) + return requiredPaths; + + foreach (KeyValuePair entry in (Dictionary)root["skins"]) { + foreach (KeyValuePair slotEntry in (Dictionary)entry.Value) { + + foreach (KeyValuePair attachmentEntry in ((Dictionary)slotEntry.Value)) { + var data = ((Dictionary)attachmentEntry.Value); + + // Ignore non-atlas-requiring types. + if (data.ContainsKey("type")) { + AttachmentType attachmentType; + string typeString = (string)data["type"]; + try { + attachmentType = (AttachmentType)System.Enum.Parse(typeof(AttachmentType), typeString, true); + } catch (System.ArgumentException e) { + // For more info, visit: http://esotericsoftware.com/forum/Spine-editor-and-runtime-version-management-6534 + Debug.LogWarning(string.Format("Unidentified Attachment type: \"{0}\". Skeleton may have been exported from an incompatible Spine version.", typeString)); + throw e; + } + + if (!AtlasTypes.Contains(attachmentType)) + continue; + } + + if (data.ContainsKey("path")) + requiredPaths.Add((string)data["path"]); + else if (data.ContainsKey("name")) + requiredPaths.Add((string)data["name"]); + else + requiredPaths.Add(attachmentEntry.Key); + } + } + } + + return requiredPaths; + } + + static AtlasAsset GetMatchingAtlas (List requiredPaths, List atlasAssets) { + AtlasAsset atlasAssetMatch = null; + + foreach (AtlasAsset a in atlasAssets) { + Atlas atlas = a.GetAtlas(); + bool failed = false; + foreach (string regionPath in requiredPaths) { + if (atlas.FindRegion(regionPath) == null) { + failed = true; + break; + } + } + + if (!failed) { + atlasAssetMatch = a; + break; + } + } + + return atlasAssetMatch; + } + + public class AtlasRequirementLoader : AttachmentLoader { + List requirementList; + + public AtlasRequirementLoader (List requirementList) { + this.requirementList = requirementList; + } + + public RegionAttachment NewRegionAttachment (Skin skin, string name, string path) { + requirementList.Add(path); + return new RegionAttachment(name); + } + + public MeshAttachment NewMeshAttachment (Skin skin, string name, string path) { + requirementList.Add(path); + return new MeshAttachment(name); + } + + public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, string name) { + return new BoundingBoxAttachment(name); + } + + public PathAttachment NewPathAttachment (Skin skin, string name) { + return new PathAttachment(name); + } + + public PointAttachment NewPointAttachment (Skin skin, string name) { + return new PointAttachment(name); + } + + public ClippingAttachment NewClippingAttachment (Skin skin, string name) { + return new ClippingAttachment(name); + } + } + #endregion + + #region Import Atlases + static List FindAtlasesAtPath (string path) { + List arr = new List(); + DirectoryInfo dir = new DirectoryInfo(path); + FileInfo[] assetInfoArr = dir.GetFiles("*.asset"); + + int subLen = Application.dataPath.Length - 6; + foreach (var f in assetInfoArr) { + string assetRelativePath = f.FullName.Substring(subLen, f.FullName.Length - subLen).Replace("\\", "/"); + Object obj = AssetDatabase.LoadAssetAtPath(assetRelativePath, typeof(AtlasAsset)); + if (obj != null) + arr.Add(obj as AtlasAsset); + } + + return arr; + } + + static AtlasAsset IngestSpineAtlas (TextAsset atlasText) { + if (atlasText == null) { + Debug.LogWarning("Atlas source cannot be null!"); + return null; + } + + string primaryName = Path.GetFileNameWithoutExtension(atlasText.name).Replace(".atlas", ""); + string assetPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(atlasText)); + + string atlasPath = assetPath + "/" + primaryName + "_Atlas.asset"; + + AtlasAsset atlasAsset = (AtlasAsset)AssetDatabase.LoadAssetAtPath(atlasPath, typeof(AtlasAsset)); + + List vestigialMaterials = new List(); + + if (atlasAsset == null) + atlasAsset = AtlasAsset.CreateInstance(); + else { + foreach (Material m in atlasAsset.materials) + vestigialMaterials.Add(m); + } + + protectFromStackGarbageCollection.Add(atlasAsset); + atlasAsset.atlasFile = atlasText; + + //strip CR + string atlasStr = atlasText.text; + atlasStr = atlasStr.Replace("\r", ""); + + string[] atlasLines = atlasStr.Split('\n'); + List pageFiles = new List(); + for (int i = 0; i < atlasLines.Length - 1; i++) { + if (atlasLines[i].Trim().Length == 0) + pageFiles.Add(atlasLines[i + 1].Trim()); + } + + var populatingMaterials = new List(pageFiles.Count);//atlasAsset.materials = new Material[pageFiles.Count]; + + for (int i = 0; i < pageFiles.Count; i++) { + string texturePath = assetPath + "/" + pageFiles[i]; + Texture2D texture = (Texture2D)AssetDatabase.LoadAssetAtPath(texturePath, typeof(Texture2D)); + + if (setTextureImporterSettings) { + TextureImporter texImporter = (TextureImporter)TextureImporter.GetAtPath(texturePath); + if (texImporter == null) { + Debug.LogWarning(string.Format("{0} ::: Texture asset \"{1}\" not found. Skipping. Please check your atlas file for renamed files.", atlasAsset.name, texturePath)); + continue; + } + + texImporter.textureCompression = TextureImporterCompression.Uncompressed; + texImporter.alphaSource = TextureImporterAlphaSource.FromInput; + texImporter.mipmapEnabled = false; + texImporter.alphaIsTransparency = false; // Prevent the texture importer from applying bleed to the transparent parts for PMA. + texImporter.spriteImportMode = SpriteImportMode.None; + texImporter.maxTextureSize = 2048; + + EditorUtility.SetDirty(texImporter); + AssetDatabase.ImportAsset(texturePath); + AssetDatabase.SaveAssets(); + } + + string pageName = Path.GetFileNameWithoutExtension(pageFiles[i]); + + //because this looks silly + if (pageName == primaryName && pageFiles.Count == 1) + pageName = "Material"; + + string materialPath = assetPath + "/" + primaryName + "_" + pageName + ".mat"; + Material mat = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)); + + if (mat == null) { + mat = new Material(Shader.Find(defaultShader)); + AssetDatabase.CreateAsset(mat, materialPath); + } else { + vestigialMaterials.Remove(mat); + } + + mat.mainTexture = texture; + EditorUtility.SetDirty(mat); + AssetDatabase.SaveAssets(); + + populatingMaterials.Add(mat); //atlasAsset.materials[i] = mat; + } + + atlasAsset.materials = populatingMaterials.ToArray(); + + for (int i = 0; i < vestigialMaterials.Count; i++) + AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(vestigialMaterials[i])); + + if (AssetDatabase.GetAssetPath(atlasAsset) == "") + AssetDatabase.CreateAsset(atlasAsset, atlasPath); + else + atlasAsset.Clear(); + + EditorUtility.SetDirty(atlasAsset); + AssetDatabase.SaveAssets(); + + if (pageFiles.Count != atlasAsset.materials.Length) + Debug.LogWarning(string.Format("{0} ::: Not all atlas pages were imported. If you rename your image files, please make sure you also edit the filenames specified in the atlas file.", atlasAsset.name)); + else + Debug.Log(string.Format("{0} ::: Imported with {1} material", atlasAsset.name, atlasAsset.materials.Length)); + + // Iterate regions and bake marked. + Atlas atlas = atlasAsset.GetAtlas(); + FieldInfo field = typeof(Atlas).GetField("regions", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.NonPublic); + List regions = (List)field.GetValue(atlas); + string atlasAssetPath = AssetDatabase.GetAssetPath(atlasAsset); + string atlasAssetDirPath = Path.GetDirectoryName(atlasAssetPath); + string bakedDirPath = Path.Combine(atlasAssetDirPath, atlasAsset.name); + + bool hasBakedRegions = false; + for (int i = 0; i < regions.Count; i++) { + AtlasRegion region = regions[i]; + string bakedPrefabPath = Path.Combine(bakedDirPath, SpineEditorUtilities.GetPathSafeName(region.name) + ".prefab").Replace("\\", "/"); + GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath(bakedPrefabPath, typeof(GameObject)); + if (prefab != null) { + BakeRegion(atlasAsset, region, false); + hasBakedRegions = true; + } + } + + if (hasBakedRegions) { + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + + protectFromStackGarbageCollection.Remove(atlasAsset); + return (AtlasAsset)AssetDatabase.LoadAssetAtPath(atlasPath, typeof(AtlasAsset)); + } + #endregion + + #region Bake Atlas Region + public static GameObject BakeRegion (AtlasAsset atlasAsset, AtlasRegion region, bool autoSave = true) { + Atlas atlas = atlasAsset.GetAtlas(); + string atlasAssetPath = AssetDatabase.GetAssetPath(atlasAsset); + string atlasAssetDirPath = Path.GetDirectoryName(atlasAssetPath); + string bakedDirPath = Path.Combine(atlasAssetDirPath, atlasAsset.name); + string bakedPrefabPath = Path.Combine(bakedDirPath, GetPathSafeName(region.name) + ".prefab").Replace("\\", "/"); + + GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath(bakedPrefabPath, typeof(GameObject)); + GameObject root; + Mesh mesh; + bool isNewPrefab = false; + + if (!Directory.Exists(bakedDirPath)) + Directory.CreateDirectory(bakedDirPath); + + if (prefab == null) { + root = new GameObject("temp", typeof(MeshFilter), typeof(MeshRenderer)); + prefab = PrefabUtility.CreatePrefab(bakedPrefabPath, root); + isNewPrefab = true; + Object.DestroyImmediate(root); + } + + mesh = (Mesh)AssetDatabase.LoadAssetAtPath(bakedPrefabPath, typeof(Mesh)); + + Material mat = null; + mesh = atlasAsset.GenerateMesh(region.name, mesh, out mat); + if (isNewPrefab) { + AssetDatabase.AddObjectToAsset(mesh, prefab); + prefab.GetComponent().sharedMesh = mesh; + } + + EditorUtility.SetDirty(mesh); + EditorUtility.SetDirty(prefab); + + if (autoSave) { + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + + prefab.GetComponent().sharedMaterial = mat; + + return prefab; + } + #endregion + + #region Import SkeletonData (json or binary) + public const string SkeletonDataSuffix = "_SkeletonData"; + static SkeletonDataAsset IngestSpineProject (TextAsset spineJson, params AtlasAsset[] atlasAssets) { + string primaryName = Path.GetFileNameWithoutExtension(spineJson.name); + string assetPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(spineJson)); + string filePath = assetPath + "/" + primaryName + SkeletonDataSuffix + ".asset"; + + #if SPINE_TK2D + if (spineJson != null) { + SkeletonDataAsset skeletonDataAsset = (SkeletonDataAsset)AssetDatabase.LoadAssetAtPath(filePath, typeof(SkeletonDataAsset)); + if (skeletonDataAsset == null) { + skeletonDataAsset = SkeletonDataAsset.CreateInstance(); + skeletonDataAsset.skeletonJSON = spineJson; + skeletonDataAsset.fromAnimation = new string[0]; + skeletonDataAsset.toAnimation = new string[0]; + skeletonDataAsset.duration = new float[0]; + skeletonDataAsset.defaultMix = defaultMix; + skeletonDataAsset.scale = defaultScale; + + AssetDatabase.CreateAsset(skeletonDataAsset, filePath); + AssetDatabase.SaveAssets(); + } else { + skeletonDataAsset.Clear(); + skeletonDataAsset.GetSkeletonData(true); + } + + return skeletonDataAsset; + } else { + EditorUtility.DisplayDialog("Error!", "Tried to ingest null Spine data.", "OK"); + return null; + } + + #else + if (spineJson != null && atlasAssets != null) { + SkeletonDataAsset skeletonDataAsset = (SkeletonDataAsset)AssetDatabase.LoadAssetAtPath(filePath, typeof(SkeletonDataAsset)); + if (skeletonDataAsset == null) { + skeletonDataAsset = ScriptableObject.CreateInstance(); { + skeletonDataAsset.atlasAssets = atlasAssets; + skeletonDataAsset.skeletonJSON = spineJson; + skeletonDataAsset.defaultMix = defaultMix; + skeletonDataAsset.scale = defaultScale; + } + + AssetDatabase.CreateAsset(skeletonDataAsset, filePath); + AssetDatabase.SaveAssets(); + } else { + skeletonDataAsset.atlasAssets = atlasAssets; + skeletonDataAsset.Clear(); + skeletonDataAsset.GetSkeletonData(true); + } + + return skeletonDataAsset; + } else { + EditorUtility.DisplayDialog("Error!", "Must specify both Spine JSON and AtlasAsset array", "OK"); + return null; + } + #endif + } + #endregion + + #region SkeletonDataFileValidator + internal static class SkeletonDataFileValidator { + static int[][] compatibleBinaryVersions = { new[] { 3, 6, 0 }, new[] { 3, 5, 0 } }; + static int[][] compatibleJsonVersions = { new[] { 3, 6, 0 }, new[] { 3, 7, 0 }, new[] { 3, 5, 0 } }; + //static bool isFixVersionRequired = false; + + public static bool CheckForValidSkeletonData (string skeletonJSONPath) { + string dir = Path.GetDirectoryName(skeletonJSONPath); + TextAsset textAsset = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonJSONPath, typeof(TextAsset)); + DirectoryInfo dirInfo = new DirectoryInfo(dir); + FileInfo[] files = dirInfo.GetFiles("*.asset"); + + foreach (var path in files) { + string localPath = dir + "/" + path.Name; + var obj = AssetDatabase.LoadAssetAtPath(localPath, typeof(Object)); + var skeletonDataAsset = obj as SkeletonDataAsset; + if (skeletonDataAsset != null && skeletonDataAsset.skeletonJSON == textAsset) + return true; + } + + return false; + } + + public static bool IsSpineData (TextAsset asset) { + if (asset == null) + return false; + + bool isSpineData = false; + string rawVersion = null; + + int[][] compatibleVersions; + if (asset.name.Contains(".skel")) { + try { + rawVersion = SkeletonBinary.GetVersionString(new MemoryStream(asset.bytes)); + isSpineData = !(string.IsNullOrEmpty(rawVersion)); + compatibleVersions = compatibleBinaryVersions; + } catch (System.Exception e) { + Debug.LogErrorFormat("Failed to read '{0}'. It is likely not a binary Spine SkeletonData file.\n{1}", asset.name, e); + return false; + } + } else { + object obj = Json.Deserialize(new StringReader(asset.text)); + if (obj == null) { + Debug.LogErrorFormat("'{0}' is not valid JSON.", asset.name); + return false; + } + + var root = obj as Dictionary; + if (root == null) { + Debug.LogError("Parser returned an incorrect type."); + return false; + } + + isSpineData = root.ContainsKey("skeleton"); + if (isSpineData) { + var skeletonInfo = (Dictionary)root["skeleton"]; + object jv; + skeletonInfo.TryGetValue("spine", out jv); + rawVersion = jv as string; + } + + compatibleVersions = compatibleJsonVersions; + } + + // Version warning + if (isSpineData) { + string primaryRuntimeVersionDebugString = compatibleVersions[0][0] + "." + compatibleVersions[0][1]; + + if (string.IsNullOrEmpty(rawVersion)) { + Debug.LogWarningFormat("Skeleton '{0}' has no version information. It may be incompatible with your runtime version: spine-unity v{1}", asset.name, primaryRuntimeVersionDebugString); + } else { + string[] versionSplit = rawVersion.Split('.'); + bool match = false; + foreach (var version in compatibleVersions) { + bool primaryMatch = version[0] == int.Parse(versionSplit[0]); + bool secondaryMatch = version[1] == int.Parse(versionSplit[1]); + + // if (isFixVersionRequired) secondaryMatch &= version[2] <= int.Parse(jsonVersionSplit[2]); + + if (primaryMatch && secondaryMatch) { + match = true; + break; + } + } + + if (!match) + Debug.LogWarningFormat("Skeleton '{0}' (exported with Spine {1}) may be incompatible with your runtime version: spine-unity v{2}", asset.name, rawVersion, primaryRuntimeVersionDebugString); + } + } + + return isSpineData; + } + } + + #endregion + + #region SkeletonAnimation Menu + public static void IngestAdvancedRenderSettings (SkeletonRenderer skeletonRenderer) { + const string PMAShaderQuery = "Spine/Skeleton"; + const string TintBlackShaderQuery = "Tint Black"; + + if (skeletonRenderer == null) return; + var skeletonDataAsset = skeletonRenderer.skeletonDataAsset; + if (skeletonDataAsset == null) return; + + bool pmaVertexColors = false; + bool tintBlack = false; + foreach (AtlasAsset atlasAsset in skeletonDataAsset.atlasAssets) { + if (!pmaVertexColors) { + foreach (Material m in atlasAsset.materials) { + if (m.shader.name.Contains(PMAShaderQuery)) { + pmaVertexColors = true; + break; + } + } + } + + if (!tintBlack) { + foreach (Material m in atlasAsset.materials) { + if (m.shader.name.Contains(TintBlackShaderQuery)) { + tintBlack = true; + break; + } + } + } + } + + skeletonRenderer.pmaVertexColors = pmaVertexColors; + skeletonRenderer.tintBlack = tintBlack; + } + + public static SkeletonAnimation InstantiateSkeletonAnimation (SkeletonDataAsset skeletonDataAsset, string skinName, bool destroyInvalid = true) { + var skeletonData = skeletonDataAsset.GetSkeletonData(true); + var skin = skeletonData != null ? skeletonData.FindSkin(skinName) : null; + return InstantiateSkeletonAnimation(skeletonDataAsset, skin, destroyInvalid); + } + + public static SkeletonAnimation InstantiateSkeletonAnimation (SkeletonDataAsset skeletonDataAsset, Skin skin = null, bool destroyInvalid = true) { + SkeletonData data = skeletonDataAsset.GetSkeletonData(true); + + if (data == null) { + for (int i = 0; i < skeletonDataAsset.atlasAssets.Length; i++) { + string reloadAtlasPath = AssetDatabase.GetAssetPath(skeletonDataAsset.atlasAssets[i]); + skeletonDataAsset.atlasAssets[i] = (AtlasAsset)AssetDatabase.LoadAssetAtPath(reloadAtlasPath, typeof(AtlasAsset)); + } + data = skeletonDataAsset.GetSkeletonData(false); + } + + if (data == null) { + Debug.LogWarning("InstantiateSkeletonAnimation tried to instantiate a skeleton from an invalid SkeletonDataAsset."); + return null; + } + + string spineGameObjectName = string.Format("Spine GameObject ({0})", skeletonDataAsset.name.Replace("_SkeletonData", "")); + GameObject go = new GameObject(spineGameObjectName, typeof(MeshFilter), typeof(MeshRenderer), typeof(SkeletonAnimation)); + SkeletonAnimation newSkeletonAnimation = go.GetComponent(); + newSkeletonAnimation.skeletonDataAsset = skeletonDataAsset; + IngestAdvancedRenderSettings(newSkeletonAnimation); + + try { + newSkeletonAnimation.Initialize(false); + } catch (System.Exception e) { + if (destroyInvalid) { + Debug.LogWarning("Editor-instantiated SkeletonAnimation threw an Exception. Destroying GameObject to prevent orphaned GameObject."); + GameObject.DestroyImmediate(go); + } + Debug.Log(e); + } + + // Set Defaults + bool noSkins = data.DefaultSkin == null && (data.Skins == null || data.Skins.Count == 0); // Support attachmentless/skinless SkeletonData. + skin = skin ?? data.DefaultSkin ?? (noSkins ? null : data.Skins.Items[0]); + if (skin != null) { + newSkeletonAnimation.initialSkinName = skin.Name; + newSkeletonAnimation.skeleton.SetSkin(skin); + } + + newSkeletonAnimation.zSpacing = defaultZSpacing; + + newSkeletonAnimation.skeleton.Update(0); + newSkeletonAnimation.state.Update(0); + newSkeletonAnimation.state.Apply(newSkeletonAnimation.skeleton); + newSkeletonAnimation.skeleton.UpdateWorldTransform(); + + return newSkeletonAnimation; + } + #endregion + + #region SkeletonAnimator + #if SPINE_SKELETONANIMATOR + static void UpdateMecanimClips (SkeletonDataAsset skeletonDataAsset) { + if (skeletonDataAsset.controller == null) + return; + + SkeletonBaker.GenerateMecanimAnimationClips(skeletonDataAsset); + } + + public static SkeletonAnimator InstantiateSkeletonAnimator (SkeletonDataAsset skeletonDataAsset, string skinName) { + return InstantiateSkeletonAnimator(skeletonDataAsset, skeletonDataAsset.GetSkeletonData(true).FindSkin(skinName)); + } + + public static SkeletonAnimator InstantiateSkeletonAnimator (SkeletonDataAsset skeletonDataAsset, Skin skin = null) { + string spineGameObjectName = string.Format("Spine Mecanim GameObject ({0})", skeletonDataAsset.name.Replace("_SkeletonData", "")); + GameObject go = new GameObject(spineGameObjectName, typeof(MeshFilter), typeof(MeshRenderer), typeof(Animator), typeof(SkeletonAnimator)); + + if (skeletonDataAsset.controller == null) { + SkeletonBaker.GenerateMecanimAnimationClips(skeletonDataAsset); + Debug.Log(string.Format("Mecanim controller was automatically generated and assigned for {0}", skeletonDataAsset.name)); + } + + go.GetComponent().runtimeAnimatorController = skeletonDataAsset.controller; + + SkeletonAnimator anim = go.GetComponent(); + anim.skeletonDataAsset = skeletonDataAsset; + IngestAdvancedRenderSettings(anim); + + SkeletonData data = skeletonDataAsset.GetSkeletonData(true); + if (data == null) { + for (int i = 0; i < skeletonDataAsset.atlasAssets.Length; i++) { + string reloadAtlasPath = AssetDatabase.GetAssetPath(skeletonDataAsset.atlasAssets[i]); + skeletonDataAsset.atlasAssets[i] = (AtlasAsset)AssetDatabase.LoadAssetAtPath(reloadAtlasPath, typeof(AtlasAsset)); + } + data = skeletonDataAsset.GetSkeletonData(true); + } + + // Set defaults + skin = skin ?? data.DefaultSkin ?? data.Skins.Items[0]; + anim.zSpacing = defaultZSpacing; + + anim.Initialize(false); + anim.skeleton.SetSkin(skin); + anim.initialSkinName = skin.Name; + + anim.skeleton.Update(0); + anim.skeleton.UpdateWorldTransform(); + anim.LateUpdate(); + + return anim; + } +#endif + #endregion + + #region SpineTK2DEditorUtility + internal static class SpineTK2DEditorUtility { + const string SPINE_TK2D_DEFINE = "SPINE_TK2D"; + + static bool IsInvalidGroup (BuildTargetGroup group) { + int gi = (int)group; + return + gi == 15 || gi == 16 + || + group == BuildTargetGroup.Unknown; + } + + internal static void EnableTK2D () { + bool added = false; + foreach (BuildTargetGroup group in System.Enum.GetValues(typeof(BuildTargetGroup))) { + if (IsInvalidGroup(group)) + continue; + + string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group); + if (!defines.Contains(SPINE_TK2D_DEFINE)) { + added = true; + if (defines.EndsWith(";", System.StringComparison.Ordinal)) + defines = defines + SPINE_TK2D_DEFINE; + else + defines = defines + ";" + SPINE_TK2D_DEFINE; + + PlayerSettings.SetScriptingDefineSymbolsForGroup(group, defines); + } + } + + if (added) { + Debug.LogWarning("Setting Scripting Define Symbol " + SPINE_TK2D_DEFINE); + } else { + Debug.LogWarning("Already Set Scripting Define Symbol " + SPINE_TK2D_DEFINE); + } + } + + + internal static void DisableTK2D () { + bool removed = false; + foreach (BuildTargetGroup group in System.Enum.GetValues(typeof(BuildTargetGroup))) { + if (IsInvalidGroup(group)) + continue; + + string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group); + if (defines.Contains(SPINE_TK2D_DEFINE)) { + removed = true; + if (defines.Contains(SPINE_TK2D_DEFINE + ";")) + defines = defines.Replace(SPINE_TK2D_DEFINE + ";", ""); + else + defines = defines.Replace(SPINE_TK2D_DEFINE, ""); + + PlayerSettings.SetScriptingDefineSymbolsForGroup(group, defines); + } + } + + if (removed) { + Debug.LogWarning("Removing Scripting Define Symbol " + SPINE_TK2D_DEFINE); + } else { + Debug.LogWarning("Already Removed Scripting Define Symbol " + SPINE_TK2D_DEFINE); + } + } + } + #endregion + + public static string GetPathSafeName (string name) { + foreach (char c in System.IO.Path.GetInvalidFileNameChars()) { // Doesn't handle more obscure file name limitations. + name = name.Replace(c, '_'); + } + return name; + } + } + + public static class SpineHandles { + internal static float handleScale = 1f; + public static Color BoneColor { get { return new Color(0.8f, 0.8f, 0.8f, 0.4f); } } + public static Color PathColor { get { return new Color(254/255f, 127/255f, 0); } } + public static Color TransformContraintColor { get { return new Color(170/255f, 226/255f, 35/255f); } } + public static Color IkColor { get { return new Color(228/255f,90/255f,43/255f); } } + public static Color PointColor { get { return new Color(1f, 1f, 0f, 1f); } } + + static Vector3[] _boneMeshVerts = { + new Vector3(0, 0, 0), + new Vector3(0.1f, 0.1f, 0), + new Vector3(1, 0, 0), + new Vector3(0.1f, -0.1f, 0) + }; + static Mesh _boneMesh; + public static Mesh BoneMesh { + get { + if (_boneMesh == null) { + _boneMesh = new Mesh { + vertices = _boneMeshVerts, + uv = new Vector2[4], + triangles = new [] { 0, 1, 2, 2, 3, 0 } + }; + _boneMesh.RecalculateBounds(); + _boneMesh.RecalculateNormals(); + } + return _boneMesh; + } + } + + static Mesh _arrowheadMesh; + public static Mesh ArrowheadMesh { + get { + if (_arrowheadMesh == null) { + _arrowheadMesh = new Mesh { + vertices = new [] { + new Vector3(0, 0), + new Vector3(-0.1f, 0.05f), + new Vector3(-0.1f, -0.05f) + }, + uv = new Vector2[3], + triangles = new [] { 0, 1, 2 } + }; + _arrowheadMesh.RecalculateBounds(); + _arrowheadMesh.RecalculateNormals(); + } + return _arrowheadMesh; + } + } + + static Material _boneMaterial; + static Material BoneMaterial { + get { + if (_boneMaterial == null) { + _boneMaterial = new Material(Shader.Find("Hidden/Spine/Bones")); + _boneMaterial.SetColor("_Color", SpineHandles.BoneColor); + } + + return _boneMaterial; + } + } + public static Material GetBoneMaterial () { + BoneMaterial.SetColor("_Color", SpineHandles.BoneColor); + return BoneMaterial; + } + + public static Material GetBoneMaterial (Color color) { + BoneMaterial.SetColor("_Color", color); + return BoneMaterial; + } + + static Material _ikMaterial; + public static Material IKMaterial { + get { + if (_ikMaterial == null) { + _ikMaterial = new Material(Shader.Find("Hidden/Spine/Bones")); + _ikMaterial.SetColor("_Color", SpineHandles.IkColor); + } + return _ikMaterial; + } + } + + static GUIStyle _boneNameStyle; + public static GUIStyle BoneNameStyle { + get { + if (_boneNameStyle == null) { + _boneNameStyle = new GUIStyle(EditorStyles.whiteMiniLabel) { + alignment = TextAnchor.MiddleCenter, + stretchWidth = true, + padding = new RectOffset(0, 0, 0, 0), + contentOffset = new Vector2(-5f, 0f) + }; + } + return _boneNameStyle; + } + } + + static GUIStyle _pathNameStyle; + public static GUIStyle PathNameStyle { + get { + if (_pathNameStyle == null) { + _pathNameStyle = new GUIStyle(SpineHandles.BoneNameStyle); + _pathNameStyle.normal.textColor = SpineHandles.PathColor; + } + return _pathNameStyle; + } + } + + static GUIStyle _pointNameStyle; + public static GUIStyle PointNameStyle { + get { + if (_pointNameStyle == null) { + _pointNameStyle = new GUIStyle(SpineHandles.BoneNameStyle); + _pointNameStyle.normal.textColor = SpineHandles.PointColor; + } + return _pointNameStyle; + } + } + + public static void DrawBoneNames (Transform transform, Skeleton skeleton, float positionScale = 1f) { + GUIStyle style = BoneNameStyle; + foreach (Bone b in skeleton.Bones) { + var pos = new Vector3(b.WorldX * positionScale, b.WorldY * positionScale, 0) + (new Vector3(b.A, b.C) * (b.Data.Length * 0.5f)); + pos = transform.TransformPoint(pos); + Handles.Label(pos, b.Data.Name, style); + } + } + + public static void DrawBones (Transform transform, Skeleton skeleton, float positionScale = 1f) { + float boneScale = 1.8f; // Draw the root bone largest; + DrawCrosshairs2D(skeleton.Bones.Items[0].GetWorldPosition(transform), 0.08f, positionScale); + + foreach (Bone b in skeleton.Bones) { + DrawBone(transform, b, boneScale, positionScale); + boneScale = 1f; + } + } + + static Vector3[] _boneWireBuffer = new Vector3[5]; + static Vector3[] GetBoneWireBuffer (Matrix4x4 m) { + for (int i = 0, n = _boneMeshVerts.Length; i < n; i++) + _boneWireBuffer[i] = m.MultiplyPoint(_boneMeshVerts[i]); + + _boneWireBuffer[4] = _boneWireBuffer[0]; // closed polygon. + return _boneWireBuffer; + } + public static void DrawBoneWireframe (Transform transform, Bone b, Color color, float skeletonRenderScale = 1f) { + Handles.color = color; + var pos = new Vector3(b.WorldX * skeletonRenderScale, b.WorldY * skeletonRenderScale, 0); + float length = b.Data.Length; + + if (length > 0) { + Quaternion rot = Quaternion.Euler(0, 0, b.WorldRotationX); + Vector3 scale = Vector3.one * length * b.WorldScaleX * skeletonRenderScale; + const float my = 1.5f; + scale.y *= (SpineHandles.handleScale + 1) * 0.5f; + scale.y = Mathf.Clamp(scale.x, -my * skeletonRenderScale, my * skeletonRenderScale); + Handles.DrawPolyLine(GetBoneWireBuffer(transform.localToWorldMatrix * Matrix4x4.TRS(pos, rot, scale))); + var wp = transform.TransformPoint(pos); + DrawBoneCircle(wp, color, transform.forward, skeletonRenderScale); + } else { + var wp = transform.TransformPoint(pos); + DrawBoneCircle(wp, color, transform.forward, skeletonRenderScale); + } + } + + public static void DrawBone (Transform transform, Bone b, float boneScale, float skeletonRenderScale = 1f) { + var pos = new Vector3(b.WorldX * skeletonRenderScale, b.WorldY * skeletonRenderScale, 0); + float length = b.Data.Length; + if (length > 0) { + Quaternion rot = Quaternion.Euler(0, 0, b.WorldRotationX); + Vector3 scale = Vector3.one * length * b.WorldScaleX * skeletonRenderScale; + const float my = 1.5f; + scale.y *= (SpineHandles.handleScale + 1f) * 0.5f; + scale.y = Mathf.Clamp(scale.x, -my * skeletonRenderScale, my * skeletonRenderScale); + SpineHandles.GetBoneMaterial().SetPass(0); + Graphics.DrawMeshNow(SpineHandles.BoneMesh, transform.localToWorldMatrix * Matrix4x4.TRS(pos, rot, scale)); + } else { + var wp = transform.TransformPoint(pos); + DrawBoneCircle(wp, SpineHandles.BoneColor, transform.forward, boneScale * skeletonRenderScale); + } + } + + public static void DrawBone (Transform transform, Bone b, float boneScale, Color color, float skeletonRenderScale = 1f) { + var pos = new Vector3(b.WorldX * skeletonRenderScale, b.WorldY * skeletonRenderScale, 0); + float length = b.Data.Length; + if (length > 0) { + Quaternion rot = Quaternion.Euler(0, 0, b.WorldRotationX); + Vector3 scale = Vector3.one * length * b.WorldScaleX; + const float my = 1.5f; + scale.y *= (SpineHandles.handleScale + 1f) * 0.5f; + scale.y = Mathf.Clamp(scale.x, -my, my); + SpineHandles.GetBoneMaterial(color).SetPass(0); + Graphics.DrawMeshNow(SpineHandles.BoneMesh, transform.localToWorldMatrix * Matrix4x4.TRS(pos, rot, scale)); + } else { + var wp = transform.TransformPoint(pos); + DrawBoneCircle(wp, color, transform.forward, boneScale * skeletonRenderScale); + } + } + + public static void DrawPaths (Transform transform, Skeleton skeleton) { + foreach (Slot s in skeleton.DrawOrder) { + var p = s.Attachment as PathAttachment; + if (p != null) SpineHandles.DrawPath(s, p, transform, true); + } + } + + static float[] pathVertexBuffer; + public static void DrawPath (Slot s, PathAttachment p, Transform t, bool includeName) { + int worldVerticesLength = p.WorldVerticesLength; + + if (pathVertexBuffer == null || pathVertexBuffer.Length < worldVerticesLength) + pathVertexBuffer = new float[worldVerticesLength]; + + float[] pv = pathVertexBuffer; + p.ComputeWorldVertices(s, pv); + + var ocolor = Handles.color; + Handles.color = SpineHandles.PathColor; + + Matrix4x4 m = t.localToWorldMatrix; + const int step = 6; + int n = worldVerticesLength - step; + Vector3 p0, p1, p2, p3; + for (int i = 2; i < n; i += step) { + p0 = m.MultiplyPoint(new Vector3(pv[i], pv[i+1])); + p1 = m.MultiplyPoint(new Vector3(pv[i+2], pv[i+3])); + p2 = m.MultiplyPoint(new Vector3(pv[i+4], pv[i+5])); + p3 = m.MultiplyPoint(new Vector3(pv[i+6], pv[i+7])); + DrawCubicBezier(p0, p1, p2, p3); + } + + n += step; + if (p.Closed) { + p0 = m.MultiplyPoint(new Vector3(pv[n - 4], pv[n - 3])); + p1 = m.MultiplyPoint(new Vector3(pv[n - 2], pv[n - 1])); + p2 = m.MultiplyPoint(new Vector3(pv[0], pv[1])); + p3 = m.MultiplyPoint(new Vector3(pv[2], pv[3])); + DrawCubicBezier(p0, p1, p2, p3); + } + + const float endCapSize = 0.05f; + Vector3 firstPoint = m.MultiplyPoint(new Vector3(pv[2], pv[3])); + SpineHandles.DrawDot(firstPoint, endCapSize); + + //if (!p.Closed) SpineHandles.DrawDot(m.MultiplyPoint(new Vector3(pv[n - 4], pv[n - 3])), endCapSize); + if (includeName) Handles.Label(firstPoint + new Vector3(0,0.1f), p.Name, PathNameStyle); + + Handles.color = ocolor; + } + + public static void DrawDot (Vector3 position, float size) { + Handles.DotHandleCap(0, position, Quaternion.identity, size * HandleUtility.GetHandleSize(position), EventType.Ignore); //Handles.DotCap(0, position, Quaternion.identity, size * HandleUtility.GetHandleSize(position)); + } + + public static void DrawBoundingBoxes (Transform transform, Skeleton skeleton) { + foreach (var slot in skeleton.Slots) { + var bba = slot.Attachment as BoundingBoxAttachment; + if (bba != null) SpineHandles.DrawBoundingBox(slot, bba, transform); + } + } + + public static void DrawBoundingBox (Slot slot, BoundingBoxAttachment box, Transform t) { + if (box.Vertices.Length <= 2) return; // Handle cases where user creates a BoundingBoxAttachment but doesn't actually define it. + + var worldVerts = new float[box.WorldVerticesLength]; + box.ComputeWorldVertices(slot, worldVerts); + + Handles.color = Color.green; + Vector3 lastVert = Vector3.zero; + Vector3 vert = Vector3.zero; + Vector3 firstVert = t.TransformPoint(new Vector3(worldVerts[0], worldVerts[1], 0)); + for (int i = 0; i < worldVerts.Length; i += 2) { + vert.x = worldVerts[i]; + vert.y = worldVerts[i + 1]; + vert.z = 0; + + vert = t.TransformPoint(vert); + + if (i > 0) + Handles.DrawLine(lastVert, vert); + + lastVert = vert; + } + + Handles.DrawLine(lastVert, firstVert); + } + + public static void DrawPointAttachment (Bone bone, PointAttachment pointAttachment, Transform skeletonTransform) { + if (bone == null) return; + if (pointAttachment == null) return; + + Vector2 localPos; + pointAttachment.ComputeWorldPosition(bone, out localPos.x, out localPos.y); + float localRotation = pointAttachment.ComputeWorldRotation(bone); + Matrix4x4 m = Matrix4x4.TRS(localPos, Quaternion.Euler(0, 0, localRotation), Vector3.one) * Matrix4x4.TRS(Vector3.right * 0.25f, Quaternion.identity, Vector3.one); + + DrawBoneCircle(skeletonTransform.TransformPoint(localPos), SpineHandles.PointColor, Vector3.back, 1.3f); + DrawArrowhead(skeletonTransform.localToWorldMatrix * m); + } + + public static void DrawConstraints (Transform transform, Skeleton skeleton, float skeletonRenderScale = 1f) { + Vector3 targetPos; + Vector3 pos; + bool active; + Color handleColor; + const float Thickness = 4f; + Vector3 normal = transform.forward; + + // Transform Constraints + handleColor = SpineHandles.TransformContraintColor; + foreach (var tc in skeleton.TransformConstraints) { + var targetBone = tc.Target; + targetPos = targetBone.GetWorldPosition(transform, skeletonRenderScale); + + if (tc.TranslateMix > 0) { + if (tc.TranslateMix != 1f) { + Handles.color = handleColor; + foreach (var b in tc.Bones) { + pos = b.GetWorldPosition(transform, skeletonRenderScale); + Handles.DrawDottedLine(targetPos, pos, Thickness); + } + } + SpineHandles.DrawBoneCircle(targetPos, handleColor, normal, 1.3f * skeletonRenderScale); + Handles.color = handleColor; + SpineHandles.DrawCrosshairs(targetPos, 0.2f, targetBone.A, targetBone.B, targetBone.C, targetBone.D, transform, skeletonRenderScale); + } + } + + // IK Constraints + handleColor = SpineHandles.IkColor; + foreach (var ikc in skeleton.IkConstraints) { + Bone targetBone = ikc.Target; + targetPos = targetBone.GetWorldPosition(transform, skeletonRenderScale); + var bones = ikc.Bones; + active = ikc.Mix > 0; + if (active) { + pos = bones.Items[0].GetWorldPosition(transform, skeletonRenderScale); + switch (bones.Count) { + case 1: { + Handles.color = handleColor; + Handles.DrawLine(targetPos, pos); + SpineHandles.DrawBoneCircle(targetPos, handleColor, normal); + var m = bones.Items[0].GetMatrix4x4(); + m.m03 = targetBone.WorldX * skeletonRenderScale; + m.m13 = targetBone.WorldY * skeletonRenderScale; + SpineHandles.DrawArrowhead(transform.localToWorldMatrix * m); + break; + } + case 2: { + Bone childBone = bones.Items[1]; + Vector3 child = childBone.GetWorldPosition(transform, skeletonRenderScale); + Handles.color = handleColor; + Handles.DrawLine(child, pos); + Handles.DrawLine(targetPos, child); + SpineHandles.DrawBoneCircle(pos, handleColor, normal, 0.5f); + SpineHandles.DrawBoneCircle(child, handleColor, normal, 0.5f); + SpineHandles.DrawBoneCircle(targetPos, handleColor, normal); + var m = childBone.GetMatrix4x4(); + m.m03 = targetBone.WorldX * skeletonRenderScale; + m.m13 = targetBone.WorldY * skeletonRenderScale; + SpineHandles.DrawArrowhead(transform.localToWorldMatrix * m); + break; + } + } + } + //Handles.Label(targetPos, ikc.Data.Name, SpineHandles.BoneNameStyle); + } + + // Path Constraints + handleColor = SpineHandles.PathColor; + foreach (var pc in skeleton.PathConstraints) { + active = pc.TranslateMix > 0; + if (active) + foreach (var b in pc.Bones) + SpineHandles.DrawBoneCircle(b.GetWorldPosition(transform, skeletonRenderScale), handleColor, normal, 1f * skeletonRenderScale); + } + } + + static void DrawCrosshairs2D (Vector3 position, float scale, float skeletonRenderScale = 1f) { + scale *= SpineHandles.handleScale * skeletonRenderScale; + Handles.DrawLine(position + new Vector3(-scale, 0), position + new Vector3(scale, 0)); + Handles.DrawLine(position + new Vector3(0, -scale), position + new Vector3(0, scale)); + } + + static void DrawCrosshairs (Vector3 position, float scale, float a, float b, float c, float d, Transform transform, float skeletonRenderScale = 1f) { + scale *= SpineHandles.handleScale * skeletonRenderScale; + + var xOffset = (Vector3)(new Vector2(a, c).normalized * scale); + var yOffset = (Vector3)(new Vector2(b, d).normalized * scale); + xOffset = transform.TransformDirection(xOffset); + yOffset = transform.TransformDirection(yOffset); + + Handles.DrawLine(position + xOffset, position - xOffset); + Handles.DrawLine(position + yOffset, position - yOffset); + } + + static void DrawArrowhead2D (Vector3 pos, float localRotation, float scale = 1f) { + scale *= SpineHandles.handleScale; + + SpineHandles.IKMaterial.SetPass(0); + Graphics.DrawMeshNow(SpineHandles.ArrowheadMesh, Matrix4x4.TRS(pos, Quaternion.Euler(0, 0, localRotation), new Vector3(scale, scale, scale))); + } + + static void DrawArrowhead (Vector3 pos, Quaternion worldQuaternion) { + Graphics.DrawMeshNow(SpineHandles.ArrowheadMesh, pos, worldQuaternion, 0); + } + + static void DrawArrowhead (Matrix4x4 m) { + float s = SpineHandles.handleScale; + m.m00 *= s; + m.m01 *= s; + m.m02 *= s; + m.m10 *= s; + m.m11 *= s; + m.m12 *= s; + m.m20 *= s; + m.m21 *= s; + m.m22 *= s; + + SpineHandles.IKMaterial.SetPass(0); + Graphics.DrawMeshNow(SpineHandles.ArrowheadMesh, m); + } + + static void DrawBoneCircle (Vector3 pos, Color outlineColor, Vector3 normal, float scale = 1f) { + scale *= SpineHandles.handleScale; + + Color o = Handles.color; + Handles.color = outlineColor; + float firstScale = 0.08f * scale; + Handles.DrawSolidDisc(pos, normal, firstScale); + const float Thickness = 0.03f; + float secondScale = firstScale - (Thickness * SpineHandles.handleScale * scale); + + if (secondScale > 0f) { + Handles.color = new Color(0.3f, 0.3f, 0.3f, 0.5f); + Handles.DrawSolidDisc(pos, normal, secondScale); + } + + Handles.color = o; + } + + internal static void DrawCubicBezier (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) { + Handles.DrawBezier(p0, p3, p1, p2, Handles.color, Texture2D.whiteTexture, 2f); + // const float dotSize = 0.01f; + // Quaternion q = Quaternion.identity; + // Handles.DotCap(0, p0, q, dotSize); + // Handles.DotCap(0, p1, q, dotSize); + // Handles.DotCap(0, p2, q, dotSize); + // Handles.DotCap(0, p3, q, dotSize); + // Handles.DrawLine(p0, p1); + // Handles.DrawLine(p3, p2); + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SpineEditorUtilities.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SpineEditorUtilities.cs.meta new file mode 100644 index 0000000..544e477 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SpineEditorUtilities.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f834d5cd806ec4645915ac315edbdc60 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Spine/Assets/spine-unity/Editor/SpineInspectorUtility.cs b/Assets/Spine/Assets/spine-unity/Editor/SpineInspectorUtility.cs new file mode 100644 index 0000000..312f6f8 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SpineInspectorUtility.cs @@ -0,0 +1,379 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Reflection; + +namespace Spine.Unity.Editor { + public static class SpineInspectorUtility { + + public static string Pluralize (int n, string singular, string plural) { + return n + " " + (n == 1 ? singular : plural); + } + + public static string PluralThenS (int n) { + return n == 1 ? "" : "s"; + } + + public static string EmDash { + get { return "\u2014"; } + } + + static GUIContent tempContent; + internal static GUIContent TempContent (string text, Texture2D image = null, string tooltip = null) { + if (tempContent == null) tempContent = new GUIContent(); + tempContent.text = text; + tempContent.image = image; + tempContent.tooltip = tooltip; + return tempContent; + } + + public static void PropertyFieldWideLabel (SerializedProperty property, GUIContent label = null, float minimumLabelWidth = 150) { + EditorGUIUtility.labelWidth = minimumLabelWidth; + EditorGUILayout.PropertyField(property, label ?? TempContent(property.displayName, null, property.tooltip)); + EditorGUIUtility.labelWidth = 0; // Resets to default + } + + public static void PropertyFieldFitLabel (SerializedProperty property, GUIContent label = null, float extraSpace = 5f) { + label = label ?? TempContent(property.displayName, null, property.tooltip); + float width = GUI.skin.label.CalcSize(TempContent(label.text)).x + extraSpace; + if (label.image != null) + width += EditorGUIUtility.singleLineHeight; + PropertyFieldWideLabel(property, label, width); + } + + /// Multi-edit-compatible version of EditorGUILayout.ToggleLeft(SerializedProperty) + public static void ToggleLeftLayout (SerializedProperty property, GUIContent label = null, float width = 120f) { + if (label == null) label = SpineInspectorUtility.TempContent(property.displayName, tooltip: property.tooltip); + + if (property.hasMultipleDifferentValues) { + bool previousShowMixedValue = EditorGUI.showMixedValue; + EditorGUI.showMixedValue = true; + + bool clicked = EditorGUILayout.ToggleLeft(label, property.boolValue, GUILayout.Width(width)); + if (clicked) property.boolValue = true; // Set all values to true when clicked. + + EditorGUI.showMixedValue = previousShowMixedValue; + } else { + property.boolValue = EditorGUILayout.ToggleLeft(label, property.boolValue, GUILayout.Width(width)); + } + } + + /// Multi-edit-compatible version of EditorGUILayout.ToggleLeft(SerializedProperty) + public static void ToggleLeft (Rect rect, SerializedProperty property, GUIContent label = null) { + if (label == null) label = SpineInspectorUtility.TempContent(property.displayName, tooltip: property.tooltip); + + if (property.hasMultipleDifferentValues) { + bool previousShowMixedValue = EditorGUI.showMixedValue; + EditorGUI.showMixedValue = true; + + bool clicked = EditorGUI.ToggleLeft(rect, label, property.boolValue); + if (clicked) property.boolValue = true; // Set all values to true when clicked. + + EditorGUI.showMixedValue = previousShowMixedValue; + } else { + property.boolValue = EditorGUI.ToggleLeft(rect, label, property.boolValue); + } + } + + public static bool UndoRedoPerformed (UnityEngine.Event current) { + return current.type == EventType.ValidateCommand && current.commandName == "UndoRedoPerformed"; + } + + public static Texture2D UnityIcon() { + return EditorGUIUtility.ObjectContent(null, typeof(T)).image as Texture2D; + } + + public static Texture2D UnityIcon(System.Type type) { + return EditorGUIUtility.ObjectContent(null, type).image as Texture2D; + } + + #region SerializedProperty Helpers + public static SerializedProperty FindBaseOrSiblingProperty (this SerializedProperty property, string propertyName) { + if (string.IsNullOrEmpty(propertyName)) return null; + + SerializedProperty relativeProperty = property.serializedObject.FindProperty(propertyName); // baseProperty + + // If base property is not found, look for the sibling property. + if (relativeProperty == null) { + string propertyPath = property.propertyPath; + int localPathLength = property.name.Length; + + string newPropertyPath = propertyPath.Remove(propertyPath.Length - localPathLength, localPathLength) + propertyName; + relativeProperty = property.serializedObject.FindProperty(newPropertyPath); + + // If a direct sibling property was not found, try to find the sibling of the array. + if (relativeProperty == null && property.isArray) { + int propertyPathLength = propertyPath.Length; + + int dotCount = 0; + const int SiblingOfListDotCount = 3; + for (int i = 1; i < propertyPathLength; i++) { + if (propertyPath[propertyPathLength - i] == '.') { + dotCount++; + if (dotCount >= SiblingOfListDotCount) { + localPathLength = i - 1; + break; + } + } + } + + newPropertyPath = propertyPath.Remove(propertyPath.Length - localPathLength, localPathLength) + propertyName; + relativeProperty = property.serializedObject.FindProperty(newPropertyPath); + } + } + + return relativeProperty; + } + #endregion + + #region Layout Scopes + static GUIStyle grayMiniLabel; + public static GUIStyle GrayMiniLabel { + get { + if (grayMiniLabel == null) { + grayMiniLabel = new GUIStyle(EditorStyles.centeredGreyMiniLabel); + grayMiniLabel.alignment = TextAnchor.UpperLeft; + } + return grayMiniLabel; + } + } + + public class LabelWidthScope : System.IDisposable { + public LabelWidthScope (float minimumLabelWidth = 190f) { + EditorGUIUtility.labelWidth = minimumLabelWidth; + } + + public void Dispose () { + EditorGUIUtility.labelWidth = 0f; + } + } + + public class IndentScope : System.IDisposable { + public IndentScope () { EditorGUI.indentLevel++; } + public void Dispose () { EditorGUI.indentLevel--; } + } + + public class BoxScope : System.IDisposable { + readonly bool indent; + + static GUIStyle boxScopeStyle; + public static GUIStyle BoxScopeStyle { + get { + if (boxScopeStyle == null) { + boxScopeStyle = new GUIStyle(EditorStyles.helpBox); + RectOffset p = boxScopeStyle.padding; // RectOffset is a class + p.right += 6; + p.top += 1; + p.left += 3; + } + + return boxScopeStyle; + } + } + + public BoxScope (bool indent = true) { + this.indent = indent; + EditorGUILayout.BeginVertical(BoxScopeStyle); + if (indent) EditorGUI.indentLevel++; + } + + public void Dispose () { + if (indent) EditorGUI.indentLevel--; + EditorGUILayout.EndVertical(); + } + } + #endregion + + #region Button + const float CenterButtonMaxWidth = 270f; + const float CenterButtonHeight = 35f; + static GUIStyle spineButtonStyle; + static GUIStyle SpineButtonStyle { + get { + if (spineButtonStyle == null) { + spineButtonStyle = new GUIStyle(GUI.skin.button); + spineButtonStyle.name = "Spine Button"; + spineButtonStyle.padding = new RectOffset(10, 10, 10, 10); + } + return spineButtonStyle; + } + } + + public static bool LargeCenteredButton (string label, bool sideSpace = true, float maxWidth = CenterButtonMaxWidth) { + if (sideSpace) { + bool clicked; + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.Space(); + clicked = GUILayout.Button(label, SpineButtonStyle, GUILayout.MaxWidth(maxWidth), GUILayout.Height(CenterButtonHeight)); + EditorGUILayout.Space(); + } + EditorGUILayout.Space(); + return clicked; + } else { + return GUILayout.Button(label, GUILayout.MaxWidth(CenterButtonMaxWidth), GUILayout.Height(CenterButtonHeight)); + } + } + + public static bool LargeCenteredButton (GUIContent content, bool sideSpace = true, float maxWidth = CenterButtonMaxWidth) { + if (sideSpace) { + bool clicked; + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.Space(); + clicked = GUILayout.Button(content, SpineButtonStyle, GUILayout.MaxWidth(maxWidth), GUILayout.Height(CenterButtonHeight)); + EditorGUILayout.Space(); + } + EditorGUILayout.Space(); + return clicked; + } else { + return GUILayout.Button(content, GUILayout.MaxWidth(CenterButtonMaxWidth), GUILayout.Height(CenterButtonHeight)); + } + } + + public static bool CenteredButton (GUIContent content, float height = 20f, bool sideSpace = true, float maxWidth = CenterButtonMaxWidth) { + if (sideSpace) { + bool clicked; + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.Space(); + clicked = GUILayout.Button(content, GUILayout.MaxWidth(maxWidth), GUILayout.Height(height)); + EditorGUILayout.Space(); + } + EditorGUILayout.Space(); + return clicked; + } else { + return GUILayout.Button(content, GUILayout.MaxWidth(maxWidth), GUILayout.Height(height)); + } + } + #endregion + + #region Multi-Editing Helpers + public static bool TargetsUseSameData (SerializedObject so) { + if (so.isEditingMultipleObjects) { + int n = so.targetObjects.Length; + var first = so.targetObjects[0] as IHasSkeletonDataAsset; + for (int i = 1; i < n; i++) { + var sr = so.targetObjects[i] as IHasSkeletonDataAsset; + if (sr != null && sr.SkeletonDataAsset != first.SkeletonDataAsset) + return false; + } + } + return true; + } + + public static SerializedObject GetRenderersSerializedObject (SerializedObject serializedObject) { + if (serializedObject.isEditingMultipleObjects) { + var renderers = new List(); + foreach (var o in serializedObject.targetObjects) { + var component = o as Component; + if (component != null) { + var renderer = component.GetComponent(); + if (renderer != null) + renderers.Add(renderer); + } + } + return new SerializedObject(renderers.ToArray()); + } else { + var component = serializedObject.targetObject as Component; + if (component != null) { + var renderer = component.GetComponent(); + if (renderer != null) + return new SerializedObject(renderer); + } + } + + return null; + } + #endregion + + #region Sorting Layer Field Helpers + static readonly GUIContent SortingLayerLabel = new GUIContent("Sorting Layer", "MeshRenderer.sortingLayerID"); + static readonly GUIContent OrderInLayerLabel = new GUIContent("Order in Layer", "MeshRenderer.sortingOrder"); + + static MethodInfo m_SortingLayerFieldMethod; + static MethodInfo SortingLayerFieldMethod { + get { + if (m_SortingLayerFieldMethod == null) + m_SortingLayerFieldMethod = typeof(EditorGUILayout).GetMethod("SortingLayerField", BindingFlags.Static | BindingFlags.NonPublic, null, new [] { typeof(GUIContent), typeof(SerializedProperty), typeof(GUIStyle) }, null); + + return m_SortingLayerFieldMethod; + } + } + + public struct SerializedSortingProperties { + public SerializedObject renderer; + public SerializedProperty sortingLayerID; + public SerializedProperty sortingOrder; + + public SerializedSortingProperties (Renderer r) : this(new SerializedObject(r)) {} + public SerializedSortingProperties (Object[] renderers) : this(new SerializedObject(renderers)) {} + + /// + /// Initializes a new instance of the + /// struct. + /// + /// SerializedObject of the renderer. Use + /// to easily generate this. + public SerializedSortingProperties (SerializedObject rendererSerializedObject) { + renderer = rendererSerializedObject; + sortingLayerID = renderer.FindProperty("m_SortingLayerID"); + sortingOrder = renderer.FindProperty("m_SortingOrder"); + } + + public void ApplyModifiedProperties () { + renderer.ApplyModifiedProperties(); + + // SetDirty + if (renderer.isEditingMultipleObjects) + foreach (var o in renderer.targetObjects) + EditorUtility.SetDirty(o); + else + EditorUtility.SetDirty(renderer.targetObject); + } + } + + public static void SortingPropertyFields (SerializedSortingProperties prop, bool applyModifiedProperties) { + if (applyModifiedProperties) + EditorGUI.BeginChangeCheck(); + + if (SpineInspectorUtility.SortingLayerFieldMethod != null && prop.sortingLayerID != null) + SpineInspectorUtility.SortingLayerFieldMethod.Invoke(null, new object[] { SortingLayerLabel, prop.sortingLayerID, EditorStyles.popup } ); + else + EditorGUILayout.PropertyField(prop.sortingLayerID); + + EditorGUILayout.PropertyField(prop.sortingOrder, OrderInLayerLabel); + + if (applyModifiedProperties && EditorGUI.EndChangeCheck()) + prop.ApplyModifiedProperties(); + } + #endregion + } +} diff --git a/Assets/Spine/Assets/spine-unity/Editor/SpineInspectorUtility.cs.meta b/Assets/Spine/Assets/spine-unity/Editor/SpineInspectorUtility.cs.meta new file mode 100644 index 0000000..3219ca0 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Editor/SpineInspectorUtility.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 663715b5714e2db499192c8d91ef1f86 +timeCreated: 1457404957 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/ISkeletonAnimation.cs b/Assets/Spine/Assets/spine-unity/ISkeletonAnimation.cs new file mode 100644 index 0000000..d1ab2ff --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/ISkeletonAnimation.cs @@ -0,0 +1,75 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine.Unity { + public delegate void UpdateBonesDelegate (ISkeletonAnimation animated); + + /// A Spine-Unity Component that animates a Skeleton but not necessarily with a Spine.AnimationState. + public interface ISkeletonAnimation { + event UpdateBonesDelegate UpdateLocal; + event UpdateBonesDelegate UpdateWorld; + event UpdateBonesDelegate UpdateComplete; + + //void LateUpdate (); + Skeleton Skeleton { get; } + } + + /// Holds a reference to a SkeletonDataAsset. + public interface IHasSkeletonDataAsset { + /// Gets the SkeletonDataAsset of the Spine Component. + SkeletonDataAsset SkeletonDataAsset { get; } + } + + /// A Spine-Unity Component that manages a Spine.Skeleton instance, instantiated from a SkeletonDataAsset. + public interface ISkeletonComponent { + /// Gets the SkeletonDataAsset of the Spine Component. + //[System.Obsolete] + SkeletonDataAsset SkeletonDataAsset { get; } + + /// Gets the Spine.Skeleton instance of the Spine Component. This is equivalent to SkeletonRenderer's .skeleton. + Skeleton Skeleton { get; } + } + + /// A Spine-Unity Component that uses a Spine.AnimationState to animate its skeleton. + public interface IAnimationStateComponent { + /// Gets the Spine.AnimationState of the animated Spine Component. This is equivalent to SkeletonAnimation.state. + AnimationState AnimationState { get; } + } + + /// A Spine-Unity Component that holds a reference to a SkeletonRenderer. + public interface IHasSkeletonRenderer { + SkeletonRenderer SkeletonRenderer { get; } + } + + /// A Spine-Unity Component that holds a reference to an ISkeletonComponent. + public interface IHasSkeletonComponent { + ISkeletonComponent SkeletonComponent { get; } + } +} diff --git a/Assets/Spine/Assets/spine-unity/ISkeletonAnimation.cs.meta b/Assets/Spine/Assets/spine-unity/ISkeletonAnimation.cs.meta new file mode 100644 index 0000000..68e421f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/ISkeletonAnimation.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a7b480b941568134891f411137bfbf55 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation.meta new file mode 100644 index 0000000..ae63350 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c5d065c4fe677ad4495a852580ec32fa +folderAsset: yes +timeCreated: 1455493477 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/DoubleBuffered.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/DoubleBuffered.cs new file mode 100644 index 0000000..c4dea80 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/DoubleBuffered.cs @@ -0,0 +1,46 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine.Unity { + public class DoubleBuffered where T : new() { + readonly T a = new T(); + readonly T b = new T(); + bool usingA; + + public T GetCurrent () { + return usingA ? a : b; + } + + public T GetNext () { + usingA = !usingA; + return usingA ? a : b; + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/DoubleBuffered.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/DoubleBuffered.cs.meta new file mode 100644 index 0000000..2e570e4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/DoubleBuffered.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 08b76da7751523448a87e528c48a5399 +timeCreated: 1457396939 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/SpineMesh.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/SpineMesh.cs new file mode 100644 index 0000000..e17812e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/SpineMesh.cs @@ -0,0 +1,1546 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Not for optimization. Do not disable. +#define SPINE_TRIANGLECHECK // Avoid calling SetTriangles at the cost of checking for mesh differences (vertex counts, memberwise attachment list compare) every frame. +//#define SPINE_DEBUG + +using UnityEngine; +using System; +using System.Collections.Generic; + +namespace Spine.Unity { + public static class SpineMesh { + internal const HideFlags MeshHideflags = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor; + + /// Factory method for creating a new mesh for use in Spine components. This can be called in field initializers. + public static Mesh NewSkeletonMesh () { + var m = new Mesh(); + m.MarkDynamic(); + m.name = "Skeleton Mesh"; + m.hideFlags = SpineMesh.MeshHideflags; + return m; + } + } + + /// Instructions for how to generate a mesh or submesh: "Render this skeleton's slots: start slot, up to but not including endSlot, using this material." + public struct SubmeshInstruction { + public Skeleton skeleton; + public int startSlot; + public int endSlot; + public Material material; + + public bool forceSeparate; + public int preActiveClippingSlotSource; + + #if SPINE_TRIANGLECHECK + // Cached values because they are determined in the process of generating instructions, + // but could otherwise be pulled from accessing attachments, checking materials and counting tris and verts. + public int rawTriangleCount; + public int rawVertexCount; + public int rawFirstVertexIndex; + public bool hasClipping; + #endif + + /// The number of slots in this SubmeshInstruction's range. Not necessarily the number of attachments. + public int SlotCount { get { return endSlot - startSlot; } } + + public override string ToString () { + return + string.Format("[SubmeshInstruction: slots {0} to {1}. (Material){2}. preActiveClippingSlotSource:{3}]", + startSlot, + endSlot - 1, + material == null ? "" : material.name, + preActiveClippingSlotSource + ); + } + } + + public delegate void MeshGeneratorDelegate (MeshGeneratorBuffers buffers); + + public struct MeshGeneratorBuffers { + /// The vertex count that will actually be used for the mesh. The Lengths of the buffer arrays may be larger than this number. + public int vertexCount; + + /// Vertex positions. To be used for UnityEngine.Mesh.vertices. + public Vector3[] vertexBuffer; + + /// Vertex UVs. To be used for UnityEngine.Mesh.uvs. + public Vector2[] uvBuffer; + + /// Vertex colors. To be used for UnityEngine.Mesh.colors32. + public Color32[] colorBuffer; + + /// The Spine rendering component's MeshGenerator. + public MeshGenerator meshGenerator; + } + + [System.Serializable] + public class MeshGenerator { + public Settings settings = Settings.Default; + + [System.Serializable] + public struct Settings { + public bool useClipping; + [Space] + [Range(-0.1f, 0f)] public float zSpacing; + [Space] + [Header("Vertex Data")] + public bool pmaVertexColors; + public bool tintBlack; + public bool calculateTangents; + public bool addNormals; + public bool immutableTriangles; + + static public Settings Default { + get { + return new Settings { + pmaVertexColors = true, + zSpacing = 0f, + useClipping = true, + tintBlack = false, + calculateTangents = false, + //renderMeshes = true, + addNormals = false, + immutableTriangles = false + }; + } + } + } + + const float BoundsMinDefault = float.PositiveInfinity; + const float BoundsMaxDefault = float.NegativeInfinity; + + [NonSerialized] readonly ExposedList vertexBuffer = new ExposedList(4); + [NonSerialized] readonly ExposedList uvBuffer = new ExposedList(4); + [NonSerialized] readonly ExposedList colorBuffer = new ExposedList(4); + [NonSerialized] readonly ExposedList> submeshes = new ExposedList> { new ExposedList(6) }; // start with 1 submesh. + + [NonSerialized] Vector2 meshBoundsMin, meshBoundsMax; + [NonSerialized] float meshBoundsThickness; + [NonSerialized] int submeshIndex = 0; + + [NonSerialized] SkeletonClipping clipper = new SkeletonClipping(); + [NonSerialized] float[] tempVerts = new float[8]; + [NonSerialized] int[] regionTriangles = { 0, 1, 2, 2, 3, 0 }; + + #region Optional Buffers + [NonSerialized] Vector3[] normals; + [NonSerialized] Vector4[] tangents; + [NonSerialized] Vector2[] tempTanBuffer; + [NonSerialized] ExposedList uv2; + [NonSerialized] ExposedList uv3; + #endregion + + public MeshGenerator () { + submeshes.TrimExcess(); + } + + public int VertexCount { get { return vertexBuffer.Count; } } + + public MeshGeneratorBuffers Buffers { + get { + return new MeshGeneratorBuffers { + vertexCount = this.VertexCount, + vertexBuffer = this.vertexBuffer.Items, + uvBuffer = this.uvBuffer.Items, + colorBuffer = this.colorBuffer.Items, + meshGenerator = this + }; + } + } + + #region Step 1 : Generate Instructions + public static void GenerateSingleSubmeshInstruction (SkeletonRendererInstruction instructionOutput, Skeleton skeleton, Material material) { + ExposedList drawOrder = skeleton.drawOrder; + int drawOrderCount = drawOrder.Count; + + // Clear last state of attachments and submeshes + instructionOutput.Clear(); // submeshInstructions.Clear(); attachments.Clear(); + var workingSubmeshInstructions = instructionOutput.submeshInstructions; + workingSubmeshInstructions.Resize(1); + + #if SPINE_TRIANGLECHECK + instructionOutput.attachments.Resize(drawOrderCount); + var workingAttachmentsItems = instructionOutput.attachments.Items; + int totalRawVertexCount = 0; + #endif + + var current = new SubmeshInstruction { + skeleton = skeleton, + preActiveClippingSlotSource = -1, + startSlot = 0, + #if SPINE_TRIANGLECHECK + rawFirstVertexIndex = 0, + #endif + material = material, + forceSeparate = false, + endSlot = drawOrderCount + }; + + #if SPINE_TRIANGLECHECK + bool skeletonHasClipping = false; + var drawOrderItems = drawOrder.Items; + for (int i = 0; i < drawOrderCount; i++) { + Slot slot = drawOrderItems[i]; + Attachment attachment = slot.attachment; + + workingAttachmentsItems[i] = attachment; + int attachmentTriangleCount; + int attachmentVertexCount; + + var regionAttachment = attachment as RegionAttachment; + if (regionAttachment != null) { + attachmentVertexCount = 4; + attachmentTriangleCount = 6; + } else { + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) { + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; + attachmentTriangleCount = meshAttachment.triangles.Length; + } else { + var clippingAttachment = attachment as ClippingAttachment; + if (clippingAttachment != null) { + current.hasClipping = true; + skeletonHasClipping = true; + } + attachmentVertexCount = 0; + attachmentTriangleCount = 0; + } + } + current.rawTriangleCount += attachmentTriangleCount; + current.rawVertexCount += attachmentVertexCount; + totalRawVertexCount += attachmentVertexCount; + + } + + instructionOutput.hasActiveClipping = skeletonHasClipping; + instructionOutput.rawVertexCount = totalRawVertexCount; + #endif + + workingSubmeshInstructions.Items[0] = current; + } + + public static void GenerateSkeletonRendererInstruction (SkeletonRendererInstruction instructionOutput, Skeleton skeleton, Dictionary customSlotMaterials, List separatorSlots, bool generateMeshOverride, bool immutableTriangles = false) { +// if (skeleton == null) throw new ArgumentNullException("skeleton"); +// if (instructionOutput == null) throw new ArgumentNullException("instructionOutput"); + + ExposedList drawOrder = skeleton.drawOrder; + int drawOrderCount = drawOrder.Count; + + // Clear last state of attachments and submeshes + instructionOutput.Clear(); // submeshInstructions.Clear(); attachments.Clear(); + var workingSubmeshInstructions = instructionOutput.submeshInstructions; + #if SPINE_TRIANGLECHECK + instructionOutput.attachments.Resize(drawOrderCount); + var workingAttachmentsItems = instructionOutput.attachments.Items; + int totalRawVertexCount = 0; + bool skeletonHasClipping = false; + #endif + + var current = new SubmeshInstruction { + skeleton = skeleton, + preActiveClippingSlotSource = -1 + }; + + #if !SPINE_TK2D + bool isCustomSlotMaterialsPopulated = customSlotMaterials != null && customSlotMaterials.Count > 0; + #endif + + int separatorCount = separatorSlots == null ? 0 : separatorSlots.Count; + bool hasSeparators = separatorCount > 0; + + int clippingAttachmentSource = -1; + int lastPreActiveClipping = -1; // The index of the last slot that had an active ClippingAttachment. + SlotData clippingEndSlot = null; + int submeshIndex = 0; + var drawOrderItems = drawOrder.Items; + for (int i = 0; i < drawOrderCount; i++) { + Slot slot = drawOrderItems[i]; + Attachment attachment = slot.attachment; + #if SPINE_TRIANGLECHECK + workingAttachmentsItems[i] = attachment; + int attachmentVertexCount = 0, attachmentTriangleCount = 0; + #endif + + object rendererObject = null; // An AtlasRegion in plain Spine-Unity. Spine-TK2D hooks into TK2D's system. eventual source of Material object. + bool noRender = false; // Using this allows empty slots as separators, and keeps separated parts more stable despite slots being reordered + + var regionAttachment = attachment as RegionAttachment; + if (regionAttachment != null) { + rendererObject = regionAttachment.RendererObject; + #if SPINE_TRIANGLECHECK + attachmentVertexCount = 4; + attachmentTriangleCount = 6; + #endif + } else { + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) { + rendererObject = meshAttachment.RendererObject; + #if SPINE_TRIANGLECHECK + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; + attachmentTriangleCount = meshAttachment.triangles.Length; + #endif + } else { + #if SPINE_TRIANGLECHECK + var clippingAttachment = attachment as ClippingAttachment; + if (clippingAttachment != null) { + clippingEndSlot = clippingAttachment.endSlot; + clippingAttachmentSource = i; + current.hasClipping = true; + skeletonHasClipping = true; + } + #endif + noRender = true; + } + } + + if (clippingEndSlot != null && slot.data == clippingEndSlot && i != clippingAttachmentSource) { + clippingEndSlot = null; + clippingAttachmentSource = -1; + } + + // Create a new SubmeshInstruction when material changes. (or when forced to separate by a submeshSeparator) + // Slot with a separator/new material will become the starting slot of the next new instruction. + if (hasSeparators) { //current.forceSeparate = hasSeparators && separatorSlots.Contains(slot); + current.forceSeparate = false; + for (int s = 0; s < separatorCount; s++) { + if (Slot.ReferenceEquals(slot, separatorSlots[s])) { + current.forceSeparate = true; + break; + } + } + } + + if (noRender) { + if (current.forceSeparate && generateMeshOverride) { // && current.rawVertexCount > 0) { + { // Add + current.endSlot = i; + current.preActiveClippingSlotSource = lastPreActiveClipping; + + workingSubmeshInstructions.Resize(submeshIndex + 1); + workingSubmeshInstructions.Items[submeshIndex] = current; + + submeshIndex++; + } + + current.startSlot = i; + lastPreActiveClipping = clippingAttachmentSource; + #if SPINE_TRIANGLECHECK + current.rawTriangleCount = 0; + current.rawVertexCount = 0; + current.rawFirstVertexIndex = totalRawVertexCount; + current.hasClipping = clippingAttachmentSource >= 0; + #endif + } + } else { + #if !SPINE_TK2D + Material material; + if (isCustomSlotMaterialsPopulated) { + if (!customSlotMaterials.TryGetValue(slot, out material)) + material = (Material)((AtlasRegion)rendererObject).page.rendererObject; + } else { + material = (Material)((AtlasRegion)rendererObject).page.rendererObject; + } + #else + Material material = (rendererObject is Material) ? (Material)rendererObject : (Material)((AtlasRegion)rendererObject).page.rendererObject; + #endif + + if (current.forceSeparate || (current.rawVertexCount > 0 && !System.Object.ReferenceEquals(current.material, material))) { // Material changed. Add the previous submesh. + { // Add + current.endSlot = i; + current.preActiveClippingSlotSource = lastPreActiveClipping; + + workingSubmeshInstructions.Resize(submeshIndex + 1); + workingSubmeshInstructions.Items[submeshIndex] = current; + submeshIndex++; + } + current.startSlot = i; + lastPreActiveClipping = clippingAttachmentSource; + #if SPINE_TRIANGLECHECK + current.rawTriangleCount = 0; + current.rawVertexCount = 0; + current.rawFirstVertexIndex = totalRawVertexCount; + current.hasClipping = clippingAttachmentSource >= 0; + #endif + } + + // Update state for the next Attachment. + current.material = material; + #if SPINE_TRIANGLECHECK + current.rawTriangleCount += attachmentTriangleCount; + current.rawVertexCount += attachmentVertexCount; + current.rawFirstVertexIndex = totalRawVertexCount; + totalRawVertexCount += attachmentVertexCount; + #endif + } + } + + if (current.rawVertexCount > 0) { + { // Add last or only submesh. + current.endSlot = drawOrderCount; + current.preActiveClippingSlotSource = lastPreActiveClipping; + current.forceSeparate = false; + + workingSubmeshInstructions.Resize(submeshIndex + 1); + workingSubmeshInstructions.Items[submeshIndex] = current; + //submeshIndex++; + } + } + + #if SPINE_TRIANGLECHECK + instructionOutput.hasActiveClipping = skeletonHasClipping; + instructionOutput.rawVertexCount = totalRawVertexCount; + #endif + instructionOutput.immutableTriangles = immutableTriangles; + } + + public static void TryReplaceMaterials (ExposedList workingSubmeshInstructions, Dictionary customMaterialOverride) { + // Material overrides are done here so they can be applied per submesh instead of per slot + // but they will still be passed through the GenerateMeshOverride delegate, + // and will still go through the normal material match check step in STEP 3. + var wsii = workingSubmeshInstructions.Items; + for (int i = 0; i < workingSubmeshInstructions.Count; i++) { + var m = wsii[i].material; + Material mo; + if (customMaterialOverride.TryGetValue(m, out mo)) + wsii[i].material = mo; + } + } + #endregion + + #region Step 2 : Populate vertex data and triangle index buffers. + public void Begin () { + vertexBuffer.Clear(false); + colorBuffer.Clear(false); + uvBuffer.Clear(false); + clipper.ClipEnd(); + + { + meshBoundsMin.x = BoundsMinDefault; + meshBoundsMin.y = BoundsMinDefault; + meshBoundsMax.x = BoundsMaxDefault; + meshBoundsMax.y = BoundsMaxDefault; + meshBoundsThickness = 0f; + } + + submeshIndex = 0; + submeshes.Count = 1; + //submeshes.Items[0].Clear(false); + } + + public void AddSubmesh (SubmeshInstruction instruction, bool updateTriangles = true) { + var settings = this.settings; + + int newCount = submeshIndex + 1; + if (submeshes.Items.Length < newCount) + submeshes.Resize(newCount); + submeshes.Count = newCount; + var submesh = submeshes.Items[submeshIndex]; + if (submesh == null) + submeshes.Items[submeshIndex] = submesh = new ExposedList(); + + submesh.Clear(false); + + var skeleton = instruction.skeleton; + var drawOrderItems = skeleton.drawOrder.Items; + + Color32 color = default(Color32); + float skeletonA = skeleton.a * 255, skeletonR = skeleton.r, skeletonG = skeleton.g, skeletonB = skeleton.b; + Vector2 meshBoundsMin = this.meshBoundsMin, meshBoundsMax = this.meshBoundsMax; + + // Settings + float zSpacing = settings.zSpacing; + bool pmaVertexColors = settings.pmaVertexColors; + bool tintBlack = settings.tintBlack; + #if SPINE_TRIANGLECHECK + bool useClipping = settings.useClipping && instruction.hasClipping; + #else + bool useClipping = settings.useClipping; + #endif + + if (useClipping) { + if (instruction.preActiveClippingSlotSource >= 0) { + var slot = drawOrderItems[instruction.preActiveClippingSlotSource]; + clipper.ClipStart(slot, slot.attachment as ClippingAttachment); + } + } + + for (int slotIndex = instruction.startSlot; slotIndex < instruction.endSlot; slotIndex++) { + var slot = drawOrderItems[slotIndex]; + var attachment = slot.attachment; + float z = zSpacing * slotIndex; + + var workingVerts = this.tempVerts; + float[] uvs; + int[] attachmentTriangleIndices; + int attachmentVertexCount; + int attachmentIndexCount; + + Color c = default(Color); + + // Identify and prepare values. + var region = attachment as RegionAttachment; + if (region != null) { + region.ComputeWorldVertices(slot.bone, workingVerts, 0); + uvs = region.uvs; + attachmentTriangleIndices = regionTriangles; + c.r = region.r; c.g = region.g; c.b = region.b; c.a = region.a; + attachmentVertexCount = 4; + attachmentIndexCount = 6; + } else { + var mesh = attachment as MeshAttachment; + if (mesh != null) { + int meshVerticesLength = mesh.worldVerticesLength; + if (workingVerts.Length < meshVerticesLength) { + workingVerts = new float[meshVerticesLength]; + this.tempVerts = workingVerts; + } + mesh.ComputeWorldVertices(slot, 0, meshVerticesLength, workingVerts, 0); //meshAttachment.ComputeWorldVertices(slot, tempVerts); + uvs = mesh.uvs; + attachmentTriangleIndices = mesh.triangles; + c.r = mesh.r; c.g = mesh.g; c.b = mesh.b; c.a = mesh.a; + attachmentVertexCount = meshVerticesLength >> 1; // meshVertexCount / 2; + attachmentIndexCount = mesh.triangles.Length; + } else { + if (useClipping) { + var clippingAttachment = attachment as ClippingAttachment; + if (clippingAttachment != null) { + clipper.ClipStart(slot, clippingAttachment); + continue; + } + } + + // If not any renderable attachment. + clipper.ClipEnd(slot); + continue; + } + } + + if (pmaVertexColors) { + color.a = (byte)(skeletonA * slot.a * c.a); + color.r = (byte)(skeletonR * slot.r * c.r * color.a); + color.g = (byte)(skeletonG * slot.g * c.g * color.a); + color.b = (byte)(skeletonB * slot.b * c.b * color.a); + if (slot.data.blendMode == BlendMode.Additive) color.a = 0; + } else { + color.a = (byte)(skeletonA * slot.a * c.a); + color.r = (byte)(skeletonR * slot.r * c.r * 255); + color.g = (byte)(skeletonG * slot.g * c.g * 255); + color.b = (byte)(skeletonB * slot.b * c.b * 255); + } + + if (useClipping && clipper.IsClipping) { + clipper.ClipTriangles(workingVerts, attachmentVertexCount << 1, attachmentTriangleIndices, attachmentIndexCount, uvs); + workingVerts = clipper.clippedVertices.Items; + attachmentVertexCount = clipper.clippedVertices.Count >> 1; + attachmentTriangleIndices = clipper.clippedTriangles.Items; + attachmentIndexCount = clipper.clippedTriangles.Count; + uvs = clipper.clippedUVs.Items; + } + + // Actually add slot/attachment data into buffers. + if (attachmentVertexCount != 0 && attachmentIndexCount != 0) { + if (tintBlack) + AddAttachmentTintBlack(slot.r2, slot.g2, slot.b2, attachmentVertexCount); + + //AddAttachment(workingVerts, uvs, color, attachmentTriangleIndices, attachmentVertexCount, attachmentIndexCount, ref meshBoundsMin, ref meshBoundsMax, z); + int ovc = vertexBuffer.Count; + // Add data to vertex buffers + { + int newVertexCount = ovc + attachmentVertexCount; + if (newVertexCount > vertexBuffer.Items.Length) { // Manual ExposedList.Resize() + Array.Resize(ref vertexBuffer.Items, newVertexCount); + Array.Resize(ref uvBuffer.Items, newVertexCount); + Array.Resize(ref colorBuffer.Items, newVertexCount); + } + vertexBuffer.Count = uvBuffer.Count = colorBuffer.Count = newVertexCount; + } + + var vbi = vertexBuffer.Items; + var ubi = uvBuffer.Items; + var cbi = colorBuffer.Items; + if (ovc == 0) { + for (int i = 0; i < attachmentVertexCount; i++) { + int vi = ovc + i; + int i2 = i << 1; // i * 2 + float x = workingVerts[i2]; + float y = workingVerts[i2 + 1]; + + vbi[vi].x = x; + vbi[vi].y = y; + vbi[vi].z = z; + ubi[vi].x = uvs[i2]; + ubi[vi].y = uvs[i2 + 1]; + cbi[vi] = color; + + // Calculate bounds. + if (x < meshBoundsMin.x) meshBoundsMin.x = x; + if (x > meshBoundsMax.x) meshBoundsMax.x = x; + if (y < meshBoundsMin.y) meshBoundsMin.y = y; + if (y > meshBoundsMax.y) meshBoundsMax.y = y; + } + } else { + for (int i = 0; i < attachmentVertexCount; i++) { + int vi = ovc + i; + int i2 = i << 1; // i * 2 + float x = workingVerts[i2]; + float y = workingVerts[i2 + 1]; + + vbi[vi].x = x; + vbi[vi].y = y; + vbi[vi].z = z; + ubi[vi].x = uvs[i2]; + ubi[vi].y = uvs[i2 + 1]; + cbi[vi] = color; + + // Calculate bounds. + if (x < meshBoundsMin.x) meshBoundsMin.x = x; + else if (x > meshBoundsMax.x) meshBoundsMax.x = x; + if (y < meshBoundsMin.y) meshBoundsMin.y = y; + else if (y > meshBoundsMax.y) meshBoundsMax.y = y; + } + } + + + // Add data to triangle buffer + if (updateTriangles) { + int oldTriangleCount = submesh.Count; + { //submesh.Resize(oldTriangleCount + attachmentIndexCount); + int newTriangleCount = oldTriangleCount + attachmentIndexCount; + if (newTriangleCount > submesh.Items.Length) Array.Resize(ref submesh.Items, newTriangleCount); + submesh.Count = newTriangleCount; + } + var submeshItems = submesh.Items; + for (int i = 0; i < attachmentIndexCount; i++) + submeshItems[oldTriangleCount + i] = attachmentTriangleIndices[i] + ovc; + } + } + + clipper.ClipEnd(slot); + } + clipper.ClipEnd(); + + this.meshBoundsMin = meshBoundsMin; + this.meshBoundsMax = meshBoundsMax; + meshBoundsThickness = instruction.endSlot * zSpacing; + + // Trim or zero submesh triangles. + var currentSubmeshItems = submesh.Items; + for (int i = submesh.Count, n = currentSubmeshItems.Length; i < n; i++) + currentSubmeshItems[i] = 0; + + submeshIndex++; // Next AddSubmesh will use a new submeshIndex value. + } + + public void BuildMesh (SkeletonRendererInstruction instruction, bool updateTriangles) { + var wsii = instruction.submeshInstructions.Items; + for (int i = 0, n = instruction.submeshInstructions.Count; i < n; i++) + this.AddSubmesh(wsii[i], updateTriangles); + } + + // Use this faster method when no clipping is involved. + public void BuildMeshWithArrays (SkeletonRendererInstruction instruction, bool updateTriangles) { + var settings = this.settings; + int totalVertexCount = instruction.rawVertexCount; + + // Add data to vertex buffers + { + if (totalVertexCount > vertexBuffer.Items.Length) { // Manual ExposedList.Resize() + Array.Resize(ref vertexBuffer.Items, totalVertexCount); + Array.Resize(ref uvBuffer.Items, totalVertexCount); + Array.Resize(ref colorBuffer.Items, totalVertexCount); + } + vertexBuffer.Count = uvBuffer.Count = colorBuffer.Count = totalVertexCount; + } + + // Populate Verts + Color32 color = default(Color32); + + int vertexIndex = 0; + var tempVerts = this.tempVerts; + Vector3 bmin = this.meshBoundsMin; + Vector3 bmax = this.meshBoundsMax; + + var vbi = vertexBuffer.Items; + var ubi = uvBuffer.Items; + var cbi = colorBuffer.Items; + int lastSlotIndex = 0; + + // drawOrder[endSlot] is excluded + for (int si = 0, n = instruction.submeshInstructions.Count; si < n; si++) { + var submesh = instruction.submeshInstructions.Items[si]; + var skeleton = submesh.skeleton; + var skeletonDrawOrderItems = skeleton.drawOrder.Items; + float a = skeleton.a * 255, r = skeleton.r, g = skeleton.g, b = skeleton.b; + + int endSlot = submesh.endSlot; + int startSlot = submesh.startSlot; + lastSlotIndex = endSlot; + + if (settings.tintBlack) { + Vector2 rg, b2; + int vi = vertexIndex; + b2.y = 1f; + + { + if (uv2 == null) { + uv2 = new ExposedList(); + uv3 = new ExposedList(); + } + if (totalVertexCount > uv2.Items.Length) { // Manual ExposedList.Resize() + Array.Resize(ref uv2.Items, totalVertexCount); + Array.Resize(ref uv3.Items, totalVertexCount); + } + uv2.Count = uv3.Count = totalVertexCount; + } + + var uv2i = uv2.Items; + var uv3i = uv3.Items; + + for (int slotIndex = startSlot; slotIndex < endSlot; slotIndex++) { + var slot = skeletonDrawOrderItems[slotIndex]; + var attachment = slot.attachment; + + rg.x = slot.r2; //r + rg.y = slot.g2; //g + b2.x = slot.b2; //b + + var regionAttachment = attachment as RegionAttachment; + if (regionAttachment != null) { + uv2i[vi] = rg; uv2i[vi + 1] = rg; uv2i[vi + 2] = rg; uv2i[vi + 3] = rg; + uv3i[vi] = b2; uv3i[vi + 1] = b2; uv3i[vi + 2] = b2; uv3i[vi + 3] = b2; + vi += 4; + } else { //} if (settings.renderMeshes) { + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) { + int meshVertexCount = meshAttachment.worldVerticesLength; + for (int iii = 0; iii < meshVertexCount; iii += 2) { + uv2i[vi] = rg; + uv3i[vi] = b2; + vi++; + } + } + } + } + } + + for (int slotIndex = startSlot; slotIndex < endSlot; slotIndex++) { + var slot = skeletonDrawOrderItems[slotIndex]; + var attachment = slot.attachment; + float z = slotIndex * settings.zSpacing; + + var regionAttachment = attachment as RegionAttachment; + if (regionAttachment != null) { + regionAttachment.ComputeWorldVertices(slot.bone, tempVerts, 0); + + float x1 = tempVerts[RegionAttachment.BLX], y1 = tempVerts[RegionAttachment.BLY]; + float x2 = tempVerts[RegionAttachment.ULX], y2 = tempVerts[RegionAttachment.ULY]; + float x3 = tempVerts[RegionAttachment.URX], y3 = tempVerts[RegionAttachment.URY]; + float x4 = tempVerts[RegionAttachment.BRX], y4 = tempVerts[RegionAttachment.BRY]; + vbi[vertexIndex].x = x1; vbi[vertexIndex].y = y1; vbi[vertexIndex].z = z; + vbi[vertexIndex + 1].x = x4; vbi[vertexIndex + 1].y = y4; vbi[vertexIndex + 1].z = z; + vbi[vertexIndex + 2].x = x2; vbi[vertexIndex + 2].y = y2; vbi[vertexIndex + 2].z = z; + vbi[vertexIndex + 3].x = x3; vbi[vertexIndex + 3].y = y3; vbi[vertexIndex + 3].z = z; + + if (settings.pmaVertexColors) { + color.a = (byte)(a * slot.a * regionAttachment.a); + color.r = (byte)(r * slot.r * regionAttachment.r * color.a); + color.g = (byte)(g * slot.g * regionAttachment.g * color.a); + color.b = (byte)(b * slot.b * regionAttachment.b * color.a); + if (slot.data.blendMode == BlendMode.Additive) color.a = 0; + } else { + color.a = (byte)(a * slot.a * regionAttachment.a); + color.r = (byte)(r * slot.r * regionAttachment.r * 255); + color.g = (byte)(g * slot.g * regionAttachment.g * 255); + color.b = (byte)(b * slot.b * regionAttachment.b * 255); + } + + cbi[vertexIndex] = color; cbi[vertexIndex + 1] = color; cbi[vertexIndex + 2] = color; cbi[vertexIndex + 3] = color; + + float[] regionUVs = regionAttachment.uvs; + ubi[vertexIndex].x = regionUVs[RegionAttachment.BLX]; ubi[vertexIndex].y = regionUVs[RegionAttachment.BLY]; + ubi[vertexIndex + 1].x = regionUVs[RegionAttachment.BRX]; ubi[vertexIndex + 1].y = regionUVs[RegionAttachment.BRY]; + ubi[vertexIndex + 2].x = regionUVs[RegionAttachment.ULX]; ubi[vertexIndex + 2].y = regionUVs[RegionAttachment.ULY]; + ubi[vertexIndex + 3].x = regionUVs[RegionAttachment.URX]; ubi[vertexIndex + 3].y = regionUVs[RegionAttachment.URY]; + + if (x1 < bmin.x) bmin.x = x1; // Potential first attachment bounds initialization. Initial min should not block initial max. Same for Y below. + if (x1 > bmax.x) bmax.x = x1; + if (x2 < bmin.x) bmin.x = x2; + else if (x2 > bmax.x) bmax.x = x2; + if (x3 < bmin.x) bmin.x = x3; + else if (x3 > bmax.x) bmax.x = x3; + if (x4 < bmin.x) bmin.x = x4; + else if (x4 > bmax.x) bmax.x = x4; + + if (y1 < bmin.y) bmin.y = y1; + if (y1 > bmax.y) bmax.y = y1; + if (y2 < bmin.y) bmin.y = y2; + else if (y2 > bmax.y) bmax.y = y2; + if (y3 < bmin.y) bmin.y = y3; + else if (y3 > bmax.y) bmax.y = y3; + if (y4 < bmin.y) bmin.y = y4; + else if (y4 > bmax.y) bmax.y = y4; + + vertexIndex += 4; + } else { //if (settings.renderMeshes) { + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) { + int meshVertexCount = meshAttachment.worldVerticesLength; + if (tempVerts.Length < meshVertexCount) this.tempVerts = tempVerts = new float[meshVertexCount]; + meshAttachment.ComputeWorldVertices(slot, tempVerts); + + if (settings.pmaVertexColors) { + color.a = (byte)(a * slot.a * meshAttachment.a); + color.r = (byte)(r * slot.r * meshAttachment.r * color.a); + color.g = (byte)(g * slot.g * meshAttachment.g * color.a); + color.b = (byte)(b * slot.b * meshAttachment.b * color.a); + if (slot.data.blendMode == BlendMode.Additive) color.a = 0; + } else { + color.a = (byte)(a * slot.a * meshAttachment.a); + color.r = (byte)(r * slot.r * meshAttachment.r * 255); + color.g = (byte)(g * slot.g * meshAttachment.g * 255); + color.b = (byte)(b * slot.b * meshAttachment.b * 255); + } + + float[] attachmentUVs = meshAttachment.uvs; + + // Potential first attachment bounds initialization. See conditions in RegionAttachment logic. + if (vertexIndex == 0) { + // Initial min should not block initial max. + // vi == vertexIndex does not always mean the bounds are fresh. It could be a submesh. Do not nuke old values by omitting the check. + // Should know that this is the first attachment in the submesh. slotIndex == startSlot could be an empty slot. + float fx = tempVerts[0], fy = tempVerts[1]; + if (fx < bmin.x) bmin.x = fx; + if (fx > bmax.x) bmax.x = fx; + if (fy < bmin.y) bmin.y = fy; + if (fy > bmax.y) bmax.y = fy; + } + + for (int iii = 0; iii < meshVertexCount; iii += 2) { + float x = tempVerts[iii], y = tempVerts[iii + 1]; + vbi[vertexIndex].x = x; vbi[vertexIndex].y = y; vbi[vertexIndex].z = z; + cbi[vertexIndex] = color; ubi[vertexIndex].x = attachmentUVs[iii]; ubi[vertexIndex].y = attachmentUVs[iii + 1]; + + if (x < bmin.x) bmin.x = x; + else if (x > bmax.x) bmax.x = x; + + if (y < bmin.y) bmin.y = y; + else if (y > bmax.y) bmax.y = y; + + vertexIndex++; + } + } + } + } + } + + this.meshBoundsMin = bmin; + this.meshBoundsMax = bmax; + this.meshBoundsThickness = lastSlotIndex * settings.zSpacing; + + int submeshInstructionCount = instruction.submeshInstructions.Count; + submeshes.Count = submeshInstructionCount; + + // Add triangles + if (updateTriangles) { + // Match submesh buffers count with submeshInstruction count. + if (this.submeshes.Items.Length < submeshInstructionCount) { + this.submeshes.Resize(submeshInstructionCount); + for (int i = 0, n = submeshInstructionCount; i < n; i++) { + var submeshBuffer = this.submeshes.Items[i]; + if (submeshBuffer == null) + this.submeshes.Items[i] = new ExposedList(); + else + submeshBuffer.Clear(false); + } + } + + var submeshInstructionsItems = instruction.submeshInstructions.Items; // This relies on the resize above. + + // Fill the buffers. + int attachmentFirstVertex = 0; + for (int smbi = 0; smbi < submeshInstructionCount; smbi++) { + var submeshInstruction = submeshInstructionsItems[smbi]; + var currentSubmeshBuffer = this.submeshes.Items[smbi]; + { //submesh.Resize(submesh.rawTriangleCount); + int newTriangleCount = submeshInstruction.rawTriangleCount; + if (newTriangleCount > currentSubmeshBuffer.Items.Length) + Array.Resize(ref currentSubmeshBuffer.Items, newTriangleCount); + else if (newTriangleCount < currentSubmeshBuffer.Items.Length) { + // Zero the extra. + var sbi = currentSubmeshBuffer.Items; + for (int ei = newTriangleCount, nn = sbi.Length; ei < nn; ei++) + sbi[ei] = 0; + } + currentSubmeshBuffer.Count = newTriangleCount; + } + + var tris = currentSubmeshBuffer.Items; + int triangleIndex = 0; + var skeleton = submeshInstruction.skeleton; + var skeletonDrawOrderItems = skeleton.drawOrder.Items; + for (int a = submeshInstruction.startSlot, endSlot = submeshInstruction.endSlot; a < endSlot; a++) { + var attachment = skeletonDrawOrderItems[a].attachment; + if (attachment is RegionAttachment) { + tris[triangleIndex] = attachmentFirstVertex; + tris[triangleIndex + 1] = attachmentFirstVertex + 2; + tris[triangleIndex + 2] = attachmentFirstVertex + 1; + tris[triangleIndex + 3] = attachmentFirstVertex + 2; + tris[triangleIndex + 4] = attachmentFirstVertex + 3; + tris[triangleIndex + 5] = attachmentFirstVertex + 1; + triangleIndex += 6; + attachmentFirstVertex += 4; + continue; + } + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) { + int[] attachmentTriangles = meshAttachment.triangles; + for (int ii = 0, nn = attachmentTriangles.Length; ii < nn; ii++, triangleIndex++) + tris[triangleIndex] = attachmentFirstVertex + attachmentTriangles[ii]; + attachmentFirstVertex += meshAttachment.worldVerticesLength >> 1; // length/2; + } + } + } + } + } + + public void ScaleVertexData (float scale) { + var vbi = vertexBuffer.Items; + for (int i = 0, n = vertexBuffer.Count; i < n; i++) { + vbi[i] *= scale; // vbi[i].x *= scale; vbi[i].y *= scale; + } + + meshBoundsMin *= scale; + meshBoundsMax *= scale; + meshBoundsThickness *= scale; + } + + void AddAttachmentTintBlack (float r2, float g2, float b2, int vertexCount) { + var rg = new Vector2(r2, g2); + var bo = new Vector2(b2, 1f); + + int ovc = vertexBuffer.Count; + int newVertexCount = ovc + vertexCount; + { + if (uv2 == null) { + uv2 = new ExposedList(); + uv3 = new ExposedList(); + } + if (newVertexCount > uv2.Items.Length) { // Manual ExposedList.Resize() + Array.Resize(ref uv2.Items, newVertexCount); + Array.Resize(ref uv3.Items, newVertexCount); + } + uv2.Count = uv3.Count = newVertexCount; + } + + var uv2i = uv2.Items; + var uv3i = uv3.Items; + for (int i = 0; i < vertexCount; i++) { + uv2i[ovc + i] = rg; + uv3i[ovc + i] = bo; + } + } + #endregion + + #region Step 3 : Transfer vertex and triangle data to UnityEngine.Mesh + public void FillVertexData (Mesh mesh) { + var vbi = vertexBuffer.Items; + var ubi = uvBuffer.Items; + var cbi = colorBuffer.Items; + + // Zero the extra. + { + int listCount = vertexBuffer.Count; + int arrayLength = vertexBuffer.Items.Length; + var vector3zero = Vector3.zero; + for (int i = listCount; i < arrayLength; i++) + vbi[i] = vector3zero; + } + + // Set the vertex buffer. + { + mesh.vertices = vbi; + mesh.uv = ubi; + mesh.colors32 = cbi; + + if (float.IsInfinity(meshBoundsMin.x)) { // meshBoundsMin.x == BoundsMinDefault // == doesn't work on float Infinity constants. + mesh.bounds = new Bounds(); + } else { + //mesh.bounds = ArraysMeshGenerator.ToBounds(meshBoundsMin, meshBoundsMax); + Vector2 halfSize = (meshBoundsMax - meshBoundsMin) * 0.5f; + mesh.bounds = new Bounds { + center = (Vector3)(meshBoundsMin + halfSize), + extents = new Vector3(halfSize.x, halfSize.y, meshBoundsThickness * 0.5f) + }; + } + } + + { + int vertexCount = this.vertexBuffer.Count; + if (settings.addNormals) { + int oldLength = 0; + + if (normals == null) + normals = new Vector3[vertexCount]; + else + oldLength = normals.Length; + + if (oldLength < vertexCount) { + Array.Resize(ref this.normals, vertexCount); + var localNormals = this.normals; + for (int i = oldLength; i < vertexCount; i++) localNormals[i] = Vector3.back; + } + mesh.normals = this.normals; + } + + if (settings.tintBlack) { + if (uv2 != null) { + mesh.uv2 = this.uv2.Items; + mesh.uv3 = this.uv3.Items; + } + } + } + } + + public void FillLateVertexData (Mesh mesh) { + if (settings.calculateTangents) { + int vertexCount = this.vertexBuffer.Count; + var sbi = submeshes.Items; + int submeshCount = submeshes.Count; + var vbi = vertexBuffer.Items; + var ubi = uvBuffer.Items; + + MeshGenerator.SolveTangents2DEnsureSize(ref this.tangents, ref this.tempTanBuffer, vertexCount); + for (int i = 0; i < submeshCount; i++) { + var submesh = sbi[i].Items; + int triangleCount = sbi[i].Count; + MeshGenerator.SolveTangents2DTriangles(this.tempTanBuffer, submesh, triangleCount, vbi, ubi, vertexCount); + } + MeshGenerator.SolveTangents2DBuffer(this.tangents, this.tempTanBuffer, vertexCount); + mesh.tangents = this.tangents; + } + } + + public void FillTriangles (Mesh mesh) { + int submeshCount = submeshes.Count; + var submeshesItems = submeshes.Items; + mesh.subMeshCount = submeshCount; + + for (int i = 0; i < submeshCount; i++) + mesh.SetTriangles(submeshesItems[i].Items, i, false); + } + + public void FillTrianglesSingle (Mesh mesh) { + mesh.SetTriangles(submeshes.Items[0].Items, 0, false); + } + #endregion + + public void EnsureVertexCapacity (int minimumVertexCount, bool inlcudeTintBlack = false, bool includeTangents = false, bool includeNormals = false) { + if (minimumVertexCount > vertexBuffer.Items.Length) { + Array.Resize(ref vertexBuffer.Items, minimumVertexCount); + Array.Resize(ref uvBuffer.Items, minimumVertexCount); + Array.Resize(ref colorBuffer.Items, minimumVertexCount); + + if (inlcudeTintBlack) { + if (uv2 == null) { + uv2 = new ExposedList(minimumVertexCount); + uv3 = new ExposedList(minimumVertexCount); + } + uv2.Resize(minimumVertexCount); + uv3.Resize(minimumVertexCount); + } + + if (includeNormals) { + if (normals == null) + normals = new Vector3[minimumVertexCount]; + else + Array.Resize(ref normals, minimumVertexCount); + + } + + if (includeTangents) { + if (tangents == null) + tangents = new Vector4[minimumVertexCount]; + else + Array.Resize(ref tangents, minimumVertexCount); + } + } + //vertexBuffer.Count = uvBuffer.Count = colorBuffer.Count = minimumVertexCount; + } + + public void TrimExcess () { + vertexBuffer.TrimExcess(); + uvBuffer.TrimExcess(); + colorBuffer.TrimExcess(); + + if (uv2 != null) uv2.TrimExcess(); + if (uv3 != null) uv3.TrimExcess(); + + int count = vertexBuffer.Count; + if (normals != null) Array.Resize(ref normals, count); + if (tangents != null) Array.Resize(ref tangents, count); + } + + #region TangentSolver2D + // Thanks to contributions from forum user ToddRivers + + /// Step 1 of solving tangents. Ensure you have buffers of the correct size. + /// Eventual Vector4[] tangent buffer to assign to Mesh.tangents. + /// Temporary Vector2 buffer for calculating directions. + /// Number of vertices that require tangents (or the size of the vertex array) + internal static void SolveTangents2DEnsureSize (ref Vector4[] tangentBuffer, ref Vector2[] tempTanBuffer, int vertexCount) { + if (tangentBuffer == null || tangentBuffer.Length < vertexCount) + tangentBuffer = new Vector4[vertexCount]; + + if (tempTanBuffer == null || tempTanBuffer.Length < vertexCount * 2) + tempTanBuffer = new Vector2[vertexCount * 2]; // two arrays in one. + } + + /// Step 2 of solving tangents. Fills (part of) a temporary tangent-solution buffer based on the vertices and uvs defined by a submesh's triangle buffer. Only needs to be called once for single-submesh meshes. + /// A temporary Vector3[] for calculating tangents. + /// The mesh's current vertex position buffer. + /// The mesh's current triangles buffer. + /// The mesh's current uvs buffer. + /// Number of vertices that require tangents (or the size of the vertex array) + /// The number of triangle indexes in the triangle array to be used. + internal static void SolveTangents2DTriangles (Vector2[] tempTanBuffer, int[] triangles, int triangleCount, Vector3[] vertices, Vector2[] uvs, int vertexCount) { + Vector2 sdir; + Vector2 tdir; + for (int t = 0; t < triangleCount; t += 3) { + int i1 = triangles[t + 0]; + int i2 = triangles[t + 1]; + int i3 = triangles[t + 2]; + + Vector3 v1 = vertices[i1]; + Vector3 v2 = vertices[i2]; + Vector3 v3 = vertices[i3]; + + Vector2 w1 = uvs[i1]; + Vector2 w2 = uvs[i2]; + Vector2 w3 = uvs[i3]; + + float x1 = v2.x - v1.x; + float x2 = v3.x - v1.x; + float y1 = v2.y - v1.y; + float y2 = v3.y - v1.y; + + float s1 = w2.x - w1.x; + float s2 = w3.x - w1.x; + float t1 = w2.y - w1.y; + float t2 = w3.y - w1.y; + + float div = s1 * t2 - s2 * t1; + float r = (div == 0f) ? 0f : 1f / div; + + sdir.x = (t2 * x1 - t1 * x2) * r; + sdir.y = (t2 * y1 - t1 * y2) * r; + tempTanBuffer[i1] = tempTanBuffer[i2] = tempTanBuffer[i3] = sdir; + + tdir.x = (s1 * x2 - s2 * x1) * r; + tdir.y = (s1 * y2 - s2 * y1) * r; + tempTanBuffer[vertexCount + i1] = tempTanBuffer[vertexCount + i2] = tempTanBuffer[vertexCount + i3] = tdir; + } + } + + /// Step 3 of solving tangents. Fills a Vector4[] tangents array according to values calculated in step 2. + /// A Vector4[] that will eventually be used to set Mesh.tangents + /// A temporary Vector3[] for calculating tangents. + /// Number of vertices that require tangents (or the size of the vertex array) + internal static void SolveTangents2DBuffer (Vector4[] tangents, Vector2[] tempTanBuffer, int vertexCount) { + Vector4 tangent; + tangent.z = 0; + for (int i = 0; i < vertexCount; ++i) { + Vector2 t = tempTanBuffer[i]; + + // t.Normalize() (aggressively inlined). Even better if offloaded to GPU via vertex shader. + float magnitude = Mathf.Sqrt(t.x * t.x + t.y * t.y); + if (magnitude > 1E-05) { + float reciprocalMagnitude = 1f/magnitude; + t.x *= reciprocalMagnitude; + t.y *= reciprocalMagnitude; + } + + Vector2 t2 = tempTanBuffer[vertexCount + i]; + tangent.x = t.x; + tangent.y = t.y; + //tangent.z = 0; + tangent.w = (t.y * t2.x > t.x * t2.y) ? 1 : -1; // 2D direction calculation. Used for binormals. + tangents[i] = tangent; + } + } + #endregion + + #region AttachmentRendering + static List AttachmentVerts = new List(); + static List AttachmentUVs = new List(); + static List AttachmentColors32 = new List(); + static List AttachmentIndices = new List(); + + /// + /// Fills mesh vertex data to render a RegionAttachment. + public static void FillMeshLocal (Mesh mesh, RegionAttachment regionAttachment) { + if (mesh == null) return; + if (regionAttachment == null) return; + + AttachmentVerts.Clear(); + var offsets = regionAttachment.Offset; + AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.BLX], offsets[RegionAttachment.BLY])); + AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.ULX], offsets[RegionAttachment.ULY])); + AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.URX], offsets[RegionAttachment.URY])); + AttachmentVerts.Add(new Vector3(offsets[RegionAttachment.BRX], offsets[RegionAttachment.BRY])); + + AttachmentUVs.Clear(); + var uvs = regionAttachment.UVs; + AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.ULX], uvs[RegionAttachment.ULY])); + AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.URX], uvs[RegionAttachment.URY])); + AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.BRX], uvs[RegionAttachment.BRY])); + AttachmentUVs.Add(new Vector2(uvs[RegionAttachment.BLX], uvs[RegionAttachment.BLY])); + + AttachmentColors32.Clear(); + Color32 c = (Color32)(new Color(regionAttachment.r, regionAttachment.g, regionAttachment.b, regionAttachment.a)); + for (int i = 0; i < 4; i++) + AttachmentColors32.Add(c); + + AttachmentIndices.Clear(); + AttachmentIndices.AddRange(new[] { 0, 2, 1, 0, 3, 2 }); + + mesh.Clear(); + mesh.name = regionAttachment.Name; + mesh.SetVertices(AttachmentVerts); + mesh.SetUVs(0, AttachmentUVs); + mesh.SetColors(AttachmentColors32); + mesh.SetTriangles(AttachmentIndices, 0); + mesh.RecalculateBounds(); + + AttachmentVerts.Clear(); + AttachmentUVs.Clear(); + AttachmentColors32.Clear(); + AttachmentIndices.Clear(); + } + + public static void FillMeshLocal (Mesh mesh, MeshAttachment meshAttachment, SkeletonData skeletonData) { + if (mesh == null) return; + if (meshAttachment == null) return; + int vertexCount = meshAttachment.WorldVerticesLength / 2; + + AttachmentVerts.Clear(); + if (meshAttachment.IsWeighted()) { + int count = meshAttachment.WorldVerticesLength; + int[] meshAttachmentBones = meshAttachment.bones; + int v = 0; + + float[] vertices = meshAttachment.vertices; + for (int w = 0, b = 0; w < count; w += 2) { + float wx = 0, wy = 0; + int n = meshAttachmentBones[v++]; + n += v; + for (; v < n; v++, b += 3) { + BoneMatrix bm = BoneMatrix.CalculateSetupWorld(skeletonData.bones.Items[meshAttachmentBones[v]]); + float vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; + wx += (vx * bm.a + vy * bm.b + bm.x) * weight; + wy += (vx * bm.c + vy * bm.d + bm.y) * weight; + } + AttachmentVerts.Add(new Vector3(wx, wy)); + } + } else { + var localVerts = meshAttachment.Vertices; + Vector3 pos = default(Vector3); + for (int i = 0; i < vertexCount; i++) { + int ii = i * 2; + pos.x = localVerts[ii]; + pos.y = localVerts[ii + 1]; + AttachmentVerts.Add(pos); + } + } + + var uvs = meshAttachment.uvs; + Vector2 uv = default(Vector2); + Color32 c = (Color32)(new Color(meshAttachment.r, meshAttachment.g, meshAttachment.b, meshAttachment.a)); + AttachmentUVs.Clear(); + AttachmentColors32.Clear(); + for (int i = 0; i < vertexCount; i++) { + int ii = i * 2; + uv.x = uvs[ii]; + uv.y = uvs[ii + 1]; + AttachmentUVs.Add(uv); + + AttachmentColors32.Add(c); + } + + AttachmentIndices.Clear(); + AttachmentIndices.AddRange(meshAttachment.triangles); + + mesh.Clear(); + mesh.name = meshAttachment.Name; + mesh.SetVertices(AttachmentVerts); + mesh.SetUVs(0, AttachmentUVs); + mesh.SetColors(AttachmentColors32); + mesh.SetTriangles(AttachmentIndices, 0); + mesh.RecalculateBounds(); + + AttachmentVerts.Clear(); + AttachmentUVs.Clear(); + AttachmentColors32.Clear(); + AttachmentIndices.Clear(); + } + + + #endregion + } + + public class MeshRendererBuffers : IDisposable { + DoubleBuffered doubleBufferedMesh; + internal readonly ExposedList submeshMaterials = new ExposedList(); + internal Material[] sharedMaterials = new Material[0]; + + public void Initialize () { + if (doubleBufferedMesh != null) { + doubleBufferedMesh.GetNext().Clear(); + doubleBufferedMesh.GetNext().Clear(); + submeshMaterials.Clear(); + } else { + doubleBufferedMesh = new DoubleBuffered(); + } + } + + public Material[] GetUpdatedSharedMaterialsArray () { + if (submeshMaterials.Count == sharedMaterials.Length) + submeshMaterials.CopyTo(sharedMaterials); + else + sharedMaterials = submeshMaterials.ToArray(); + + return sharedMaterials; + } + + public bool MaterialsChangedInLastUpdate () { + int newSubmeshMaterials = submeshMaterials.Count; + var sharedMaterials = this.sharedMaterials; + if (newSubmeshMaterials != sharedMaterials.Length) return true; + + var submeshMaterialsItems = submeshMaterials.Items; + for (int i = 0; i < newSubmeshMaterials; i++) + if (!Material.ReferenceEquals(submeshMaterialsItems[i], sharedMaterials[i])) return true; //if (submeshMaterialsItems[i].GetInstanceID() != sharedMaterials[i].GetInstanceID()) return true; + + return false; + } + + public void UpdateSharedMaterials (ExposedList instructions) { + int newSize = instructions.Count; + { //submeshMaterials.Resize(instructions.Count); + if (newSize > submeshMaterials.Items.Length) + Array.Resize(ref submeshMaterials.Items, newSize); + submeshMaterials.Count = newSize; + } + + var submeshMaterialsItems = submeshMaterials.Items; + var instructionsItems = instructions.Items; + for (int i = 0; i < newSize; i++) + submeshMaterialsItems[i] = instructionsItems[i].material; + } + + public SmartMesh GetNextMesh () { + return doubleBufferedMesh.GetNext(); + } + + public void Clear () { + sharedMaterials = new Material[0]; + submeshMaterials.Clear(); + } + + public void Dispose () { + if (doubleBufferedMesh == null) return; + doubleBufferedMesh.GetNext().Dispose(); + doubleBufferedMesh.GetNext().Dispose(); + doubleBufferedMesh = null; + } + + ///This is a Mesh that also stores the instructions SkeletonRenderer generated for it. + public class SmartMesh : IDisposable { + public Mesh mesh = SpineMesh.NewSkeletonMesh(); + public SkeletonRendererInstruction instructionUsed = new SkeletonRendererInstruction(); + + public void Clear () { + mesh.Clear(); + instructionUsed.Clear(); + } + + public void Dispose () { + if (mesh != null) { + #if UNITY_EDITOR + if (Application.isEditor && !Application.isPlaying) + UnityEngine.Object.DestroyImmediate(mesh); + else + UnityEngine.Object.Destroy(mesh); + #else + UnityEngine.Object.Destroy(mesh); + #endif + } + mesh = null; + } + } + } + + public class SkeletonRendererInstruction { + public bool immutableTriangles; + public readonly ExposedList submeshInstructions = new ExposedList(); + + #if SPINE_TRIANGLECHECK + public bool hasActiveClipping; + public int rawVertexCount = -1; + public readonly ExposedList attachments = new ExposedList(); + #endif + + public void Clear () { + #if SPINE_TRIANGLECHECK + this.attachments.Clear(false); + rawVertexCount = -1; + hasActiveClipping = false; + #endif + this.submeshInstructions.Clear(false); + } + + public void Dispose () { + attachments.Clear(true); + } + + public void SetWithSubset (ExposedList instructions, int startSubmesh, int endSubmesh) { + #if SPINE_TRIANGLECHECK + int runningVertexCount = 0; + #endif + + var submeshes = this.submeshInstructions; + submeshes.Clear(false); + int submeshCount = endSubmesh - startSubmesh; + submeshes.Resize(submeshCount); + var submeshesItems = submeshes.Items; + var instructionsItems = instructions.Items; + for (int i = 0; i < submeshCount; i++) { + var instruction = instructionsItems[startSubmesh + i]; + submeshesItems[i] = instruction; + #if SPINE_TRIANGLECHECK + this.hasActiveClipping |= instruction.hasClipping; + submeshesItems[i].rawFirstVertexIndex = runningVertexCount; // Ensure current instructions have correct cached values. + runningVertexCount += instruction.rawVertexCount; // vertexCount will also be used for the rest of this method. + #endif + } + #if SPINE_TRIANGLECHECK + this.rawVertexCount = runningVertexCount; + + // assumption: instructions are contiguous. start and end are valid within instructions. + + int startSlot = instructionsItems[startSubmesh].startSlot; + int endSlot = instructionsItems[endSubmesh - 1].endSlot; + attachments.Clear(false); + int attachmentCount = endSlot - startSlot; + attachments.Resize(attachmentCount); + var attachmentsItems = attachments.Items; + + var drawOrder = instructionsItems[0].skeleton.drawOrder.Items; + for (int i = 0; i < attachmentCount; i++) + attachmentsItems[i] = drawOrder[startSlot + i].attachment; + #endif + } + + public void Set (SkeletonRendererInstruction other) { + this.immutableTriangles = other.immutableTriangles; + + #if SPINE_TRIANGLECHECK + this.hasActiveClipping = other.hasActiveClipping; + this.rawVertexCount = other.rawVertexCount; + this.attachments.Clear(false); + this.attachments.GrowIfNeeded(other.attachments.Capacity); + this.attachments.Count = other.attachments.Count; + other.attachments.CopyTo(this.attachments.Items); + #endif + + this.submeshInstructions.Clear(false); + this.submeshInstructions.GrowIfNeeded(other.submeshInstructions.Capacity); + this.submeshInstructions.Count = other.submeshInstructions.Count; + other.submeshInstructions.CopyTo(this.submeshInstructions.Items); + } + + public static bool GeometryNotEqual (SkeletonRendererInstruction a, SkeletonRendererInstruction b) { + #if SPINE_TRIANGLECHECK + #if UNITY_EDITOR + if (!Application.isPlaying) + return true; + #endif + + if (a.hasActiveClipping || b.hasActiveClipping) return true; // Triangles are unpredictable when clipping is active. + + // Everything below assumes the raw vertex and triangle counts were used. (ie, no clipping was done) + if (a.rawVertexCount != b.rawVertexCount) return true; + + if (a.immutableTriangles != b.immutableTriangles) return true; + + int attachmentCountB = b.attachments.Count; + if (a.attachments.Count != attachmentCountB) return true; // Bounds check for the looped storedAttachments count below. + + // Submesh count changed + int submeshCountA = a.submeshInstructions.Count; + int submeshCountB = b.submeshInstructions.Count; + if (submeshCountA != submeshCountB) return true; + + // Submesh Instruction mismatch + var submeshInstructionsItemsA = a.submeshInstructions.Items; + var submeshInstructionsItemsB = b.submeshInstructions.Items; + + var attachmentsA = a.attachments.Items; + var attachmentsB = b.attachments.Items; + for (int i = 0; i < attachmentCountB; i++) + if (!System.Object.ReferenceEquals(attachmentsA[i], attachmentsB[i])) return true; + + for (int i = 0; i < submeshCountB; i++) { + var submeshA = submeshInstructionsItemsA[i]; + var submeshB = submeshInstructionsItemsB[i]; + + if (!( + submeshA.rawVertexCount == submeshB.rawVertexCount && + submeshA.startSlot == submeshB.startSlot && + submeshA.endSlot == submeshB.endSlot + && submeshA.rawTriangleCount == submeshB.rawTriangleCount && + submeshA.rawFirstVertexIndex == submeshB.rawFirstVertexIndex + )) + return true; + } + + return false; + #else + // In normal immutable triangle use, immutableTriangles will be initially false, forcing the smartmesh to update the first time but never again after that, unless there was an immutableTriangles flag mismatch.. + if (a.immutableTriangles || b.immutableTriangles) + return (a.immutableTriangles != b.immutableTriangles); + + return true; + #endif + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/SpineMesh.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/SpineMesh.cs.meta new file mode 100644 index 0000000..b30649a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/SpineMesh.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f834c8746034db645a52a9506ff1de89 +timeCreated: 1455416715 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused.meta new file mode 100644 index 0000000..ebee0d3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0cb4e560224445d44affd8e57c1ae8b1 +folderAsset: yes +timeCreated: 1495071888 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysMeshGenerator.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysMeshGenerator.cs new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysMeshGenerator.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysMeshGenerator.cs.meta new file mode 100644 index 0000000..e2048bb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysMeshGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed047fa8737dedb4081579983c193db5 +timeCreated: 1458124926 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSimpleMeshGenerator.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSimpleMeshGenerator.cs new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSimpleMeshGenerator.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSimpleMeshGenerator.cs.meta new file mode 100644 index 0000000..72f63e4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSimpleMeshGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 296d4c2077fb3bc4fa9a5211c0f95011 +timeCreated: 1455406990 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshSetMeshGenerator.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshSetMeshGenerator.cs new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshSetMeshGenerator.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshSetMeshGenerator.cs.meta new file mode 100644 index 0000000..88a0168 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshSetMeshGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 11ba077d7d984814db31d054192be532 +timeCreated: 1458047178 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshedMeshGenerator.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshedMeshGenerator.cs new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshedMeshGenerator.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshedMeshGenerator.cs.meta new file mode 100644 index 0000000..81ce284 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ArraysSubmeshedMeshGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 412898b02d5caaf489b3ffb29e4ae1c0 +timeCreated: 1455407003 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/DoubleBufferedMesh.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/DoubleBufferedMesh.cs new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/DoubleBufferedMesh.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/DoubleBufferedMesh.cs.meta new file mode 100644 index 0000000..8114723 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/DoubleBufferedMesh.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7191a70dcf4959f43961fa78e05484a0 +timeCreated: 1455140057 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISimpleMeshGenerator.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISimpleMeshGenerator.cs new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISimpleMeshGenerator.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISimpleMeshGenerator.cs.meta new file mode 100644 index 0000000..41c9e5a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISimpleMeshGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0af0615ce8e0e054ea224e3e03ab31aa +timeCreated: 1455406790 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISubmeshedMeshGenerator.cs b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISubmeshedMeshGenerator.cs new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISubmeshedMeshGenerator.cs.meta b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISubmeshedMeshGenerator.cs.meta new file mode 100644 index 0000000..85782f9 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Mesh Generation/Unused/ISubmeshedMeshGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7492a8ff24ea1884f92307ab1121e451 +timeCreated: 1458046464 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules.meta b/Assets/Spine/Assets/spine-unity/Modules.meta new file mode 100644 index 0000000..2dc106c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a7935399edad9a14bb5708cf59c94b67 +folderAsset: yes +timeCreated: 1455489260 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools.meta b/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools.meta new file mode 100644 index 0000000..fee2e8c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f601b524e4da4704a9e0f6b7e05d6ca6 +folderAsset: yes +timeCreated: 1478437840 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs b/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs new file mode 100644 index 0000000..cc2f14e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs @@ -0,0 +1,1135 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections.Generic; + +namespace Spine.Unity.Modules.AttachmentTools { + public static class AttachmentRegionExtensions { + #region GetRegion + /// + /// Tries to get the region (image) of a renderable attachment. If the attachment is not renderable, it returns null. + public static AtlasRegion GetRegion (this Attachment attachment) { + var renderableAttachment = attachment as IHasRendererObject; + if (renderableAttachment != null) + return renderableAttachment.RendererObject as AtlasRegion; + + return null; + } + + /// Gets the region (image) of a RegionAttachment + public static AtlasRegion GetRegion (this RegionAttachment regionAttachment) { + return regionAttachment.RendererObject as AtlasRegion; + } + + /// Gets the region (image) of a MeshAttachment + public static AtlasRegion GetRegion (this MeshAttachment meshAttachment) { + return meshAttachment.RendererObject as AtlasRegion; + } + #endregion + #region SetRegion + /// + /// Tries to set the region (image) of a renderable attachment. If the attachment is not renderable, nothing is applied. + public static void SetRegion (this Attachment attachment, AtlasRegion region, bool updateOffset = true) { + var regionAttachment = attachment as RegionAttachment; + if (regionAttachment != null) + regionAttachment.SetRegion(region, updateOffset); + + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) + meshAttachment.SetRegion(region, updateOffset); + } + + /// Sets the region (image) of a RegionAttachment + public static void SetRegion (this RegionAttachment attachment, AtlasRegion region, bool updateOffset = true) { + if (region == null) throw new System.ArgumentNullException("region"); + + // (AtlasAttachmentLoader.cs) + attachment.RendererObject = region; + attachment.SetUVs(region.u, region.v, region.u2, region.v2, region.rotate); + attachment.regionOffsetX = region.offsetX; + attachment.regionOffsetY = region.offsetY; + attachment.regionWidth = region.width; + attachment.regionHeight = region.height; + attachment.regionOriginalWidth = region.originalWidth; + attachment.regionOriginalHeight = region.originalHeight; + + if (updateOffset) attachment.UpdateOffset(); + } + + /// Sets the region (image) of a MeshAttachment + public static void SetRegion (this MeshAttachment attachment, AtlasRegion region, bool updateUVs = true) { + if (region == null) throw new System.ArgumentNullException("region"); + + // (AtlasAttachmentLoader.cs) + attachment.RendererObject = region; + attachment.RegionU = region.u; + attachment.RegionV = region.v; + attachment.RegionU2 = region.u2; + attachment.RegionV2 = region.v2; + attachment.RegionRotate = region.rotate; + attachment.regionOffsetX = region.offsetX; + attachment.regionOffsetY = region.offsetY; + attachment.regionWidth = region.width; + attachment.regionHeight = region.height; + attachment.regionOriginalWidth = region.originalWidth; + attachment.regionOriginalHeight = region.originalHeight; + + if (updateUVs) attachment.UpdateUVs(); + } + #endregion + + #region Runtime RegionAttachments + /// + /// Creates a RegionAttachment based on a sprite. This method creates a real, usable AtlasRegion. That AtlasRegion uses a new AtlasPage with the Material provided./// + public static RegionAttachment ToRegionAttachment (this Sprite sprite, Material material, float rotation = 0f) { + return sprite.ToRegionAttachment(material.ToSpineAtlasPage(), rotation); + } + + /// + /// Creates a RegionAttachment based on a sprite. This method creates a real, usable AtlasRegion. That AtlasRegion uses the AtlasPage provided./// + public static RegionAttachment ToRegionAttachment (this Sprite sprite, AtlasPage page, float rotation = 0f) { + if (sprite == null) throw new System.ArgumentNullException("sprite"); + if (page == null) throw new System.ArgumentNullException("page"); + var region = sprite.ToAtlasRegion(page); + var unitsPerPixel = 1f / sprite.pixelsPerUnit; + return region.ToRegionAttachment(sprite.name, unitsPerPixel, rotation); + } + + /// + /// Creates a Spine.AtlasRegion that uses a premultiplied alpha duplicate texture of the Sprite's texture data. Returns a RegionAttachment that uses it. Use this if you plan to use a premultiply alpha shader such as "Spine/Skeleton" + public static RegionAttachment ToRegionAttachmentPMAClone (this Sprite sprite, Shader shader, TextureFormat textureFormat = AtlasUtilities.SpineTextureFormat, bool mipmaps = AtlasUtilities.UseMipMaps, Material materialPropertySource = null, float rotation = 0f) { + if (sprite == null) throw new System.ArgumentNullException("sprite"); + if (shader == null) throw new System.ArgumentNullException("shader"); + var region = sprite.ToAtlasRegionPMAClone(shader, textureFormat, mipmaps, materialPropertySource); + var unitsPerPixel = 1f / sprite.pixelsPerUnit; + return region.ToRegionAttachment(sprite.name, unitsPerPixel, rotation); + } + + public static RegionAttachment ToRegionAttachmentPMAClone (this Sprite sprite, Material materialPropertySource, TextureFormat textureFormat = AtlasUtilities.SpineTextureFormat, bool mipmaps = AtlasUtilities.UseMipMaps, float rotation = 0f) { + return sprite.ToRegionAttachmentPMAClone(materialPropertySource.shader, textureFormat, mipmaps, materialPropertySource, rotation); + } + + /// + /// Creates a new RegionAttachment from a given AtlasRegion. + public static RegionAttachment ToRegionAttachment (this AtlasRegion region, string attachmentName, float scale = 0.01f, float rotation = 0f) { + if (string.IsNullOrEmpty(attachmentName)) throw new System.ArgumentException("attachmentName can't be null or empty.", "attachmentName"); + if (region == null) throw new System.ArgumentNullException("region"); + + // (AtlasAttachmentLoader.cs) + var attachment = new RegionAttachment(attachmentName); + + attachment.RendererObject = region; + attachment.SetUVs(region.u, region.v, region.u2, region.v2, region.rotate); + attachment.regionOffsetX = region.offsetX; + attachment.regionOffsetY = region.offsetY; + attachment.regionWidth = region.width; + attachment.regionHeight = region.height; + attachment.regionOriginalWidth = region.originalWidth; + attachment.regionOriginalHeight = region.originalHeight; + + attachment.Path = region.name; + attachment.scaleX = 1; + attachment.scaleY = 1; + attachment.rotation = rotation; + + attachment.r = 1; + attachment.g = 1; + attachment.b = 1; + attachment.a = 1; + + // pass OriginalWidth and OriginalHeight because UpdateOffset uses it in its calculation. + attachment.width = attachment.regionOriginalWidth * scale; + attachment.height = attachment.regionOriginalHeight * scale; + + attachment.SetColor(Color.white); + attachment.UpdateOffset(); + return attachment; + } + + /// Sets the scale. Call regionAttachment.UpdateOffset to apply the change. + public static void SetScale (this RegionAttachment regionAttachment, Vector2 scale) { + regionAttachment.scaleX = scale.x; + regionAttachment.scaleY = scale.y; + } + + /// Sets the scale. Call regionAttachment.UpdateOffset to apply the change. + public static void SetScale (this RegionAttachment regionAttachment, float x, float y) { + regionAttachment.scaleX = x; + regionAttachment.scaleY = y; + } + + /// Sets the position offset. Call regionAttachment.UpdateOffset to apply the change. + public static void SetPositionOffset (this RegionAttachment regionAttachment, Vector2 offset) { + regionAttachment.x = offset.x; + regionAttachment.y = offset.y; + } + + /// Sets the position offset. Call regionAttachment.UpdateOffset to apply the change. + public static void SetPositionOffset (this RegionAttachment regionAttachment, float x, float y) { + regionAttachment.x = x; + regionAttachment.y = y; + } + + /// Sets the rotation. Call regionAttachment.UpdateOffset to apply the change. + public static void SetRotation (this RegionAttachment regionAttachment, float rotation) { + regionAttachment.rotation = rotation; + } + #endregion + } + + public static class AtlasUtilities { + internal const TextureFormat SpineTextureFormat = TextureFormat.RGBA32; + internal const float DefaultMipmapBias = -0.5f; + internal const bool UseMipMaps = false; + internal const float DefaultScale = 0.01f; + + const int NonrenderingRegion = -1; + + public static AtlasRegion ToAtlasRegion (this Texture2D t, Material materialPropertySource, float scale = DefaultScale) { + return t.ToAtlasRegion(materialPropertySource.shader, scale, materialPropertySource); + } + + public static AtlasRegion ToAtlasRegion (this Texture2D t, Shader shader, float scale = DefaultScale, Material materialPropertySource = null) { + var material = new Material(shader); + if (materialPropertySource != null) { + material.CopyPropertiesFromMaterial(materialPropertySource); + material.shaderKeywords = materialPropertySource.shaderKeywords; + } + + material.mainTexture = t; + var page = material.ToSpineAtlasPage(); + + float width = t.width; + float height = t.height; + + var region = new AtlasRegion(); + region.name = t.name; + region.index = -1; + region.rotate = false; + + // World space units + Vector2 boundsMin = Vector2.zero, boundsMax = new Vector2(width, height) * scale; + + // Texture space/pixel units + region.width = (int)width; + region.originalWidth = (int)width; + region.height = (int)height; + region.originalHeight = (int)height; + region.offsetX = width * (0.5f - InverseLerp(boundsMin.x, boundsMax.x, 0)); + region.offsetY = height * (0.5f - InverseLerp(boundsMin.y, boundsMax.y, 0)); + + // Use the full area of the texture. + region.u = 0; + region.v = 1; + region.u2 = 1; + region.v2 = 0; + region.x = 0; + region.y = 0; + + region.page = page; + + return region; + } + + /// + /// Creates a Spine.AtlasRegion that uses a premultiplied alpha duplicate of the Sprite's texture data. + public static AtlasRegion ToAtlasRegionPMAClone (this Texture2D t, Material materialPropertySource, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps) { + return t.ToAtlasRegionPMAClone(materialPropertySource.shader, textureFormat, mipmaps, materialPropertySource); + } + + /// + /// Creates a Spine.AtlasRegion that uses a premultiplied alpha duplicate of the Sprite's texture data. + public static AtlasRegion ToAtlasRegionPMAClone (this Texture2D t, Shader shader, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps, Material materialPropertySource = null) { + var material = new Material(shader); + if (materialPropertySource != null) { + material.CopyPropertiesFromMaterial(materialPropertySource); + material.shaderKeywords = materialPropertySource.shaderKeywords; + } + var newTexture = t.GetClone(false, textureFormat, mipmaps); + newTexture.ApplyPMA(true); + + newTexture.name = t.name + "-pma-"; + material.name = t.name + shader.name; + + material.mainTexture = newTexture; + var page = material.ToSpineAtlasPage(); + + var region = newTexture.ToAtlasRegion(shader); + region.page = page; + + return region; + } + + /// + /// Creates a new Spine.AtlasPage from a UnityEngine.Material. If the material has a preassigned texture, the page width and height will be set. + public static AtlasPage ToSpineAtlasPage (this Material m) { + var newPage = new AtlasPage { + rendererObject = m, + name = m.name + }; + + var t = m.mainTexture; + if (t != null) { + newPage.width = t.width; + newPage.height = t.height; + } + + return newPage; + } + + /// + /// Creates a Spine.AtlasRegion from a UnityEngine.Sprite. + public static AtlasRegion ToAtlasRegion (this Sprite s, AtlasPage page) { + if (page == null) throw new System.ArgumentNullException("page", "page cannot be null. AtlasPage determines which texture region belongs and how it should be rendered. You can use material.ToSpineAtlasPage() to get a shareable AtlasPage from a Material, or use the sprite.ToAtlasRegion(material) overload."); + var region = s.ToAtlasRegion(); + region.page = page; + return region; + } + + /// + /// Creates a Spine.AtlasRegion from a UnityEngine.Sprite. This creates a new AtlasPage object for every AtlasRegion you create. You can centralize Material control by creating a shared atlas page using Material.ToSpineAtlasPage and using the sprite.ToAtlasRegion(AtlasPage) overload. + public static AtlasRegion ToAtlasRegion (this Sprite s, Material material) { + var region = s.ToAtlasRegion(); + region.page = material.ToSpineAtlasPage(); + return region; + } + + /// + /// Creates a Spine.AtlasRegion that uses a premultiplied alpha duplicate of the Sprite's texture data. + public static AtlasRegion ToAtlasRegionPMAClone (this Sprite s, Shader shader, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps, Material materialPropertySource = null) { + var material = new Material(shader); + if (materialPropertySource != null) { + material.CopyPropertiesFromMaterial(materialPropertySource); + material.shaderKeywords = materialPropertySource.shaderKeywords; + } + + var tex = s.ToTexture(false, textureFormat, mipmaps); + tex.ApplyPMA(true); + + tex.name = s.name + "-pma-"; + material.name = tex.name + shader.name; + + material.mainTexture = tex; + var page = material.ToSpineAtlasPage(); + + var region = s.ToAtlasRegion(true); + region.page = page; + + return region; + } + + public static AtlasRegion ToAtlasRegionPMAClone (this Sprite s, Material materialPropertySource, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps) { + return s.ToAtlasRegionPMAClone(materialPropertySource.shader, textureFormat, mipmaps, materialPropertySource); + } + + internal static AtlasRegion ToAtlasRegion (this Sprite s, bool isolatedTexture = false) { + var region = new AtlasRegion(); + region.name = s.name; + region.index = -1; + region.rotate = s.packed && s.packingRotation != SpritePackingRotation.None; + + // World space units + Bounds bounds = s.bounds; + Vector2 boundsMin = bounds.min, boundsMax = bounds.max; + + // Texture space/pixel units + Rect spineRect = s.rect.SpineUnityFlipRect(s.texture.height); + region.width = (int)spineRect.width; + region.originalWidth = (int)spineRect.width; + region.height = (int)spineRect.height; + region.originalHeight = (int)spineRect.height; + region.offsetX = spineRect.width * (0.5f - InverseLerp(boundsMin.x, boundsMax.x, 0)); + region.offsetY = spineRect.height * (0.5f - InverseLerp(boundsMin.y, boundsMax.y, 0)); + + if (isolatedTexture) { + region.u = 0; + region.v = 1; + region.u2 = 1; + region.v2 = 0; + region.x = 0; + region.y = 0; + } else { + Texture2D tex = s.texture; + Rect uvRect = TextureRectToUVRect(s.textureRect, tex.width, tex.height); + region.u = uvRect.xMin; + region.v = uvRect.yMax; + region.u2 = uvRect.xMax; + region.v2 = uvRect.yMin; + region.x = (int)spineRect.x; + region.y = (int)spineRect.y; + } + + return region; + } + + #region Runtime Repacking + /// + /// Fills the outputAttachments list with new attachment objects based on the attachments in sourceAttachments, but mapped to a new single texture using the same material. + /// The list of attachments to be repacked. + /// The List(Attachment) to populate with the newly created Attachment objects. + /// + /// May be null. If no Material property source is provided, no special + public static void GetRepackedAttachments (List sourceAttachments, List outputAttachments, Material materialPropertySource, out Material outputMaterial, out Texture2D outputTexture, int maxAtlasSize = 1024, int padding = 2, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps, string newAssetName = "Repacked Attachments", bool clearCache = false, bool useOriginalNonrenderables = true) { + if (sourceAttachments == null) throw new System.ArgumentNullException("sourceAttachments"); + if (outputAttachments == null) throw new System.ArgumentNullException("outputAttachments"); + + // Use these to detect and use shared regions. + var existingRegions = new Dictionary(); + var regionIndexes = new List(); + var texturesToPack = new List(); + var originalRegions = new List(); + + outputAttachments.Clear(); + outputAttachments.AddRange(sourceAttachments); + + int newRegionIndex = 0; + for (int i = 0, n = sourceAttachments.Count; i < n; i++) { + var originalAttachment = sourceAttachments[i]; + + if (IsRenderable(originalAttachment)) { + var newAttachment = originalAttachment.GetClone(true); + var region = newAttachment.GetRegion(); + int existingIndex; + if (existingRegions.TryGetValue(region, out existingIndex)) { + regionIndexes.Add(existingIndex); // Store the region index for the eventual new attachment. + } else { + originalRegions.Add(region); + texturesToPack.Add(region.ToTexture()); // Add the texture to the PackTextures argument + existingRegions.Add(region, newRegionIndex); // Add the region to the dictionary of known regions + regionIndexes.Add(newRegionIndex); // Store the region index for the eventual new attachment. + newRegionIndex++; + } + + outputAttachments[i] = newAttachment; + } else { + outputAttachments[i] = useOriginalNonrenderables ? originalAttachment : originalAttachment.GetClone(true); + regionIndexes.Add(NonrenderingRegion); // Output attachments pairs with regionIndexes list 1:1. Pad with a sentinel if the attachment doesn't have a region. + } + } + + // Fill a new texture with the collected attachment textures. + var newTexture = new Texture2D(maxAtlasSize, maxAtlasSize, textureFormat, mipmaps); + newTexture.mipMapBias = AtlasUtilities.DefaultMipmapBias; + newTexture.anisoLevel = texturesToPack[0].anisoLevel; + newTexture.name = newAssetName; + var rects = newTexture.PackTextures(texturesToPack.ToArray(), padding, maxAtlasSize); + + // Rehydrate the repacked textures as a Material, Spine atlas and Spine.AtlasAttachments + Shader shader = materialPropertySource == null ? Shader.Find("Spine/Skeleton") : materialPropertySource.shader; + var newMaterial = new Material(shader); + if (materialPropertySource != null) { + newMaterial.CopyPropertiesFromMaterial(materialPropertySource); + newMaterial.shaderKeywords = materialPropertySource.shaderKeywords; + } + + newMaterial.name = newAssetName; + newMaterial.mainTexture = newTexture; + var page = newMaterial.ToSpineAtlasPage(); + page.name = newAssetName; + + var repackedRegions = new List(); + for (int i = 0, n = originalRegions.Count; i < n; i++) { + var oldRegion = originalRegions[i]; + var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, oldRegion.rotate); + repackedRegions.Add(newRegion); + } + + // Map the cloned attachments to the repacked atlas. + for (int i = 0, n = outputAttachments.Count; i < n; i++) { + var a = outputAttachments[i]; + if (IsRenderable(a)) + a.SetRegion(repackedRegions[regionIndexes[i]]); + } + + // Clean up. + if (clearCache) + AtlasUtilities.ClearCache(); + + outputTexture = newTexture; + outputMaterial = newMaterial; + } + + /// + /// Creates and populates a duplicate skin with cloned attachments that are backed by a new packed texture atlas comprised of all the regions from the original skin. + /// No Spine.Atlas object is created so there is no way to find AtlasRegions except through the Attachments using them. + public static Skin GetRepackedSkin (this Skin o, string newName, Material materialPropertySource, out Material outputMaterial, out Texture2D outputTexture, int maxAtlasSize = 1024, int padding = 2, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps, bool useOriginalNonrenderables = true) { + return GetRepackedSkin(o, newName, materialPropertySource.shader, out outputMaterial, out outputTexture, maxAtlasSize, padding, textureFormat, mipmaps, materialPropertySource, useOriginalNonrenderables); + } + + /// + /// Creates and populates a duplicate skin with cloned attachments that are backed by a new packed texture atlas comprised of all the regions from the original skin. + /// No Spine.Atlas object is created so there is no way to find AtlasRegions except through the Attachments using them. + public static Skin GetRepackedSkin (this Skin o, string newName, Shader shader, out Material outputMaterial, out Texture2D outputTexture, int maxAtlasSize = 1024, int padding = 2, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps, Material materialPropertySource = null, bool clearCache = false, bool useOriginalNonrenderables = true) { + if (o == null) throw new System.NullReferenceException("Skin was null"); + var skinAttachments = o.Attachments; + var newSkin = new Skin(newName); + + // Use these to detect and use shared regions. + var existingRegions = new Dictionary(); + var regionIndexes = new List(); + + // Collect all textures from the attachments of the original skin. + var repackedAttachments = new List(); + var texturesToPack = new List(); + var originalRegions = new List(); + int newRegionIndex = 0; + foreach (var skinEntry in skinAttachments) { + var originalKey = skinEntry.Key; + var originalAttachment = skinEntry.Value; + + Attachment newAttachment; + if (IsRenderable(originalAttachment)) { + newAttachment = originalAttachment.GetClone(true); + var region = newAttachment.GetRegion(); + int existingIndex; + if (existingRegions.TryGetValue(region, out existingIndex)) { + regionIndexes.Add(existingIndex); // Store the region index for the eventual new attachment. + } else { + originalRegions.Add(region); + texturesToPack.Add(region.ToTexture()); // Add the texture to the PackTextures argument + existingRegions.Add(region, newRegionIndex); // Add the region to the dictionary of known regions + regionIndexes.Add(newRegionIndex); // Store the region index for the eventual new attachment. + newRegionIndex++; + } + + repackedAttachments.Add(newAttachment); + newSkin.AddAttachment(originalKey.slotIndex, originalKey.name, newAttachment); + } else { + newSkin.AddAttachment(originalKey.slotIndex, originalKey.name, useOriginalNonrenderables ? originalAttachment : originalAttachment.GetClone(true)); + } + } + + // Fill a new texture with the collected attachment textures. + var newTexture = new Texture2D(maxAtlasSize, maxAtlasSize, textureFormat, mipmaps); + newTexture.mipMapBias = AtlasUtilities.DefaultMipmapBias; + newTexture.anisoLevel = texturesToPack[0].anisoLevel; + newTexture.name = newName; + var rects = newTexture.PackTextures(texturesToPack.ToArray(), padding, maxAtlasSize); + + // Rehydrate the repacked textures as a Material, Spine atlas and Spine.AtlasAttachments + var newMaterial = new Material(shader); + if (materialPropertySource != null) { + newMaterial.CopyPropertiesFromMaterial(materialPropertySource); + newMaterial.shaderKeywords = materialPropertySource.shaderKeywords; + } + + newMaterial.name = newName; + newMaterial.mainTexture = newTexture; + var page = newMaterial.ToSpineAtlasPage(); + page.name = newName; + + var repackedRegions = new List(); + for (int i = 0, n = originalRegions.Count; i < n; i++) { + var oldRegion = originalRegions[i]; + var newRegion = UVRectToAtlasRegion(rects[i], oldRegion.name, page, oldRegion.offsetX, oldRegion.offsetY, oldRegion.rotate); + repackedRegions.Add(newRegion); + } + + // Map the cloned attachments to the repacked atlas. + for (int i = 0, n = repackedAttachments.Count; i < n; i++) { + var a = repackedAttachments[i]; + if (IsRenderable(a)) + a.SetRegion(repackedRegions[regionIndexes[i]]); + } + + // Clean up. + if (clearCache) + AtlasUtilities.ClearCache(); + + outputTexture = newTexture; + outputMaterial = newMaterial; + return newSkin; + } + + public static Sprite ToSprite (this AtlasRegion ar, float pixelsPerUnit = 100) { + return Sprite.Create(ar.GetMainTexture(), ar.GetUnityRect(), new Vector2(0.5f, 0.5f), pixelsPerUnit); + } + + static Dictionary CachedRegionTextures = new Dictionary(); + static List CachedRegionTexturesList = new List(); + + public static void ClearCache () { + foreach (var t in CachedRegionTexturesList) { + UnityEngine.Object.Destroy(t); + } + CachedRegionTextures.Clear(); + CachedRegionTexturesList.Clear(); + } + + /// Creates a new Texture2D object based on an AtlasRegion. + /// If applyImmediately is true, Texture2D.Apply is called immediately after the Texture2D is filled with data. + public static Texture2D ToTexture (this AtlasRegion ar, bool applyImmediately = true, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps) { + Texture2D output; + + CachedRegionTextures.TryGetValue(ar, out output); + if (output == null) { + Texture2D sourceTexture = ar.GetMainTexture(); + Rect r = ar.GetUnityRect(sourceTexture.height); + int width = (int)r.width; + int height = (int)r.height; + output = new Texture2D(width, height, textureFormat, mipmaps); + output.name = ar.name; + Color[] pixelBuffer = sourceTexture.GetPixels((int)r.x, (int)r.y, width, height); + output.SetPixels(pixelBuffer); + CachedRegionTextures.Add(ar, output); + CachedRegionTexturesList.Add(output); + + if (applyImmediately) + output.Apply(); + } + + return output; + } + + static Texture2D ToTexture (this Sprite s, bool applyImmediately = true, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps) { + var spriteTexture = s.texture; + var r = s.textureRect; + var spritePixels = spriteTexture.GetPixels((int)r.x, (int)r.y, (int)r.width, (int)r.height); + var newTexture = new Texture2D((int)r.width, (int)r.height, textureFormat, mipmaps); + newTexture.SetPixels(spritePixels); + + if (applyImmediately) + newTexture.Apply(); + + return newTexture; + } + + static Texture2D GetClone (this Texture2D t, bool applyImmediately = true, TextureFormat textureFormat = SpineTextureFormat, bool mipmaps = UseMipMaps) { + var spritePixels = t.GetPixels(0, 0, (int)t.width, (int)t.height); + var newTexture = new Texture2D((int)t.width, (int)t.height, textureFormat, mipmaps); + newTexture.SetPixels(spritePixels); + + if (applyImmediately) + newTexture.Apply(); + + return newTexture; + } + + static bool IsRenderable (Attachment a) { + return a is IHasRendererObject; + } + + /// + /// Get a rect with flipped Y so that a Spine atlas rect gets converted to a Unity Sprite rect and vice versa. + static Rect SpineUnityFlipRect (this Rect rect, int textureHeight) { + rect.y = textureHeight - rect.y - rect.height; + return rect; + } + + /// + /// Gets the Rect of an AtlasRegion according to Unity texture coordinates (x-right, y-up). + /// This overload relies on region.page.height being correctly set. + static Rect GetUnityRect (this AtlasRegion region) { + return region.GetSpineAtlasRect().SpineUnityFlipRect(region.page.height); + } + + /// + /// Gets the Rect of an AtlasRegion according to Unity texture coordinates (x-right, y-up). + static Rect GetUnityRect (this AtlasRegion region, int textureHeight) { + return region.GetSpineAtlasRect().SpineUnityFlipRect(textureHeight); + } + + /// + /// Returns a Rect of the AtlasRegion according to Spine texture coordinates. (x-right, y-down) + static Rect GetSpineAtlasRect (this AtlasRegion region, bool includeRotate = true) { + if (includeRotate && region.rotate) + return new Rect(region.x, region.y, region.height, region.width); + else + return new Rect(region.x, region.y, region.width, region.height); + } + + /// + /// Denormalize a uvRect into a texture-space Rect. + static Rect UVRectToTextureRect (Rect uvRect, int texWidth, int texHeight) { + uvRect.x *= texWidth; + uvRect.width *= texWidth; + uvRect.y *= texHeight; + uvRect.height *= texHeight; + return uvRect; + } + + /// + /// Normalize a texture Rect into UV coordinates. + static Rect TextureRectToUVRect (Rect textureRect, int texWidth, int texHeight) { + textureRect.x = Mathf.InverseLerp(0, texWidth, textureRect.x); + textureRect.y = Mathf.InverseLerp(0, texHeight, textureRect.y); + textureRect.width = Mathf.InverseLerp(0, texWidth, textureRect.width); + textureRect.height = Mathf.InverseLerp(0, texHeight, textureRect.height); + return textureRect; + } + + /// + /// Creates a new Spine AtlasRegion according to a Unity UV Rect (x-right, y-up, uv-normalized). + static AtlasRegion UVRectToAtlasRegion (Rect uvRect, string name, AtlasPage page, float offsetX, float offsetY, bool rotate) { + var tr = UVRectToTextureRect(uvRect, page.width, page.height); + var rr = tr.SpineUnityFlipRect(page.height); + + int x = (int)rr.x, y = (int)rr.y; + int w, h; + if (rotate) { + w = (int)rr.height; + h = (int)rr.width; + } else { + w = (int)rr.width; + h = (int)rr.height; + } + + return new AtlasRegion { + page = page, + name = name, + + u = uvRect.xMin, + u2 = uvRect.xMax, + v = uvRect.yMax, + v2 = uvRect.yMin, + + index = -1, + + width = w, + originalWidth = w, + height = h, + originalHeight = h, + offsetX = offsetX, + offsetY = offsetY, + x = x, + y = y, + + rotate = rotate + }; + } + + /// + /// Convenience method for getting the main texture of the material of the page of the region. + static Texture2D GetMainTexture (this AtlasRegion region) { + var material = (region.page.rendererObject as Material); + return material.mainTexture as Texture2D; + } + + static void ApplyPMA (this Texture2D texture, bool applyImmediately = true) { + var pixels = texture.GetPixels(); + for (int i = 0, n = pixels.Length; i < n; i++) { + Color p = pixels[i]; + float a = p.a; + p.r = p.r * a; + p.g = p.g * a; + p.b = p.b * a; + pixels[i] = p; + } + texture.SetPixels(pixels); + if (applyImmediately) + texture.Apply(); + } + #endregion + + static float InverseLerp (float a, float b, float value) { + return (value - a) / (b - a); + } + } + + public static class SkinUtilities { + + #region Skeleton Skin Extensions + /// + /// Convenience method for duplicating a skeleton's current active skin so changes to it will not affect other skeleton instances. . + public static Skin UnshareSkin (this Skeleton skeleton, bool includeDefaultSkin, bool unshareAttachments, AnimationState state = null) { + // 1. Copy the current skin and set the skeleton's skin to the new one. + var newSkin = skeleton.GetClonedSkin("cloned skin", includeDefaultSkin, unshareAttachments, true); + skeleton.SetSkin(newSkin); + + // 2. Apply correct attachments: skeleton.SetToSetupPose + animationState.Apply + if (state != null) { + skeleton.SetToSetupPose(); + state.Apply(skeleton); + } + + // 3. Return unshared skin. + return newSkin; + } + + public static Skin GetClonedSkin (this Skeleton skeleton, string newSkinName, bool includeDefaultSkin = false, bool cloneAttachments = false, bool cloneMeshesAsLinked = true) { + var newSkin = new Skin(newSkinName); // may have null name. Harmless. + var defaultSkin = skeleton.data.DefaultSkin; + var activeSkin = skeleton.skin; + + if (includeDefaultSkin) + defaultSkin.CopyTo(newSkin, true, cloneAttachments, cloneMeshesAsLinked); + + if (activeSkin != null) + activeSkin.CopyTo(newSkin, true, cloneAttachments, cloneMeshesAsLinked); + + return newSkin; + } + #endregion + + /// + /// Gets a shallow copy of the skin. The cloned skin's attachments are shared with the original skin. + public static Skin GetClone (this Skin original) { + var newSkin = new Skin(original.name + " clone"); + var newSkinAttachments = newSkin.Attachments; + + foreach (var a in original.Attachments) + newSkinAttachments[a.Key] = a.Value; + + return newSkin; + } + + /// Adds an attachment to the skin for the specified slot index and name. If the name already exists for the slot, the previous value is replaced. + public static void SetAttachment (this Skin skin, string slotName, string keyName, Attachment attachment, Skeleton skeleton) { + int slotIndex = skeleton.FindSlotIndex(slotName); + if (skeleton == null) throw new System.ArgumentNullException("skeleton", "skeleton cannot be null."); + if (slotIndex == -1) throw new System.ArgumentException(string.Format("Slot '{0}' does not exist in skeleton.", slotName), "slotName"); + skin.AddAttachment(slotIndex, keyName, attachment); + } + + /// Gets an attachment from the skin for the specified slot index and name. + public static Attachment GetAttachment (this Skin skin, string slotName, string keyName, Skeleton skeleton) { + int slotIndex = skeleton.FindSlotIndex(slotName); + if (skeleton == null) throw new System.ArgumentNullException("skeleton", "skeleton cannot be null."); + if (slotIndex == -1) throw new System.ArgumentException(string.Format("Slot '{0}' does not exist in skeleton.", slotName), "slotName"); + return skin.GetAttachment(slotIndex, keyName); + } + + /// Adds an attachment to the skin for the specified slot index and name. If the name already exists for the slot, the previous value is replaced. + public static void SetAttachment (this Skin skin, int slotIndex, string keyName, Attachment attachment) { + skin.AddAttachment(slotIndex, keyName, attachment); + } + + /// Removes the attachment. Returns true if the element is successfully found and removed; otherwise, false. + public static bool RemoveAttachment (this Skin skin, string slotName, string keyName, Skeleton skeleton) { + int slotIndex = skeleton.FindSlotIndex(slotName); + if (skeleton == null) throw new System.ArgumentNullException("skeleton", "skeleton cannot be null."); + if (slotIndex == -1) throw new System.ArgumentException(string.Format("Slot '{0}' does not exist in skeleton.", slotName), "slotName"); + return skin.RemoveAttachment(slotIndex, keyName); + } + + /// Removes the attachment. Returns true if the element is successfully found and removed; otherwise, false. + public static bool RemoveAttachment (this Skin skin, int slotIndex, string keyName) { + return skin.Attachments.Remove(new Skin.AttachmentKeyTuple(slotIndex, keyName)); + } + + public static void Clear (this Skin skin) { + skin.Attachments.Clear(); + } + + public static void Append (this Skin destination, Skin source) { + source.CopyTo(destination, true, false); + } + + public static void CopyTo (this Skin source, Skin destination, bool overwrite, bool cloneAttachments, bool cloneMeshesAsLinked = true) { + var sourceAttachments = source.Attachments; + var destinationAttachments = destination.Attachments; + + if (cloneAttachments) { + if (overwrite) { + foreach (var e in sourceAttachments) + destinationAttachments[e.Key] = e.Value.GetClone(cloneMeshesAsLinked); + } else { + foreach (var e in sourceAttachments) { + if (destinationAttachments.ContainsKey(e.Key)) continue; + destinationAttachments.Add(e.Key, e.Value.GetClone(cloneMeshesAsLinked)); + } + } + } else { + if (overwrite) { + foreach (var e in sourceAttachments) + destinationAttachments[e.Key] = e.Value; + } else { + foreach (var e in sourceAttachments) { + if (destinationAttachments.ContainsKey(e.Key)) continue; + destinationAttachments.Add(e.Key, e.Value); + } + } + } + } + + + } + + public static class AttachmentCloneExtensions { + /// + /// Clones the attachment. + public static Attachment GetClone (this Attachment o, bool cloneMeshesAsLinked) { + var regionAttachment = o as RegionAttachment; + if (regionAttachment != null) + return regionAttachment.GetClone(); + + var meshAttachment = o as MeshAttachment; + if (meshAttachment != null) + return cloneMeshesAsLinked ? meshAttachment.GetLinkedClone() : meshAttachment.GetClone(); + + var boundingBoxAttachment = o as BoundingBoxAttachment; + if (boundingBoxAttachment != null) + return boundingBoxAttachment.GetClone(); + + var pathAttachment = o as PathAttachment; + if (pathAttachment != null) + return pathAttachment.GetClone(); + + var pointAttachment = o as PointAttachment; + if (pointAttachment != null) + return pointAttachment.GetClone(); + + var clippingAttachment = o as ClippingAttachment; + if (clippingAttachment != null) + return clippingAttachment.GetClone(); + + return null; + } + + public static RegionAttachment GetClone (this RegionAttachment o) { + return new RegionAttachment(o.Name + "clone") { + x = o.x, + y = o.y, + rotation = o.rotation, + scaleX = o.scaleX, + scaleY = o.scaleY, + width = o.width, + height = o.height, + + r = o.r, + g = o.g, + b = o.b, + a = o.a, + + Path = o.Path, + RendererObject = o.RendererObject, + regionOffsetX = o.regionOffsetX, + regionOffsetY = o.regionOffsetY, + regionWidth = o.regionWidth, + regionHeight = o.regionHeight, + regionOriginalWidth = o.regionOriginalWidth, + regionOriginalHeight = o.regionOriginalHeight, + uvs = o.uvs.Clone() as float[], + offset = o.offset.Clone() as float[] + }; + } + + public static ClippingAttachment GetClone (this ClippingAttachment o) { + var ca = new ClippingAttachment(o.Name) { + endSlot = o.endSlot + }; + CloneVertexAttachment(o, ca); + return ca; + } + + public static PointAttachment GetClone (this PointAttachment o) { + var pa = new PointAttachment(o.Name) { + rotation = o.rotation, + x = o.x, + y = o.y + }; + return pa; + } + + public static BoundingBoxAttachment GetClone (this BoundingBoxAttachment o) { + var ba = new BoundingBoxAttachment(o.Name); + CloneVertexAttachment(o, ba); + return ba; + } + + public static MeshAttachment GetLinkedClone (this MeshAttachment o, bool inheritDeform = true) { + return o.GetLinkedMesh(o.Name, o.RendererObject as AtlasRegion, inheritDeform, copyOriginalProperties: true); + } + + /// + /// Returns a clone of the MeshAttachment. This will cause Deform animations to stop working unless you explicity set the .parentMesh to the original. + public static MeshAttachment GetClone (this MeshAttachment o) { + var ma = new MeshAttachment(o.Name) { + r = o.r, + g = o.g, + b = o.b, + a = o.a, + + inheritDeform = o.inheritDeform, + + Path = o.Path, + RendererObject = o.RendererObject, + + regionOffsetX = o.regionOffsetX, + regionOffsetY = o.regionOffsetY, + regionWidth = o.regionWidth, + regionHeight = o.regionHeight, + regionOriginalWidth = o.regionOriginalWidth, + regionOriginalHeight = o.regionOriginalHeight, + RegionU = o.RegionU, + RegionV = o.RegionV, + RegionU2 = o.RegionU2, + RegionV2 = o.RegionV2, + RegionRotate = o.RegionRotate, + uvs = o.uvs.Clone() as float[] + }; + + // Linked mesh + if (o.ParentMesh != null) { + // bones, vertices, worldVerticesLength, regionUVs, triangles, HullLength, Edges, Width, Height + ma.ParentMesh = o.ParentMesh; + } else { + CloneVertexAttachment(o, ma); // bones, vertices, worldVerticesLength + ma.regionUVs = o.regionUVs.Clone() as float[]; + ma.triangles = o.triangles.Clone() as int[]; + ma.hulllength = o.hulllength; + + // Nonessential. + ma.Edges = (o.Edges == null) ? null : o.Edges.Clone() as int[]; // Allow absence of Edges array when nonessential data is not exported. + ma.Width = o.Width; + ma.Height = o.Height; + } + + return ma; + } + + public static PathAttachment GetClone (this PathAttachment o) { + var newPathAttachment = new PathAttachment(o.Name) { + lengths = o.lengths.Clone() as float[], + closed = o.closed, + constantSpeed = o.constantSpeed + }; + CloneVertexAttachment(o, newPathAttachment); + + return newPathAttachment; + } + + static void CloneVertexAttachment (VertexAttachment src, VertexAttachment dest) { + dest.worldVerticesLength = src.worldVerticesLength; + if (src.bones != null) + dest.bones = src.bones.Clone() as int[]; + + if (src.vertices != null) + dest.vertices = src.vertices.Clone() as float[]; + } + + + #region Runtime Linked MeshAttachments + /// + /// Returns a new linked mesh linked to this MeshAttachment. It will be mapped to the AtlasRegion provided. + public static MeshAttachment GetLinkedMesh (this MeshAttachment o, string newLinkedMeshName, AtlasRegion region, bool inheritDeform = true, bool copyOriginalProperties = false) { + //if (string.IsNullOrEmpty(attachmentName)) throw new System.ArgumentException("attachmentName cannot be null or empty", "attachmentName"); + if (region == null) throw new System.ArgumentNullException("region"); + + // If parentMesh is a linked mesh, create a link to its parent. Preserves Deform animations. + if (o.ParentMesh != null) + o = o.ParentMesh; + + // 1. NewMeshAttachment (AtlasAttachmentLoader.cs) + var mesh = new MeshAttachment(newLinkedMeshName); + mesh.SetRegion(region, false); + + // 2. (SkeletonJson.cs::ReadAttachment. case: LinkedMesh) + mesh.Path = newLinkedMeshName; + if (copyOriginalProperties) { + mesh.r = o.r; + mesh.g = o.g; + mesh.b = o.b; + mesh.a = o.a; + } else { + mesh.r = 1f; + mesh.g = 1f; + mesh.b = 1f; + mesh.a = 1f; + } + //mesh.ParentMesh property call below sets mesh.Width and mesh.Height + + // 3. Link mesh with parent. (SkeletonJson.cs) + mesh.inheritDeform = inheritDeform; + mesh.ParentMesh = o; + mesh.UpdateUVs(); + + return mesh; + } + + /// + /// Returns a new linked mesh linked to this MeshAttachment. It will be mapped to an AtlasRegion generated from a Sprite. The AtlasRegion will be mapped to a new Material based on the shader. + /// For better caching and batching, use GetLinkedMesh(string, AtlasRegion, bool) + public static MeshAttachment GetLinkedMesh (this MeshAttachment o, Sprite sprite, Shader shader, bool inheritDeform = true, Material materialPropertySource = null) { + var m = new Material(shader); + if (materialPropertySource != null) { + m.CopyPropertiesFromMaterial(materialPropertySource); + m.shaderKeywords = materialPropertySource.shaderKeywords; + } + return o.GetLinkedMesh(sprite.name, sprite.ToAtlasRegion(), inheritDeform); + } + + /// + /// Returns a new linked mesh linked to this MeshAttachment. It will be mapped to an AtlasRegion generated from a Sprite. The AtlasRegion will be mapped to a new Material based on the shader. + /// For better caching and batching, use GetLinkedMesh(string, AtlasRegion, bool) + public static MeshAttachment GetLinkedMesh (this MeshAttachment o, Sprite sprite, Material materialPropertySource, bool inheritDeform = true) { + return o.GetLinkedMesh(sprite, materialPropertySource.shader, inheritDeform, materialPropertySource); + } + #endregion + + #region RemappedClone Convenience Methods + /// + /// Gets a clone of the attachment remapped with a sprite image. + /// The remapped clone. + /// The original attachment. + /// The sprite whose texture to use. + /// The source material used to copy the shader and material properties from. + /// If true, a premultiply alpha clone of the original texture will be created. + /// If true MeshAttachments will be cloned as linked meshes and will inherit animation from the original attachment. + /// If true the size of the original attachment will be followed, instead of using the Sprite size. + public static Attachment GetRemappedClone (this Attachment o, Sprite sprite, Material sourceMaterial, bool premultiplyAlpha = true, bool cloneMeshAsLinked = true, bool useOriginalRegionSize = false) { + var atlasRegion = premultiplyAlpha ? sprite.ToAtlasRegionPMAClone(sourceMaterial) : sprite.ToAtlasRegion(new Material(sourceMaterial) { mainTexture = sprite.texture }); + return o.GetRemappedClone(atlasRegion, cloneMeshAsLinked, useOriginalRegionSize, 1f/sprite.pixelsPerUnit); + } + + /// + /// Gets a clone of the attachment remapped with an atlasRegion image. + /// The remapped clone. + /// The original attachment. + /// Atlas region. + /// If true MeshAttachments will be cloned as linked meshes and will inherit animation from the original attachment. + /// If true the size of the original attachment will be followed, instead of using the Sprite size. + /// Unity units per pixel scale used to scale the atlas region size when not using the original region size. + public static Attachment GetRemappedClone (this Attachment o, AtlasRegion atlasRegion, bool cloneMeshAsLinked = true, bool useOriginalRegionSize = false, float scale = 0.01f) { + var regionAttachment = o as RegionAttachment; + if (regionAttachment != null) { + RegionAttachment newAttachment = regionAttachment.GetClone(); + newAttachment.SetRegion(atlasRegion, false); + if (!useOriginalRegionSize) { + newAttachment.width = atlasRegion.width * scale; + newAttachment.height = atlasRegion.height * scale; + } + newAttachment.UpdateOffset(); + return newAttachment; + } else { + var meshAttachment = o as MeshAttachment; + if (meshAttachment != null) { + MeshAttachment newAttachment = cloneMeshAsLinked ? meshAttachment.GetLinkedClone(cloneMeshAsLinked) : meshAttachment.GetClone(); + newAttachment.SetRegion(atlasRegion); + return newAttachment; + } + } + + return o.GetClone(true); // Non-renderable Attachments will return as normal cloned attachments. + } + #endregion + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs.meta new file mode 100644 index 0000000..68ad280 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/AttachmentTools/AttachmentTools.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8dd46dbf979fcb7459246cd37aad09ef +timeCreated: 1478437807 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower.meta b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower.meta new file mode 100644 index 0000000..56d0730 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 86b1ae3ec8681c646aea49654969b73c +folderAsset: yes +timeCreated: 1455492474 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs new file mode 100644 index 0000000..54df52e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs @@ -0,0 +1,240 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections.Generic; + +namespace Spine.Unity { + + [ExecuteInEditMode] + public class BoundingBoxFollower : MonoBehaviour { + internal static bool DebugMessages = true; + + #region Inspector + public SkeletonRenderer skeletonRenderer; + [SpineSlot(dataField: "skeletonRenderer", containsBoundingBoxes: true)] + public string slotName; + public bool isTrigger; + public bool clearStateOnDisable = true; + #endregion + + Slot slot; + BoundingBoxAttachment currentAttachment; + string currentAttachmentName; + PolygonCollider2D currentCollider; + + public readonly Dictionary colliderTable = new Dictionary(); + public readonly Dictionary nameTable = new Dictionary(); + + public Slot Slot { get { return slot; } } + public BoundingBoxAttachment CurrentAttachment { get { return currentAttachment; } } + public string CurrentAttachmentName { get { return currentAttachmentName; } } + public PolygonCollider2D CurrentCollider { get { return currentCollider; } } + public bool IsTrigger { get { return isTrigger; } } + + void Start () { + Initialize(); + } + + void OnEnable () { + if (skeletonRenderer != null) { + skeletonRenderer.OnRebuild -= HandleRebuild; + skeletonRenderer.OnRebuild += HandleRebuild; + } + + Initialize(); + } + + void HandleRebuild (SkeletonRenderer sr) { + //if (BoundingBoxFollower.DebugMessages) Debug.Log("Skeleton was rebuilt. Repopulating BoundingBoxFollower."); + Initialize(); + } + + /// + /// Initialize and instantiate the BoundingBoxFollower colliders. This is method checks if the BoundingBoxFollower has already been initialized for the skeleton instance and slotName and prevents overwriting unless it detects a new setup. + public void Initialize (bool overwrite = false) { + if (skeletonRenderer == null) + return; + + skeletonRenderer.Initialize(false); + + if (string.IsNullOrEmpty(slotName)) + return; + + // Don't reinitialize if the setup did not change. + if (!overwrite + && + colliderTable.Count > 0 && slot != null // Slot is set and colliders already populated. + && + skeletonRenderer.skeleton == slot.Skeleton // Skeleton object did not change. + && + slotName == slot.data.name // Slot object did not change. + ) + return; + + DisposeColliders(); + + var skeleton = skeletonRenderer.skeleton; + slot = skeleton.FindSlot(slotName); + int slotIndex = skeleton.FindSlotIndex(slotName); + + if (slot == null) { + if (BoundingBoxFollower.DebugMessages) + Debug.LogWarning(string.Format("Slot '{0}' not found for BoundingBoxFollower on '{1}'. (Previous colliders were disposed.)", slotName, this.gameObject.name)); + return; + } + + if (this.gameObject.activeInHierarchy) { + foreach (var skin in skeleton.Data.Skins) + AddSkin(skin, slotIndex); + + if (skeleton.skin != null) + AddSkin(skeleton.skin, slotIndex); + } + + if (BoundingBoxFollower.DebugMessages) { + bool valid = colliderTable.Count != 0; + if (!valid) { + if (this.gameObject.activeInHierarchy) + Debug.LogWarning("Bounding Box Follower not valid! Slot [" + slotName + "] does not contain any Bounding Box Attachments!"); + else + Debug.LogWarning("Bounding Box Follower tried to rebuild as a prefab."); + } + } + } + + void AddSkin (Skin skin, int slotIndex) { + if (skin == null) return; + var attachmentNames = new List(); + skin.FindNamesForSlot(slotIndex, attachmentNames); + + foreach (var skinKey in attachmentNames) { + var attachment = skin.GetAttachment(slotIndex, skinKey); + var boundingBoxAttachment = attachment as BoundingBoxAttachment; + + if (BoundingBoxFollower.DebugMessages && attachment != null && boundingBoxAttachment == null) + Debug.Log("BoundingBoxFollower tried to follow a slot that contains non-boundingbox attachments: " + slotName); + + if (boundingBoxAttachment != null) { + if (!colliderTable.ContainsKey(boundingBoxAttachment)) { + var bbCollider = SkeletonUtility.AddBoundingBoxAsComponent(boundingBoxAttachment, slot, gameObject, isTrigger); + bbCollider.enabled = false; + bbCollider.hideFlags = HideFlags.NotEditable; + bbCollider.isTrigger = IsTrigger; + colliderTable.Add(boundingBoxAttachment, bbCollider); + nameTable.Add(boundingBoxAttachment, skinKey); + } + } + } + } + + void OnDisable () { + if (clearStateOnDisable) + ClearState(); + } + + public void ClearState () { + if (colliderTable != null) + foreach (var col in colliderTable.Values) + col.enabled = false; + + currentAttachment = null; + currentAttachmentName = null; + currentCollider = null; + } + + void DisposeColliders () { + var colliders = GetComponents(); + if (colliders.Length == 0) return; + + if (Application.isEditor) { + if (Application.isPlaying) { + foreach (var c in colliders) { + if (c != null) + Destroy(c); + } + } else { + foreach (var c in colliders) + if (c != null) + DestroyImmediate(c); + } + } else { + foreach (PolygonCollider2D c in colliders) + if (c != null) + Destroy(c); + } + + slot = null; + currentAttachment = null; + currentAttachmentName = null; + currentCollider = null; + colliderTable.Clear(); + nameTable.Clear(); + } + + void LateUpdate () { + if (slot != null && slot.Attachment != currentAttachment) + MatchAttachment(slot.Attachment); + } + + /// Sets the current collider to match attachment. + /// If the attachment is not a bounding box, it will be treated as null. + void MatchAttachment (Attachment attachment) { + var bbAttachment = attachment as BoundingBoxAttachment; + + if (BoundingBoxFollower.DebugMessages && attachment != null && bbAttachment == null) + Debug.LogWarning("BoundingBoxFollower tried to match a non-boundingbox attachment. It will treat it as null."); + + if (currentCollider != null) + currentCollider.enabled = false; + + if (bbAttachment == null) { + currentCollider = null; + currentAttachment = null; + currentAttachmentName = null; + } else { + PolygonCollider2D foundCollider; + colliderTable.TryGetValue(bbAttachment, out foundCollider); + if (foundCollider != null) { + currentCollider = foundCollider; + currentCollider.enabled = true; + currentAttachment = bbAttachment; + currentAttachmentName = nameTable[bbAttachment]; + } else { + currentCollider = null; + currentAttachment = bbAttachment; + currentAttachmentName = null; + if (BoundingBoxFollower.DebugMessages) Debug.LogFormat("Collider for BoundingBoxAttachment named '{0}' was not initialized. It is possibly from a new skin. currentAttachmentName will be null. You may need to call BoundingBoxFollower.Initialize(overwrite: true);", bbAttachment.Name); + } + } + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs.meta new file mode 100644 index 0000000..d81fd14 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0317ee9ba6e1b1e49a030268e026d372 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor.meta new file mode 100644 index 0000000..76ca150 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b7f013ad20f0af34e913e21b44466777 +folderAsset: yes +timeCreated: 1455492480 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs new file mode 100644 index 0000000..94f1e35 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs @@ -0,0 +1,206 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEditor; + +namespace Spine.Unity.Editor { + using Event = UnityEngine.Event; + using Icons = SpineEditorUtilities.Icons; + + [CustomEditor(typeof(BoundingBoxFollower))] + public class BoundingBoxFollowerInspector : UnityEditor.Editor { + SerializedProperty skeletonRenderer, slotName, isTrigger, clearStateOnDisable; + BoundingBoxFollower follower; + bool rebuildRequired = false; + bool addBoneFollower = false; + bool sceneRepaintRequired = false; + bool debugIsExpanded; + + GUIContent addBoneFollowerLabel; + GUIContent AddBoneFollowerLabel { + get { + if (addBoneFollowerLabel == null) addBoneFollowerLabel = new GUIContent("Add Bone Follower", Icons.bone); + return addBoneFollowerLabel; + } + } + + void OnEnable () { + skeletonRenderer = serializedObject.FindProperty("skeletonRenderer"); + slotName = serializedObject.FindProperty("slotName"); + isTrigger = serializedObject.FindProperty("isTrigger"); + clearStateOnDisable = serializedObject.FindProperty("clearStateOnDisable"); + follower = (BoundingBoxFollower)target; + } + + public override void OnInspectorGUI () { + bool isInspectingPrefab = (PrefabUtility.GetPrefabType(target) == PrefabType.Prefab); + + // Try to auto-assign SkeletonRenderer field. + if (skeletonRenderer.objectReferenceValue == null) { + var foundSkeletonRenderer = follower.GetComponentInParent(); + if (foundSkeletonRenderer != null) + Debug.Log("BoundingBoxFollower automatically assigned: " + foundSkeletonRenderer.gameObject.name); + else if (Event.current.type == EventType.Repaint) + Debug.Log("No Spine GameObject detected. Make sure to set this GameObject as a child of the Spine GameObject; or set BoundingBoxFollower's 'Skeleton Renderer' field in the inspector."); + + skeletonRenderer.objectReferenceValue = foundSkeletonRenderer; + serializedObject.ApplyModifiedProperties(); + } + + var skeletonRendererValue = skeletonRenderer.objectReferenceValue as SkeletonRenderer; + if (skeletonRendererValue != null && skeletonRendererValue.gameObject == follower.gameObject) { + using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) { + EditorGUILayout.HelpBox("It's ideal to add BoundingBoxFollower to a separate child GameObject of the Spine GameObject.", MessageType.Warning); + + if (GUILayout.Button(new GUIContent("Move BoundingBoxFollower to new GameObject", Icons.boundingBox), GUILayout.Height(50f))) { + AddBoundingBoxFollowerChild(skeletonRendererValue, follower); + DestroyImmediate(follower); + return; + } + } + EditorGUILayout.Space(); + } + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(skeletonRenderer); + EditorGUILayout.PropertyField(slotName, new GUIContent("Slot")); + if (EditorGUI.EndChangeCheck()) { + serializedObject.ApplyModifiedProperties(); + if (!isInspectingPrefab) + rebuildRequired = true; + } + + using (new SpineInspectorUtility.LabelWidthScope(150f)) { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(isTrigger); + bool triggerChanged = EditorGUI.EndChangeCheck(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(clearStateOnDisable, new GUIContent(clearStateOnDisable.displayName, "Enable this if you are pooling your Spine GameObject")); + bool clearStateChanged = EditorGUI.EndChangeCheck(); + + if (clearStateChanged || triggerChanged) { + serializedObject.ApplyModifiedProperties(); + if (triggerChanged) + foreach (var col in follower.colliderTable.Values) + col.isTrigger = isTrigger.boolValue; + } + } + + if (isInspectingPrefab) { + follower.colliderTable.Clear(); + follower.nameTable.Clear(); + EditorGUILayout.HelpBox("BoundingBoxAttachments cannot be previewed in prefabs.", MessageType.Info); + + // How do you prevent components from being saved into the prefab? No such HideFlag. DontSaveInEditor | DontSaveInBuild does not work. DestroyImmediate does not work. + var collider = follower.GetComponent(); + if (collider != null) Debug.LogWarning("Found BoundingBoxFollower collider components in prefab. These are disposed and regenerated at runtime."); + + } else { + using (new SpineInspectorUtility.BoxScope()) { + if (debugIsExpanded = EditorGUILayout.Foldout(debugIsExpanded, "Debug Colliders")) { + EditorGUI.indentLevel++; + EditorGUILayout.LabelField(string.Format("Attachment Names ({0} PolygonCollider2D)", follower.colliderTable.Count)); + EditorGUI.BeginChangeCheck(); + foreach (var kp in follower.nameTable) { + string attachmentName = kp.Value; + var collider = follower.colliderTable[kp.Key]; + bool isPlaceholder = attachmentName != kp.Key.Name; + collider.enabled = EditorGUILayout.ToggleLeft(new GUIContent(!isPlaceholder ? attachmentName : string.Format("{0} [{1}]", attachmentName, kp.Key.Name), isPlaceholder ? Icons.skinPlaceholder : Icons.boundingBox), collider.enabled); + } + sceneRepaintRequired |= EditorGUI.EndChangeCheck(); + EditorGUI.indentLevel--; + } + } + + } + + bool hasBoneFollower = follower.GetComponent() != null; + if (!hasBoneFollower) { + bool buttonDisabled = follower.Slot == null; + using (new EditorGUI.DisabledGroupScope(buttonDisabled)) { + addBoneFollower |= SpineInspectorUtility.LargeCenteredButton(AddBoneFollowerLabel, true); + EditorGUILayout.Space(); + } + } + + + if (Event.current.type == EventType.Repaint) { + if (addBoneFollower) { + var boneFollower = follower.gameObject.AddComponent(); + boneFollower.skeletonRenderer = skeletonRendererValue; + boneFollower.SetBone(follower.Slot.Data.BoneData.Name); + addBoneFollower = false; + } + + if (sceneRepaintRequired) { + SceneView.RepaintAll(); + sceneRepaintRequired = false; + } + + if (rebuildRequired) { + follower.Initialize(); + rebuildRequired = false; + } + } + } + + #region Menus + [MenuItem("CONTEXT/SkeletonRenderer/Add BoundingBoxFollower GameObject")] + static void AddBoundingBoxFollowerChild (MenuCommand command) { + var go = AddBoundingBoxFollowerChild((SkeletonRenderer)command.context); + Undo.RegisterCreatedObjectUndo(go, "Add BoundingBoxFollower"); + } + #endregion + + static GameObject AddBoundingBoxFollowerChild (SkeletonRenderer sr, BoundingBoxFollower original = null) { + var go = new GameObject("BoundingBoxFollower"); + go.transform.SetParent(sr.transform, false); + var newFollower = go.AddComponent(); + + if (original != null) { + newFollower.slotName = original.slotName; + newFollower.isTrigger = original.isTrigger; + newFollower.clearStateOnDisable = original.clearStateOnDisable; + } + + newFollower.skeletonRenderer = sr; + newFollower.Initialize(); + + + Selection.activeGameObject = go; + EditorGUIUtility.PingObject(go); + return go; + } + + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs.meta new file mode 100644 index 0000000..e42ba77 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/BoundingBoxFollower/Editor/BoundingBoxFollowerInspector.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 670a3cefa3853bd48b5da53a424fd542 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials.meta b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials.meta new file mode 100644 index 0000000..16b542c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a7236dbdc6a4e5a4989483dac97aee0b +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor.meta new file mode 100644 index 0000000..6b6e2f6 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99abd7478ddde384cbf86f2ecd396900 +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs new file mode 100644 index 0000000..e102ad8 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs @@ -0,0 +1,166 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define SPINE_OPTIONAL_MATERIALOVERRIDE + +// Contributed by: Lost Polygon + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; +using Spine.Unity.Modules; + +namespace Spine.Unity.Editor { + + // This script is not intended for use with code. See the readme.txt file in SkeletonRendererCustomMaterials folder to learn more. + [CustomEditor(typeof(SkeletonRendererCustomMaterials))] + public class SkeletonRendererCustomMaterialsInspector : UnityEditor.Editor { + List componentCustomMaterialOverrides, _customMaterialOverridesPrev; + List componentCustomSlotMaterials, _customSlotMaterialsPrev; + SkeletonRendererCustomMaterials component; + + const BindingFlags PrivateInstance = BindingFlags.Instance | BindingFlags.NonPublic; + MethodInfo RemoveCustomMaterialOverrides, RemoveCustomSlotMaterials, SetCustomMaterialOverrides, SetCustomSlotMaterials; + + #region SkeletonRenderer context menu + [MenuItem("CONTEXT/SkeletonRenderer/Add Basic Serialized Custom Materials")] + static void AddSkeletonRendererCustomMaterials (MenuCommand menuCommand) { + var skeletonRenderer = (SkeletonRenderer)menuCommand.context; + var newComponent = skeletonRenderer.gameObject.AddComponent(); + Undo.RegisterCreatedObjectUndo(newComponent, "Add Basic Serialized Custom Materials"); + } + + [MenuItem("CONTEXT/SkeletonRenderer/Add Basic Serialized Custom Materials", true)] + static bool AddSkeletonRendererCustomMaterials_Validate (MenuCommand menuCommand) { + var skeletonRenderer = (SkeletonRenderer)menuCommand.context; + return (skeletonRenderer.GetComponent() == null); + } + #endregion + + void OnEnable () { + Type cm = typeof(SkeletonRendererCustomMaterials); + RemoveCustomMaterialOverrides = cm.GetMethod("RemoveCustomMaterialOverrides", PrivateInstance); + RemoveCustomSlotMaterials = cm.GetMethod("RemoveCustomSlotMaterials", PrivateInstance); + SetCustomMaterialOverrides = cm.GetMethod("SetCustomMaterialOverrides", PrivateInstance); + SetCustomSlotMaterials = cm.GetMethod("SetCustomSlotMaterials", PrivateInstance); + } + + public override void OnInspectorGUI () { + component = (SkeletonRendererCustomMaterials)target; + var skeletonRenderer = component.skeletonRenderer; + + // Draw the default inspector + DrawDefaultInspector(); + + if (serializedObject.isEditingMultipleObjects) + return; + + if (componentCustomMaterialOverrides == null) { + Type cm = typeof(SkeletonRendererCustomMaterials); + componentCustomMaterialOverrides = cm.GetField("customMaterialOverrides", PrivateInstance).GetValue(component) as List; + componentCustomSlotMaterials = cm.GetField("customSlotMaterials", PrivateInstance).GetValue(component) as List; + if (componentCustomMaterialOverrides == null) { + Debug.Log("Reflection failed."); + return; + } + } + + // Fill with current values at start + if (_customMaterialOverridesPrev == null || _customSlotMaterialsPrev == null) { + _customMaterialOverridesPrev = CopyList(componentCustomMaterialOverrides); + _customSlotMaterialsPrev = CopyList(componentCustomSlotMaterials); + } + + // Compare new values with saved. If change is detected: + // store new values, restore old values, remove overrides, restore new values, restore overrides. + + // 1. Store new values + var customMaterialOverridesNew = CopyList(componentCustomMaterialOverrides); + var customSlotMaterialsNew = CopyList(componentCustomSlotMaterials); + + // Detect changes + if (!_customMaterialOverridesPrev.SequenceEqual(customMaterialOverridesNew) || + !_customSlotMaterialsPrev.SequenceEqual(customSlotMaterialsNew)) { + // 2. Restore old values + componentCustomMaterialOverrides.Clear(); + componentCustomSlotMaterials.Clear(); + componentCustomMaterialOverrides.AddRange(_customMaterialOverridesPrev); + componentCustomSlotMaterials.AddRange(_customSlotMaterialsPrev); + + // 3. Remove overrides + RemoveCustomMaterials(); + + // 4. Restore new values + componentCustomMaterialOverrides.Clear(); + componentCustomSlotMaterials.Clear(); + componentCustomMaterialOverrides.AddRange(customMaterialOverridesNew); + componentCustomSlotMaterials.AddRange(customSlotMaterialsNew); + + // 5. Restore overrides + SetCustomMaterials(); + + if (skeletonRenderer != null) + skeletonRenderer.LateUpdate(); + } + + _customMaterialOverridesPrev = CopyList(componentCustomMaterialOverrides); + _customSlotMaterialsPrev = CopyList(componentCustomSlotMaterials); + + if (SpineInspectorUtility.LargeCenteredButton(SpineInspectorUtility.TempContent("Clear and Reapply Changes", tooltip: "Removes all non-serialized overrides in the SkeletonRenderer and reapplies the overrides on this component."))) { + if (skeletonRenderer != null) { + #if SPINE_OPTIONAL_MATERIALOVERRIDE + skeletonRenderer.CustomMaterialOverride.Clear(); + #endif + skeletonRenderer.CustomSlotMaterials.Clear(); + RemoveCustomMaterials(); + SetCustomMaterials(); + skeletonRenderer.LateUpdate(); + } + } + } + + void RemoveCustomMaterials () { + RemoveCustomMaterialOverrides.Invoke(component, null); + RemoveCustomSlotMaterials.Invoke(component, null); + } + + void SetCustomMaterials () { + SetCustomMaterialOverrides.Invoke(component, null); + SetCustomSlotMaterials.Invoke(component, null); + } + + static List CopyList (List list) { + return list.GetRange(0, list.Count); + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs.meta new file mode 100644 index 0000000..1e37a56 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/Editor/SkeletonRendererCustomMaterialsInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e70f7f2a241d6d34aafd6a4a52a368d0 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs new file mode 100644 index 0000000..a8d8a71 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs @@ -0,0 +1,204 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define SPINE_OPTIONAL_MATERIALOVERRIDE + +// Contributed by: Lost Polygon + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace Spine.Unity.Modules { + [ExecuteInEditMode] + public class SkeletonRendererCustomMaterials : MonoBehaviour { + + #region Inspector + public SkeletonRenderer skeletonRenderer; + [SerializeField] protected List customSlotMaterials = new List(); + [SerializeField] protected List customMaterialOverrides = new List(); + + #if UNITY_EDITOR + void Reset () { + skeletonRenderer = GetComponent(); + + // Populate atlas list + if (skeletonRenderer != null && skeletonRenderer.skeletonDataAsset != null) { + AtlasAsset[] atlasAssets = skeletonRenderer.skeletonDataAsset.atlasAssets; + + var initialAtlasMaterialOverrides = new List(); + foreach (AtlasAsset atlasAsset in atlasAssets) { + foreach (Material atlasMaterial in atlasAsset.materials) { + var atlasMaterialOverride = new AtlasMaterialOverride(); + atlasMaterialOverride.overrideDisabled = true; + atlasMaterialOverride.originalMaterial = atlasMaterial; + + initialAtlasMaterialOverrides.Add(atlasMaterialOverride); + } + } + + customMaterialOverrides = initialAtlasMaterialOverrides; + } + } + #endif + #endregion + + void SetCustomSlotMaterials () { + if (skeletonRenderer == null) { + Debug.LogError("skeletonRenderer == null"); + return; + } + + for (int i = 0; i < customSlotMaterials.Count; i++) { + SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i]; + if (slotMaterialOverride.overrideDisabled || string.IsNullOrEmpty(slotMaterialOverride.slotName)) + continue; + + Slot slotObject = skeletonRenderer.skeleton.FindSlot(slotMaterialOverride.slotName); + skeletonRenderer.CustomSlotMaterials[slotObject] = slotMaterialOverride.material; + } + } + + void RemoveCustomSlotMaterials () { + if (skeletonRenderer == null) { + Debug.LogError("skeletonRenderer == null"); + return; + } + + for (int i = 0; i < customSlotMaterials.Count; i++) { + SlotMaterialOverride slotMaterialOverride = customSlotMaterials[i]; + if (string.IsNullOrEmpty(slotMaterialOverride.slotName)) + continue; + + Slot slotObject = skeletonRenderer.skeleton.FindSlot(slotMaterialOverride.slotName); + + Material currentMaterial; + if (!skeletonRenderer.CustomSlotMaterials.TryGetValue(slotObject, out currentMaterial)) + continue; + + // Do not revert the material if it was changed by something else + if (currentMaterial != slotMaterialOverride.material) + continue; + + skeletonRenderer.CustomSlotMaterials.Remove(slotObject); + } + } + + void SetCustomMaterialOverrides () { + if (skeletonRenderer == null) { + Debug.LogError("skeletonRenderer == null"); + return; + } + + #if SPINE_OPTIONAL_MATERIALOVERRIDE + for (int i = 0; i < customMaterialOverrides.Count; i++) { + AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i]; + if (atlasMaterialOverride.overrideDisabled) + continue; + + skeletonRenderer.CustomMaterialOverride[atlasMaterialOverride.originalMaterial] = atlasMaterialOverride.replacementMaterial; + } + #endif + } + + void RemoveCustomMaterialOverrides () { + if (skeletonRenderer == null) { + Debug.LogError("skeletonRenderer == null"); + return; + } + + #if SPINE_OPTIONAL_MATERIALOVERRIDE + for (int i = 0; i < customMaterialOverrides.Count; i++) { + AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i]; + Material currentMaterial; + + if (!skeletonRenderer.CustomMaterialOverride.TryGetValue(atlasMaterialOverride.originalMaterial, out currentMaterial)) + continue; + + // Do not revert the material if it was changed by something else + if (currentMaterial != atlasMaterialOverride.replacementMaterial) + continue; + + skeletonRenderer.CustomMaterialOverride.Remove(atlasMaterialOverride.originalMaterial); + } + #endif + } + + // OnEnable applies the overrides at runtime, and when the editor loads. + void OnEnable () { + if (skeletonRenderer == null) + skeletonRenderer = GetComponent(); + + if (skeletonRenderer == null) { + Debug.LogError("skeletonRenderer == null"); + return; + } + + skeletonRenderer.Initialize(false); + SetCustomMaterialOverrides(); + SetCustomSlotMaterials(); + } + + // OnDisable removes the overrides at runtime, and in the editor when the component is disabled or destroyed. + void OnDisable () { + if (skeletonRenderer == null) { + Debug.LogError("skeletonRenderer == null"); + return; + } + + RemoveCustomMaterialOverrides(); + RemoveCustomSlotMaterials(); + } + + [Serializable] + public struct SlotMaterialOverride : IEquatable { + public bool overrideDisabled; + + [SpineSlot] + public string slotName; + public Material material; + + public bool Equals (SlotMaterialOverride other) { + return overrideDisabled == other.overrideDisabled && slotName == other.slotName && material == other.material; + } + } + + [Serializable] + public struct AtlasMaterialOverride : IEquatable { + public bool overrideDisabled; + public Material originalMaterial; + public Material replacementMaterial; + + public bool Equals (AtlasMaterialOverride other) { + return overrideDisabled == other.overrideDisabled && originalMaterial == other.originalMaterial && replacementMaterial == other.replacementMaterial; + } + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs.meta new file mode 100644 index 0000000..eb50faf --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 26947ae098a8447408d80c0c86e35b48 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.txt b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.txt new file mode 100644 index 0000000..9170775 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.txt @@ -0,0 +1,11 @@ +SkeletonRendererCustomMaterials by LostPolygon +=============================== +This is a basic serialization and inspector implementation for custom material overrides for SkeletonRenderer and its derived classes (SkeletonAnimation, SkeletonAnimator). + +## How to use +Right-click on your SkeletonRenderer and select "Add Basic Serialized Custom Materials". This will add and initialize the SkeletonRendererCustomMaterials to the same object. + +You can use this to store material override settings for SkeletonRenderer instances/prefabs so they will be applied automatically when your scene starts or when the prefab is instantiated. + +This script is not intended for use with code. +To dynamically set materials for your SkeletonRenderer through code, you can directly access `SkeletonRenderer.CustomMaterialOverride` for material array overrides and `SkeletonRenderer.CustomSlotMaterials` for slot material overrides. \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.txt.meta b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.txt.meta new file mode 100644 index 0000000..a979106 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/CustomMaterials/SkeletonRendererCustomMaterials.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d4db6c367e463c4cb5566afc490163c +timeCreated: 1460572571 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost.meta b/Assets/Spine/Assets/spine-unity/Modules/Ghost.meta new file mode 100644 index 0000000..cc48589 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 13193c9d213765f4c85f4c1faa615711 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders.meta b/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders.meta new file mode 100644 index 0000000..0e0bd21 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: a0cee0de78cef7440ae0b5aac39ae971 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders/Spine-Special-Skeleton-Ghost.shader b/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders/Spine-Special-Skeleton-Ghost.shader new file mode 100644 index 0000000..235d76c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders/Spine-Special-Skeleton-Ghost.shader @@ -0,0 +1,59 @@ +// - Unlit + no shadow +// - Premultiplied Alpha Blending (One OneMinusSrcAlpha) +// - Double-sided, no depth + +Shader "Spine/Special/SkeletonGhost" { + Properties { + _Color ("Main Color", Color) = (1,1,1,1) + [NoScaleOffset] _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {} + _TextureFade ("Texture Fade Out", Range(0,1)) = 0 + } + SubShader { + Tags { + "Queue"="Transparent" + "IgnoreProjector"="False" + "RenderType"="Transparent" + } + Fog { Mode Off } + Blend One OneMinusSrcAlpha + ZWrite Off + Cull Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + fixed4 _Color; + fixed _TextureFade; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 color : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 color : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + o.color = v.color; + return o; + } + + fixed4 frag (VertexOutput i) : COLOR { + fixed4 tc = tex2D(_MainTex, i.uv); + tc = fixed4(max(_TextureFade, tc.r), max(_TextureFade, tc.g), max(_TextureFade, tc.b), tc.a); + return tc * ((i.color * _Color) * tc.a); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders/Spine-Special-Skeleton-Ghost.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders/Spine-Special-Skeleton-Ghost.shader.meta new file mode 100644 index 0000000..d24d9a3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost/Shaders/Spine-Special-Skeleton-Ghost.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3873d4699ee8a4b4da8fa6b8c229b94d +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs new file mode 100644 index 0000000..535b14f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs @@ -0,0 +1,186 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using System.Collections.Generic; + +namespace Spine.Unity.Modules { + + [RequireComponent(typeof(SkeletonRenderer))] + public class SkeletonGhost : MonoBehaviour { + // Internal Settings + const HideFlags GhostHideFlags = HideFlags.HideInHierarchy; + const string GhostingShaderName = "Spine/Special/SkeletonGhost"; + + public bool ghostingEnabled = true; + public float spawnRate = 0.05f; + public Color32 color = new Color32(0xFF, 0xFF, 0xFF, 0x00); // default for additive. + [Tooltip("Remember to set color alpha to 0 if Additive is true")] + public bool additive = true; + public int maximumGhosts = 10; + public float fadeSpeed = 10; + public Shader ghostShader; + [Tooltip("0 is Color and Alpha, 1 is Alpha only.")] + [Range(0, 1)] + public float textureFade = 1; + + [Header("Sorting")] + public bool sortWithDistanceOnly; + public float zOffset = 0f; + + float nextSpawnTime; + SkeletonGhostRenderer[] pool; + int poolIndex = 0; + SkeletonRenderer skeletonRenderer; + MeshRenderer meshRenderer; + MeshFilter meshFilter; + + readonly Dictionary materialTable = new Dictionary(); + + void Start () { + if (ghostShader == null) + ghostShader = Shader.Find(GhostingShaderName); + + skeletonRenderer = GetComponent(); + meshFilter = GetComponent(); + meshRenderer = GetComponent(); + nextSpawnTime = Time.time + spawnRate; + pool = new SkeletonGhostRenderer[maximumGhosts]; + for (int i = 0; i < maximumGhosts; i++) { + GameObject go = new GameObject(gameObject.name + " Ghost", typeof(SkeletonGhostRenderer)); + pool[i] = go.GetComponent(); + go.SetActive(false); + go.hideFlags = GhostHideFlags; + } + + var skeletonAnimation = skeletonRenderer as Spine.Unity.IAnimationStateComponent; + if (skeletonAnimation != null) skeletonAnimation.AnimationState.Event += OnEvent; + } + + //SkeletonAnimation + /* + * Int Value: 0 sets ghostingEnabled to false, 1 sets ghostingEnabled to true + * Float Value: Values greater than 0 set the spawnRate equal the float value + * String Value: Pass RGBA hex color values in to set the color property. IE: "A0FF8BFF" + */ + void OnEvent (Spine.TrackEntry trackEntry, Spine.Event e) { + if (e.Data.Name.Equals("Ghosting", System.StringComparison.Ordinal)) { + ghostingEnabled = e.Int > 0; + if (e.Float > 0) + spawnRate = e.Float; + + if (!string.IsNullOrEmpty(e.stringValue)) + this.color = HexToColor(e.String); + } + } + + //SkeletonAnimator + //SkeletonAnimator or Mecanim based animations only support toggling ghostingEnabled. Be sure not to set anything other than the Int param in Spine or String will take priority. + void Ghosting (float val) { + ghostingEnabled = val > 0; + } + + void Update () { + if (!ghostingEnabled) + return; + + if (Time.time >= nextSpawnTime) { + GameObject go = pool[poolIndex].gameObject; + + Material[] materials = meshRenderer.sharedMaterials; + for (int i = 0; i < materials.Length; i++) { + var originalMat = materials[i]; + Material ghostMat; + if (!materialTable.ContainsKey(originalMat)) { + ghostMat = new Material(originalMat); + ghostMat.shader = ghostShader; + ghostMat.color = Color.white; + if (ghostMat.HasProperty("_TextureFade")) + ghostMat.SetFloat("_TextureFade", textureFade); + materialTable.Add(originalMat, ghostMat); + } else { + ghostMat = materialTable[originalMat]; + } + + materials[i] = ghostMat; + } + + var goTransform = go.transform; + goTransform.parent = transform; + + pool[poolIndex].Initialize(meshFilter.sharedMesh, materials, color, additive, fadeSpeed, meshRenderer.sortingLayerID, (sortWithDistanceOnly) ? meshRenderer.sortingOrder : meshRenderer.sortingOrder - 1); + + goTransform.localPosition = new Vector3(0f, 0f, zOffset); + goTransform.localRotation = Quaternion.identity; + goTransform.localScale = Vector3.one; + + goTransform.parent = null; + + poolIndex++; + + if (poolIndex == pool.Length) + poolIndex = 0; + + nextSpawnTime = Time.time + spawnRate; + } + } + + void OnDestroy () { + if (pool != null) { + for (int i = 0; i < maximumGhosts; i++) + if (pool[i] != null) pool[i].Cleanup(); + } + + foreach (var mat in materialTable.Values) + Destroy(mat); + } + + //based on UnifyWiki http://wiki.unity3d.com/index.php?title=HexConverter + static Color32 HexToColor (string hex) { + const System.Globalization.NumberStyles HexStyle = System.Globalization.NumberStyles.HexNumber; + + if (hex.Length < 6) + return Color.magenta; + + hex = hex.Replace("#", ""); + byte r = byte.Parse(hex.Substring(0, 2), HexStyle); + byte g = byte.Parse(hex.Substring(2, 2), HexStyle); + byte b = byte.Parse(hex.Substring(4, 2), HexStyle); + byte a = 0xFF; + if (hex.Length == 8) + a = byte.Parse(hex.Substring(6, 2), HexStyle); + + return new Color32(r, g, b, a); + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs.meta new file mode 100644 index 0000000..32cd44c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhost.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 02f2fa991881c6d419500ccc40ad443f +timeCreated: 1431858330 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: + - ghostShader: {fileID: 4800000, guid: 3873d4699ee8a4b4da8fa6b8c229b94d, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhostRenderer.cs b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhostRenderer.cs new file mode 100644 index 0000000..e9f86c8 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhostRenderer.cs @@ -0,0 +1,133 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using System.Collections; + +namespace Spine.Unity.Modules { + public class SkeletonGhostRenderer : MonoBehaviour { + + public float fadeSpeed = 10; + + Color32[] colors; + Color32 black = new Color32(0, 0, 0, 0); + MeshFilter meshFilter; + MeshRenderer meshRenderer; + + void Awake () { + meshRenderer = gameObject.AddComponent(); + meshFilter = gameObject.AddComponent(); + } + + public void Initialize (Mesh mesh, Material[] materials, Color32 color, bool additive, float speed, int sortingLayerID, int sortingOrder) { + StopAllCoroutines(); + + gameObject.SetActive(true); + meshRenderer.sharedMaterials = materials; + meshRenderer.sortingLayerID = sortingLayerID; + meshRenderer.sortingOrder = sortingOrder; + meshFilter.sharedMesh = Instantiate(mesh); + colors = meshFilter.sharedMesh.colors32; + + if ((color.a + color.r + color.g + color.b) > 0) { + for (int i = 0; i < colors.Length; i++) + colors[i] = color; + } + + fadeSpeed = speed; + + if (additive) + StartCoroutine(FadeAdditive()); + else + StartCoroutine(Fade()); + } + + IEnumerator Fade () { + Color32 c; + for (int t = 0; t < 500; t++) { + bool breakout = true; + for (int i = 0; i < colors.Length; i++) { + c = colors[i]; + if (c.a > 0) + breakout = false; + + colors[i] = Color32.Lerp(c, black, Time.deltaTime * fadeSpeed); + } + meshFilter.sharedMesh.colors32 = colors; + + if (breakout) + break; + + yield return null; + } + + Destroy(meshFilter.sharedMesh); + gameObject.SetActive(false); + } + + IEnumerator FadeAdditive () { + Color32 c; + Color32 black = this.black; + + for (int t = 0; t < 500; t++) { + + bool breakout = true; + for (int i = 0; i < colors.Length; i++) { + c = colors[i]; + black.a = c.a; + if (c.r > 0 || c.g > 0 || c.b > 0) + breakout = false; + + colors[i] = Color32.Lerp(c, black, Time.deltaTime * fadeSpeed); + } + + meshFilter.sharedMesh.colors32 = colors; + + if (breakout) + break; + yield return null; + } + + Destroy(meshFilter.sharedMesh); + + gameObject.SetActive(false); + } + + public void Cleanup () { + if (meshFilter != null && meshFilter.sharedMesh != null) + Destroy(meshFilter.sharedMesh); + + Destroy(gameObject); + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhostRenderer.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhostRenderer.cs.meta new file mode 100644 index 0000000..2f9fb1a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ghost/SkeletonGhostRenderer.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 58e3a9b80754b7545a1dff4d8475b51f +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll.meta b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll.meta new file mode 100644 index 0000000..cb90625 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 90af663b37d994841b7ac03ae30fe2a9 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor.meta new file mode 100644 index 0000000..6cac463 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 7220dc1e8d545e849a2eb63e8633349b +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdoll2DInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdoll2DInspector.cs new file mode 100644 index 0000000..9a75edb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdoll2DInspector.cs @@ -0,0 +1,38 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using UnityEditor; + +namespace Spine.Unity.Modules { + public class SkeletonRagdoll2DInspector {} +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdoll2DInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdoll2DInspector.cs.meta new file mode 100644 index 0000000..0848020 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdoll2DInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b6dd0b99faf3aeb4d803eb9989cb369c +timeCreated: 1431741936 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdollInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdollInspector.cs new file mode 100644 index 0000000..c374f82 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdollInspector.cs @@ -0,0 +1,47 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using UnityEditor; + +namespace Spine.Unity.Modules { + + public class SkeletonRagdollInspector : UnityEditor.Editor { + [CustomPropertyDrawer(typeof(SkeletonRagdoll.LayerFieldAttribute))] + public class LayerFieldPropertyDrawer : PropertyDrawer { + public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) { + property.intValue = EditorGUI.LayerField(position, label, property.intValue); + } + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdollInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdollInspector.cs.meta new file mode 100644 index 0000000..7c478ae --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/Editor/SkeletonRagdollInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c95a670c56447c644a0f062e4cdd448e +timeCreated: 1431740230 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs new file mode 100644 index 0000000..d43fb19 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs @@ -0,0 +1,405 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace Spine.Unity.Modules { + [RequireComponent(typeof(SkeletonRenderer))] + public class SkeletonRagdoll : MonoBehaviour { + static Transform parentSpaceHelper; + + #region Inspector + [Header("Hierarchy")] + [SpineBone] + public string startingBoneName = ""; + [SpineBone] + public List stopBoneNames = new List(); + + [Header("Parameters")] + public bool applyOnStart; + [Tooltip("Warning! You will have to re-enable and tune mix values manually if attempting to remove the ragdoll system.")] + public bool disableIK = true; + public bool disableOtherConstraints = false; + [Space(18)] + [Tooltip("Set RootRigidbody IsKinematic to true when Apply is called.")] + public bool pinStartBone; + [Tooltip("Enable Collision between adjacent ragdoll elements (IE: Neck and Head)")] + public bool enableJointCollision; + public bool useGravity = true; + [Tooltip("If no BoundingBox Attachment is attached to a bone, this becomes the default Width or Radius of a Bone's ragdoll Rigidbody")] + public float thickness = 0.125f; + [Tooltip("Default rotational limit value. Min is negative this value, Max is this value.")] + public float rotationLimit = 20; + public float rootMass = 20; + [Tooltip("If your ragdoll seems unstable or uneffected by limits, try lowering this value.")] + [Range(0.01f, 1f)] + public float massFalloffFactor = 0.4f; + [Tooltip("The layer assigned to all of the rigidbody parts.")] + public int colliderLayer = 0; + [Range(0, 1)] + public float mix = 1; + #endregion + + ISkeletonAnimation targetSkeletonComponent; + Skeleton skeleton; + Dictionary boneTable = new Dictionary(); + Transform ragdollRoot; + public Rigidbody RootRigidbody { get; private set; } + public Bone StartingBone { get; private set; } + Vector3 rootOffset; + public Vector3 RootOffset { get { return this.rootOffset; } } + bool isActive; + public bool IsActive { get { return this.isActive; } } + + IEnumerator Start () { + if (parentSpaceHelper == null) { + parentSpaceHelper = (new GameObject("Parent Space Helper")).transform; + parentSpaceHelper.hideFlags = HideFlags.HideInHierarchy; + } + + targetSkeletonComponent = GetComponent() as ISkeletonAnimation; + if (targetSkeletonComponent == null) Debug.LogError("Attached Spine component does not implement ISkeletonAnimation. This script is not compatible."); + skeleton = targetSkeletonComponent.Skeleton; + + if (applyOnStart) { + yield return null; + Apply(); + } + } + + #region API + public Rigidbody[] RigidbodyArray { + get { + if (!isActive) + return new Rigidbody[0]; + + var rigidBodies = new Rigidbody[boneTable.Count]; + int i = 0; + foreach (Transform t in boneTable.Values) { + rigidBodies[i] = t.GetComponent(); + i++; + } + + return rigidBodies; + } + } + + public Vector3 EstimatedSkeletonPosition { + get { return RootRigidbody.position - rootOffset; } + } + + /// Instantiates the ragdoll simulation and applies its transforms to the skeleton. + public void Apply () { + isActive = true; + mix = 1; + + StartingBone = skeleton.FindBone(startingBoneName); + RecursivelyCreateBoneProxies(StartingBone); + + RootRigidbody = boneTable[StartingBone].GetComponent(); + RootRigidbody.isKinematic = pinStartBone; + RootRigidbody.mass = rootMass; + var boneColliders = new List(); + foreach (var pair in boneTable) { + var b = pair.Key; + var t = pair.Value; + Transform parentTransform; + boneColliders.Add(t.GetComponent()); + if (b == StartingBone) { + ragdollRoot = new GameObject("RagdollRoot").transform; + ragdollRoot.SetParent(transform, false); + if (b == skeleton.RootBone) { // RagdollRoot is skeleton root. + ragdollRoot.localPosition = new Vector3(b.WorldX, b.WorldY, 0); + ragdollRoot.localRotation = Quaternion.Euler(0, 0, GetPropagatedRotation(b)); + } else { + ragdollRoot.localPosition = new Vector3(b.Parent.WorldX, b.Parent.WorldY, 0); + ragdollRoot.localRotation = Quaternion.Euler(0, 0, GetPropagatedRotation(b.Parent)); + } + parentTransform = ragdollRoot; + rootOffset = t.position - transform.position; + } else { + parentTransform = boneTable[b.Parent]; + } + + // Add joint and attach to parent. + var rbParent = parentTransform.GetComponent(); + if (rbParent != null) { + var joint = t.gameObject.AddComponent(); + joint.connectedBody = rbParent; + Vector3 localPos = parentTransform.InverseTransformPoint(t.position); + localPos.x *= 1; + joint.connectedAnchor = localPos; + joint.axis = Vector3.forward; + + joint.GetComponent().mass = joint.connectedBody.mass * massFalloffFactor; + joint.limits = new JointLimits { + min = -rotationLimit, + max = rotationLimit, + }; + joint.useLimits = true; + joint.enableCollision = enableJointCollision; + } + } + + // Ignore collisions among bones. + for (int x = 0; x < boneColliders.Count; x++) { + for (int y = 0; y < boneColliders.Count; y++) { + if (x == y) continue; + Physics.IgnoreCollision(boneColliders[x], boneColliders[y]); + } + } + + // Destroy existing override-mode SkeletonUtilityBones. + var utilityBones = GetComponentsInChildren(); + if (utilityBones.Length > 0) { + var destroyedUtilityBoneNames = new List(); + foreach (var ub in utilityBones) { + if (ub.mode == SkeletonUtilityBone.Mode.Override) { + destroyedUtilityBoneNames.Add(ub.gameObject.name); + Destroy(ub.gameObject); + } + } + if (destroyedUtilityBoneNames.Count > 0) { + string msg = "Destroyed Utility Bones: "; + for (int i = 0; i < destroyedUtilityBoneNames.Count; i++) { + msg += destroyedUtilityBoneNames[i]; + if (i != destroyedUtilityBoneNames.Count - 1) { + msg += ","; + } + } + Debug.LogWarning(msg); + } + } + + // Disable skeleton constraints. + if (disableIK) { + var ikConstraints = skeleton.IkConstraints; + for (int i = 0, n = ikConstraints.Count; i < n; i++) + ikConstraints.Items[i].mix = 0; + } + + if (disableOtherConstraints) { + var transformConstraints = skeleton.transformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + transformConstraints.Items[i].rotateMix = 0; + transformConstraints.Items[i].scaleMix = 0; + transformConstraints.Items[i].shearMix = 0; + transformConstraints.Items[i].translateMix = 0; + } + + var pathConstraints = skeleton.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + pathConstraints.Items[i].rotateMix = 0; + pathConstraints.Items[i].translateMix = 0; + } + } + + targetSkeletonComponent.UpdateWorld += UpdateSpineSkeleton; + } + + /// Transitions the mix value from the current value to a target value. + public Coroutine SmoothMix (float target, float duration) { + return StartCoroutine(SmoothMixCoroutine(target, duration)); + } + + IEnumerator SmoothMixCoroutine (float target, float duration) { + float startTime = Time.time; + float startMix = mix; + while (mix > 0) { + skeleton.SetBonesToSetupPose(); + mix = Mathf.SmoothStep(startMix, target, (Time.time - startTime) / duration); + yield return null; + } + } + + /// Set the transform world position while preserving the ragdoll parts world position. + public void SetSkeletonPosition (Vector3 worldPosition) { + if (!isActive) { + Debug.LogWarning("Can't call SetSkeletonPosition while Ragdoll is not active!"); + return; + } + + Vector3 offset = worldPosition - transform.position; + transform.position = worldPosition; + foreach (Transform t in boneTable.Values) + t.position -= offset; + + UpdateSpineSkeleton(null); + skeleton.UpdateWorldTransform(); + } + + /// Removes the ragdoll instance and effect from the animated skeleton. + public void Remove () { + isActive = false; + foreach (var t in boneTable.Values) + Destroy(t.gameObject); + + Destroy(ragdollRoot.gameObject); + + boneTable.Clear(); + targetSkeletonComponent.UpdateWorld -= UpdateSpineSkeleton; + } + + public Rigidbody GetRigidbody (string boneName) { + var bone = skeleton.FindBone(boneName); + return (bone != null && boneTable.ContainsKey(bone)) ? boneTable[bone].GetComponent() : null; + } + #endregion + + void RecursivelyCreateBoneProxies (Bone b) { + string boneName = b.data.name; + if (stopBoneNames.Contains(boneName)) + return; + + var boneGameObject = new GameObject(boneName); + boneGameObject.layer = colliderLayer; + Transform t = boneGameObject.transform; + boneTable.Add(b, t); + + t.parent = transform; + t.localPosition = new Vector3(b.WorldX, b.WorldY, 0); + t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.shearX); + t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 1); + + // MITCH: You left "todo: proper ragdoll branching" + var colliders = AttachBoundingBoxRagdollColliders(b); + if (colliders.Count == 0) { + float length = b.Data.Length; + if (length == 0) { + var ball = boneGameObject.AddComponent(); + ball.radius = thickness * 0.5f; + } else { + var box = boneGameObject.AddComponent(); + box.size = new Vector3(length, thickness, thickness); + box.center = new Vector3(length * 0.5f, 0); + } + } + var rb = boneGameObject.AddComponent(); + rb.constraints = RigidbodyConstraints.FreezePositionZ; + + foreach (Bone child in b.Children) + RecursivelyCreateBoneProxies(child); + } + + void UpdateSpineSkeleton (ISkeletonAnimation skeletonRenderer) { + bool flipX = skeleton.flipX; + bool flipY = skeleton.flipY; + bool flipXOR = flipX ^ flipY; + bool flipOR = flipX || flipY; + + foreach (var pair in boneTable) { + var b = pair.Key; + var t = pair.Value; + bool isStartingBone = b == StartingBone; + Transform parentTransform = isStartingBone ? ragdollRoot : boneTable[b.Parent]; + Vector3 parentTransformWorldPosition = parentTransform.position; + Quaternion parentTransformWorldRotation = parentTransform.rotation; + + parentSpaceHelper.position = parentTransformWorldPosition; + parentSpaceHelper.rotation = parentTransformWorldRotation; + parentSpaceHelper.localScale = parentTransform.localScale; + + Vector3 boneWorldPosition = t.position; + Vector3 right = parentSpaceHelper.InverseTransformDirection(t.right); + + Vector3 boneLocalPosition = parentSpaceHelper.InverseTransformPoint(boneWorldPosition); + float boneLocalRotation = Mathf.Atan2(right.y, right.x) * Mathf.Rad2Deg; + + if (flipOR) { + if (isStartingBone) { + if (flipX) boneLocalPosition.x *= -1f; + if (flipY) boneLocalPosition.y *= -1f; + + boneLocalRotation = boneLocalRotation * (flipXOR ? -1f : 1f); + if (flipX) boneLocalRotation += 180; + } else { + if (flipXOR) { + boneLocalRotation *= -1f; + boneLocalPosition.y *= -1f; // wtf?? + } + } + } + + b.x = Mathf.Lerp(b.x, boneLocalPosition.x, mix); + b.y = Mathf.Lerp(b.y, boneLocalPosition.y, mix); + b.rotation = Mathf.Lerp(b.rotation, boneLocalRotation, mix); + //b.AppliedRotation = Mathf.Lerp(b.AppliedRotation, boneLocalRotation, mix); + } + } + + List AttachBoundingBoxRagdollColliders (Bone b) { + const string AttachmentNameMarker = "ragdoll"; + var colliders = new List(); + + Transform t = boneTable[b]; + GameObject go = t.gameObject; + var skin = skeleton.Skin ?? skeleton.Data.DefaultSkin; + + var attachments = new List(); + foreach (Slot s in skeleton.Slots) { + if (s.Bone == b) { + skin.FindAttachmentsForSlot(skeleton.Slots.IndexOf(s), attachments); + foreach (var a in attachments) { + var bbAttachment = a as BoundingBoxAttachment; + if (bbAttachment != null) { + if (!a.Name.ToLower().Contains(AttachmentNameMarker)) + continue; + + var bbCollider = go.AddComponent(); + var bounds = SkeletonUtility.GetBoundingBoxBounds(bbAttachment, thickness); + bbCollider.center = bounds.center; + bbCollider.size = bounds.size; + colliders.Add(bbCollider); + } + } + } + } + + return colliders; + } + + static float GetPropagatedRotation (Bone b) { + Bone parent = b.Parent; + float a = b.AppliedRotation; + while (parent != null) { + a += parent.AppliedRotation; + parent = parent.parent; + } + return a; + } + + public class LayerFieldAttribute : PropertyAttribute {} + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs.meta new file mode 100644 index 0000000..f19d680 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 373527d2bf3351348b9fcc499ce9ea23 +timeCreated: 1430552693 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs new file mode 100644 index 0000000..0e9c0ab --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs @@ -0,0 +1,410 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace Spine.Unity.Modules { + [RequireComponent(typeof(SkeletonRenderer))] + public class SkeletonRagdoll2D : MonoBehaviour { + static Transform parentSpaceHelper; + + #region Inspector + [Header("Hierarchy")] + [SpineBone] + public string startingBoneName = ""; + [SpineBone] + public List stopBoneNames = new List(); + + [Header("Parameters")] + public bool applyOnStart; + [Tooltip("Warning! You will have to re-enable and tune mix values manually if attempting to remove the ragdoll system.")] + public bool disableIK = true; + public bool disableOtherConstraints = false; + [Space] + [Tooltip("Set RootRigidbody IsKinematic to true when Apply is called.")] + public bool pinStartBone; + public float gravityScale = 1; + [Tooltip("If no BoundingBox Attachment is attached to a bone, this becomes the default Width or Radius of a Bone's ragdoll Rigidbody")] + public float thickness = 0.125f; + [Tooltip("Default rotational limit value. Min is negative this value, Max is this value.")] + public float rotationLimit = 20; + public float rootMass = 20; + [Tooltip("If your ragdoll seems unstable or uneffected by limits, try lowering this value.")] + [Range(0.01f, 1f)] + public float massFalloffFactor = 0.4f; + [Tooltip("The layer assigned to all of the rigidbody parts.")] + [SkeletonRagdoll.LayerField] + public int colliderLayer = 0; + [Range(0, 1)] + public float mix = 1; + #endregion + + ISkeletonAnimation targetSkeletonComponent; + Skeleton skeleton; + Dictionary boneTable = new Dictionary(); + Transform ragdollRoot; + public Rigidbody2D RootRigidbody { get; private set; } + public Bone StartingBone { get; private set; } + Vector2 rootOffset; + public Vector3 RootOffset { get { return this.rootOffset; } } + bool isActive; + public bool IsActive { get { return this.isActive; } } + + IEnumerator Start () { + if (parentSpaceHelper == null) { + parentSpaceHelper = (new GameObject("Parent Space Helper")).transform; + } + + targetSkeletonComponent = GetComponent() as ISkeletonAnimation; + if (targetSkeletonComponent == null) Debug.LogError("Attached Spine component does not implement ISkeletonAnimation. This script is not compatible."); + skeleton = targetSkeletonComponent.Skeleton; + + if (applyOnStart) { + yield return null; + Apply(); + } + } + + #region API + public Rigidbody2D[] RigidbodyArray { + get { + if (!isActive) + return new Rigidbody2D[0]; + + var rigidBodies = new Rigidbody2D[boneTable.Count]; + int i = 0; + foreach (Transform t in boneTable.Values) { + rigidBodies[i] = t.GetComponent(); + i++; + } + + return rigidBodies; + } + } + + public Vector3 EstimatedSkeletonPosition { + get { return this.RootRigidbody.position - rootOffset; } + } + + /// Instantiates the ragdoll simulation and applies its transforms to the skeleton. + public void Apply () { + isActive = true; + mix = 1; + + Bone startingBone = this.StartingBone = skeleton.FindBone(startingBoneName); + RecursivelyCreateBoneProxies(startingBone); + + RootRigidbody = boneTable[startingBone].GetComponent(); + RootRigidbody.isKinematic = pinStartBone; + RootRigidbody.mass = rootMass; + var boneColliders = new List(); + foreach (var pair in boneTable) { + var b = pair.Key; + var t = pair.Value; + Transform parentTransform; + boneColliders.Add(t.GetComponent()); + if (b == startingBone) { + ragdollRoot = new GameObject("RagdollRoot").transform; + ragdollRoot.SetParent(transform, false); + if (b == skeleton.RootBone) { // RagdollRoot is skeleton root. + ragdollRoot.localPosition = new Vector3(b.WorldX, b.WorldY, 0); + ragdollRoot.localRotation = Quaternion.Euler(0, 0, GetPropagatedRotation(b)); + } else { + ragdollRoot.localPosition = new Vector3(b.Parent.WorldX, b.Parent.WorldY, 0); + ragdollRoot.localRotation = Quaternion.Euler(0, 0, GetPropagatedRotation(b.Parent)); + } + parentTransform = ragdollRoot; + rootOffset = t.position - transform.position; + } else { + parentTransform = boneTable[b.Parent]; + } + + // Add joint and attach to parent. + var rbParent = parentTransform.GetComponent(); + if (rbParent != null) { + var joint = t.gameObject.AddComponent(); + joint.connectedBody = rbParent; + Vector3 localPos = parentTransform.InverseTransformPoint(t.position); + joint.connectedAnchor = localPos; + + joint.GetComponent().mass = joint.connectedBody.mass * massFalloffFactor; + joint.limits = new JointAngleLimits2D { + min = -rotationLimit, + max = rotationLimit + }; + joint.useLimits = true; + } + } + + // Ignore collisions among bones. + for (int x = 0; x < boneColliders.Count; x++) { + for (int y = 0; y < boneColliders.Count; y++) { + if (x == y) continue; + Physics2D.IgnoreCollision(boneColliders[x], boneColliders[y]); + } + } + + // Destroy existing override-mode SkeletonUtility bones. + var utilityBones = GetComponentsInChildren(); + if (utilityBones.Length > 0) { + var destroyedUtilityBoneNames = new List(); + foreach (var ub in utilityBones) { + if (ub.mode == SkeletonUtilityBone.Mode.Override) { + destroyedUtilityBoneNames.Add(ub.gameObject.name); + Destroy(ub.gameObject); + } + } + if (destroyedUtilityBoneNames.Count > 0) { + string msg = "Destroyed Utility Bones: "; + for (int i = 0; i < destroyedUtilityBoneNames.Count; i++) { + msg += destroyedUtilityBoneNames[i]; + if (i != destroyedUtilityBoneNames.Count - 1) { + msg += ","; + } + } + Debug.LogWarning(msg); + } + } + + // Disable skeleton constraints. + if (disableIK) { + var ikConstraints = skeleton.IkConstraints; + for (int i = 0, n = ikConstraints.Count; i < n; i++) + ikConstraints.Items[i].mix = 0; + } + + if (disableOtherConstraints) { + var transformConstraints = skeleton.transformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + transformConstraints.Items[i].rotateMix = 0; + transformConstraints.Items[i].scaleMix = 0; + transformConstraints.Items[i].shearMix = 0; + transformConstraints.Items[i].translateMix = 0; + } + + var pathConstraints = skeleton.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + pathConstraints.Items[i].rotateMix = 0; + pathConstraints.Items[i].translateMix = 0; + } + } + + targetSkeletonComponent.UpdateWorld += UpdateSpineSkeleton; + } + + /// Transitions the mix value from the current value to a target value. + public Coroutine SmoothMix (float target, float duration) { + return StartCoroutine(SmoothMixCoroutine(target, duration)); + } + + IEnumerator SmoothMixCoroutine (float target, float duration) { + float startTime = Time.time; + float startMix = mix; + while (mix > 0) { + skeleton.SetBonesToSetupPose(); + mix = Mathf.SmoothStep(startMix, target, (Time.time - startTime) / duration); + yield return null; + } + } + + /// Set the transform world position while preserving the ragdoll parts world position. + public void SetSkeletonPosition (Vector3 worldPosition) { + if (!isActive) { + Debug.LogWarning("Can't call SetSkeletonPosition while Ragdoll is not active!"); + return; + } + + Vector3 offset = worldPosition - transform.position; + transform.position = worldPosition; + foreach (Transform t in boneTable.Values) + t.position -= offset; + + UpdateSpineSkeleton(null); + skeleton.UpdateWorldTransform(); + } + + /// Removes the ragdoll instance and effect from the animated skeleton. + public void Remove () { + isActive = false; + foreach (var t in boneTable.Values) + Destroy(t.gameObject); + + Destroy(ragdollRoot.gameObject); + boneTable.Clear(); + targetSkeletonComponent.UpdateWorld -= UpdateSpineSkeleton; + } + + public Rigidbody2D GetRigidbody (string boneName) { + var bone = skeleton.FindBone(boneName); + return (bone != null && boneTable.ContainsKey(bone)) ? boneTable[bone].GetComponent() : null; + } + #endregion + + /// Generates the ragdoll simulation's Transform and joint setup. + void RecursivelyCreateBoneProxies (Bone b) { + string boneName = b.data.name; + if (stopBoneNames.Contains(boneName)) + return; + + var boneGameObject = new GameObject(boneName); + boneGameObject.layer = this.colliderLayer; + Transform t = boneGameObject.transform; + boneTable.Add(b, t); + + t.parent = transform; + t.localPosition = new Vector3(b.WorldX, b.WorldY, 0); + t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.shearX); + t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 0); + + // MITCH: You left "todo: proper ragdoll branching" + var colliders = AttachBoundingBoxRagdollColliders(b, boneGameObject, skeleton, this.gravityScale); + if (colliders.Count == 0) { + float length = b.data.length; + if (length == 0) { + var circle = boneGameObject.AddComponent(); + circle.radius = thickness * 0.5f; + } else { + var box = boneGameObject.AddComponent(); + box.size = new Vector2(length, thickness); + box.offset = new Vector2(length * 0.5f, 0); // box.center in UNITY_4 + } + } + + var rb = boneGameObject.GetComponent(); + if (rb == null) rb = boneGameObject.AddComponent(); + rb.gravityScale = this.gravityScale; + + foreach (Bone child in b.Children) + RecursivelyCreateBoneProxies(child); + } + + /// Performed every skeleton animation update to translate Unity Transforms positions into Spine bone transforms. + void UpdateSpineSkeleton (ISkeletonAnimation animatedSkeleton) { + bool flipX = skeleton.flipX; + bool flipY = skeleton.flipY; + bool flipXOR = flipX ^ flipY; + bool flipOR = flipX || flipY; + var startingBone = this.StartingBone; + + foreach (var pair in boneTable) { + var b = pair.Key; + var t = pair.Value; + bool isStartingBone = (b == startingBone); + Transform parentTransform = isStartingBone ? ragdollRoot : boneTable[b.Parent]; + Vector3 parentTransformWorldPosition = parentTransform.position; + Quaternion parentTransformWorldRotation = parentTransform.rotation; + + parentSpaceHelper.position = parentTransformWorldPosition; + parentSpaceHelper.rotation = parentTransformWorldRotation; + parentSpaceHelper.localScale = parentTransform.localScale; + + Vector3 boneWorldPosition = t.position; + Vector3 right = parentSpaceHelper.InverseTransformDirection(t.right); + + Vector3 boneLocalPosition = parentSpaceHelper.InverseTransformPoint(boneWorldPosition); + float boneLocalRotation = Mathf.Atan2(right.y, right.x) * Mathf.Rad2Deg; + if (flipOR) { + if (isStartingBone) { + if (flipX) boneLocalPosition.x *= -1f; + if (flipY) boneLocalPosition.y *= -1f; + + boneLocalRotation = boneLocalRotation * (flipXOR ? -1f : 1f); + if (flipX) boneLocalRotation += 180; + } else { + if (flipXOR) { + boneLocalRotation *= -1f; + boneLocalPosition.y *= -1f; // wtf?? + } + } + } + + b.x = Mathf.Lerp(b.x, boneLocalPosition.x, mix); + b.y = Mathf.Lerp(b.y, boneLocalPosition.y, mix); + b.rotation = Mathf.Lerp(b.rotation, boneLocalRotation, mix); + //b.AppliedRotation = Mathf.Lerp(b.AppliedRotation, boneLocalRotation, mix); + } + } + + static List AttachBoundingBoxRagdollColliders (Bone b, GameObject go, Skeleton skeleton, float gravityScale) { + const string AttachmentNameMarker = "ragdoll"; + var colliders = new List(); + var skin = skeleton.Skin ?? skeleton.Data.DefaultSkin; + + var attachments = new List(); + foreach (Slot s in skeleton.Slots) { + if (s.bone == b) { + skin.FindAttachmentsForSlot(skeleton.Slots.IndexOf(s), attachments); + foreach (var a in attachments) { + var bbAttachment = a as BoundingBoxAttachment; + if (bbAttachment != null) { + if (!a.Name.ToLower().Contains(AttachmentNameMarker)) + continue; + + var bbCollider = SkeletonUtility.AddBoundingBoxAsComponent(bbAttachment, s, go, isTrigger: false, isKinematic: false, gravityScale: gravityScale); + colliders.Add(bbCollider); + } + } + } + } + + return colliders; + } + + static float GetPropagatedRotation (Bone b) { + Bone parent = b.Parent; + float a = b.AppliedRotation; + while (parent != null) { + a += parent.AppliedRotation; + parent = parent.parent; + } + return a; + } + + static Vector3 FlipScale (bool flipX, bool flipY) { + return new Vector3(flipX ? -1f : 1f, flipY ? -1f : 1f, 1f); + } + + #if UNITY_EDITOR + void OnDrawGizmosSelected () { + if (isActive) { + Gizmos.DrawWireSphere(transform.position, thickness * 1.2f); + Vector3 newTransformPos = RootRigidbody.position - rootOffset; + Gizmos.DrawLine(transform.position, newTransformPos); + Gizmos.DrawWireSphere(newTransformPos, thickness * 1.2f); + } + } + #endif + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs.meta new file mode 100644 index 0000000..ed29795 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e74a49a26242a214d9084fde00bfe3ab +timeCreated: 1431497383 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders.meta new file mode 100644 index 0000000..6cf9868 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3e6a65e2576c5b74dabb05c3d3fc2ae4 +folderAsset: yes +timeCreated: 1479258132 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Fill.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Fill.shader new file mode 100644 index 0000000..262b90e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Fill.shader @@ -0,0 +1,57 @@ +// - Unlit + no shadow +// - Premultiplied Alpha Blending (One OneMinusSrcAlpha) +// - Double-sided, no depth + +Shader "Spine/Skeleton Fill" { + Properties { + _FillColor ("FillColor", Color) = (1,1,1,1) + _FillPhase ("FillPhase", Range(0, 1)) = 0 + [NoScaleOffset]_MainTex ("MainTex", 2D) = "white" {} + } + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + Blend One OneMinusSrcAlpha + Cull Off + ZWrite Off + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float4 _FillColor; + float _FillPhase; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o = (VertexOutput)0; + o.uv = v.uv; + o.vertexColor = v.vertexColor; + o.pos = UnityObjectToClipPos(v.vertex); // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 rawColor = tex2D(_MainTex,i.uv); + float finalAlpha = (rawColor.a * i.vertexColor.a); + float3 finalColor = lerp((rawColor.rgb * i.vertexColor.rgb), (_FillColor.rgb * finalAlpha), _FillPhase); // make sure to PMA _FillColor. + return fixed4(finalColor, finalAlpha); + } + ENDCG + } + } + FallBack "Diffuse" +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Fill.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Fill.shader.meta new file mode 100644 index 0000000..c71933e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Fill.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 45495790b394f894a967dbf44489b57b +timeCreated: 1492385797 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Tint.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Tint.shader new file mode 100644 index 0000000..79bacb5 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Tint.shader @@ -0,0 +1,100 @@ +// Spine/Skeleton Tint +// - Two color tint +// - unlit +// - Premultiplied alpha blending +// - No depth, no backface culling, no fog. + +Shader "Spine/Skeleton Tint" { + Properties { + _Color ("Tint Color", Color) = (1,1,1,1) + _Black ("Black Point", Color) = (0,0,0,0) + [NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {} + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + + Fog { Mode Off } + Cull Off + ZWrite Off + Blend One OneMinusSrcAlpha + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float4 _Color; + float4 _Black; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); // replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + o.uv = v.uv; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 texColor = tex2D(_MainTex, i.uv); + return (texColor * i.vertexColor) + float4(((1-texColor.rgb) * _Black.rgb * texColor.a*_Color.a*i.vertexColor.a), 0); + } + ENDCG + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + ZWrite On + ZTest LEqual + + Fog { Mode Off } + Cull Off + Lighting Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + sampler2D _MainTex; + fixed _Cutoff; + + struct VertexOutput { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + VertexOutput vert (appdata_base v) { + VertexOutput o; + o.uv = v.texcoord; + TRANSFER_SHADOW_CASTER(o) + return o; + } + + float4 frag (VertexOutput i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Tint.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Tint.shader.meta new file mode 100644 index 0000000..1efeec6 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Spine-Skeleton-Tint.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 522f03282fd79be47b306e2ef4b593fd +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite.meta new file mode 100644 index 0000000..f997503 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a831a8ed72a588a48b2fb892e7f37371 +folderAsset: yes +timeCreated: 1479419399 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes.meta new file mode 100644 index 0000000..009f684 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4b6fb48f295cd8248a7566315212a3c2 +folderAsset: yes +timeCreated: 1494092464 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderMaths.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderMaths.cginc new file mode 100644 index 0000000..d79c013 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderMaths.cginc @@ -0,0 +1,70 @@ +#ifndef SHADER_MATHS_INCLUDED +#define SHADER_MATHS_INCLUDED + +#include "UnityCG.cginc" + +//////////////////////////////////////// +// Maths functions +// + +inline half3 safeNormalize(half3 inVec) +{ + half dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); +} + +inline float dotClamped(float3 a, float3 b) +{ + #if (SHADER_TARGET < 30 || defined(SHADER_API_PS3)) + return saturate(dot(a, b)); + #else + return max(0.0h, dot(a, b)); + #endif +} + +inline float oneDividedBy(float value) +{ + //Catches NANs + float sign_value = sign(value); + float sign_value_squared = sign_value*sign_value; + return sign_value_squared / ( value + sign_value_squared - 1.0); +} + +inline half pow5 (half x) +{ + return x*x*x*x*x; +} + +inline float4 quat_from_axis_angle(float3 axis, float angleRadians) +{ + float4 qr; + float half_angle = (angleRadians * 0.5); + qr.x = axis.x * sin(half_angle); + qr.y = axis.y * sin(half_angle); + qr.z = axis.z * sin(half_angle); + qr.w = cos(half_angle); + return qr; +} + +inline float3 rotate_vertex_position(float3 position, float3 axis, float angleRadians) +{ + float4 q = quat_from_axis_angle(axis, angleRadians); + float3 v = position.xyz; + return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v); +} + +float3 EncodeFloatRGB(float value) +{ + const float max24int = 256*256*256-1; + float3 decomp = floor( value * float3( max24int/(256*256), max24int/256, max24int ) ) / 255.0; + decomp.z -= decomp.y * 256.0; + decomp.y -= decomp.x * 256.0; + return decomp; +} + +float DecodeFloatRGB(float3 decomp) +{ + return dot( decomp.xyz, float3( 255.0/256, 255.0/(256*256), 255.0/(256*256*256) ) ); +} + +#endif // SHADER_MATHS_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderMaths.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderMaths.cginc.meta new file mode 100644 index 0000000..348f3ac --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderMaths.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e1de23de2025abe4a84ff2edd3f24491 +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderShared.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderShared.cginc new file mode 100644 index 0000000..70cc49e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderShared.cginc @@ -0,0 +1,472 @@ +#ifndef SHADER_SHARED_INCLUDED +#define SHADER_SHARED_INCLUDED + +#include "UnityCG.cginc" + +#ifdef UNITY_INSTANCING_ENABLED + + UNITY_INSTANCING_CBUFFER_START(PerDrawSprite) + // SpriteRenderer.Color while Non-Batched/Instanced. + fixed4 unity_SpriteRendererColorArray[UNITY_INSTANCED_ARRAY_SIZE]; + // this could be smaller but that's how bit each entry is regardless of type + float4 unity_SpriteFlipArray[UNITY_INSTANCED_ARRAY_SIZE]; + UNITY_INSTANCING_CBUFFER_END + + #define _RendererColor unity_SpriteRendererColorArray[unity_InstanceID] + #define _Flip unity_SpriteFlipArray[unity_InstanceID] + +#endif // instancing + +CBUFFER_START(UnityPerDrawSprite) +#ifndef UNITY_INSTANCING_ENABLED + fixed4 _RendererColor; + float4 _Flip; +#endif + float _EnableExternalAlpha; +CBUFFER_END + +//////////////////////////////////////// +// Space functions +// + +inline float4 calculateWorldPos(float4 vertex) +{ + return mul(unity_ObjectToWorld, vertex); +} + +inline float4 calculateLocalPos(float4 vertex) +{ +#ifdef UNITY_INSTANCING_ENABLED + vertex.xy *= _Flip.xy; +#endif + + float4 pos = UnityObjectToClipPos(vertex); + +#ifdef PIXELSNAP_ON + pos = UnityPixelSnap(pos); +#endif + + return pos; +} + +inline half3 calculateWorldNormal(float3 normal) +{ + return UnityObjectToWorldNormal(normal); +} + +//////////////////////////////////////// +// Normal map functions +// + +#if defined(_NORMALMAP) + +uniform sampler2D _BumpMap; +uniform half _BumpScale; + +half3 UnpackScaleNormal(half4 packednormal, half bumpScale) +{ + #if defined(UNITY_NO_DXT5nm) + return packednormal.xyz * 2 - 1; + #else + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + // SM2.0: instruction count limitation + // SM2.0: normal scaler is not supported + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif +} + + +inline half3 calculateWorldTangent(float4 tangent) +{ + return UnityObjectToWorldDir(tangent); +} + +inline half3 calculateWorldBinormal(half3 normalWorld, half3 tangentWorld, float tangentSign) +{ + //When calculating the binormal we have to flip it when the mesh is scaled negatively. + //Normally this would just be unity_WorldTransformParams.w but this isn't set correctly by Unity for its SpriteRenderer meshes so get from objectToWorld matrix scale instead. + half worldTransformSign = sign(unity_ObjectToWorld[0][0] * unity_ObjectToWorld[1][1] * unity_ObjectToWorld[2][2]); + half sign = tangentSign * worldTransformSign; + return cross(normalWorld, tangentWorld) * sign; +} + +inline half3 calculateNormalFromBumpMap(float2 texUV, half3 tangentWorld, half3 binormalWorld, half3 normalWorld) +{ + half3 localNormal = UnpackScaleNormal(tex2D(_BumpMap, texUV), _BumpScale); + half3x3 rotation = half3x3(tangentWorld, binormalWorld, normalWorld); + half3 normal = normalize(mul(localNormal, rotation)); + return normal; +} + +#endif // _NORMALMAP + +//////////////////////////////////////// +// Blending functions +// + +inline fixed4 calculateLitPixel(fixed4 texureColor, fixed4 color, fixed3 lighting) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHABLEND_ON) + //Normal Alpha + finalPixel.a = texureColor.a * color.a; + finalPixel.rgb = texureColor.rgb * color.rgb * (lighting * finalPixel.a); +#elif defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor * color; + finalPixel.rgb *= lighting * color.a; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = texureColor * color; + finalPixel.rgb *= lighting; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * color.rgb * lighting * 2.0f; + finalPixel.a = color.a * texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f * color; + finalPixel.rgb *= lighting * color.a; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = texureColor * color; + finalPixel.rgb *= lighting * finalPixel.a; +#else + //Opaque + finalPixel.a = 1; + finalPixel.rgb = texureColor.rgb * color.rgb * lighting; +#endif + + return finalPixel; +} + +inline fixed4 calculateLitPixel(fixed4 texureColor, fixed3 lighting) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHABLEND_ON) + //Normal Alpha + finalPixel.a = texureColor.a; + finalPixel.rgb = texureColor.rgb * (lighting * finalPixel.a); +#elif defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor; + finalPixel.rgb *= lighting; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = texureColor; + finalPixel.rgb *= lighting; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * lighting * 2.0f; + finalPixel.a = texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f; + finalPixel.rgb *= lighting; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = texureColor; + finalPixel.rgb *= lighting * finalPixel.a; +#else + //Opaque + finalPixel.a = 1; + finalPixel.rgb = texureColor.rgb * lighting; +#endif + + return finalPixel; +} + +inline fixed4 calculateAdditiveLitPixel(fixed4 texureColor, fixed4 color, fixed3 lighting) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHABLEND_ON) || defined(_MULTIPLYBLEND) || defined(_MULTIPLYBLEND_X2) || defined(_ADDITIVEBLEND) || defined(_ADDITIVEBLEND_SOFT) + //Normal Alpha, Additive and Multiply modes + finalPixel.rgb = (texureColor.rgb * lighting * color.rgb) * (texureColor.a * color.a); + finalPixel.a = 1.0; +#elif defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel.rgb = texureColor.rgb * lighting * color.rgb * color.a; + finalPixel.a = 1.0; +#else + //Opaque + finalPixel.rgb = texureColor.rgb * lighting * color.rgb; + finalPixel.a = 1.0; +#endif + + return finalPixel; +} + +inline fixed4 calculateAdditiveLitPixel(fixed4 texureColor, fixed3 lighting) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHABLEND_ON) || defined(_MULTIPLYBLEND) || defined(_MULTIPLYBLEND_X2) || defined(_ADDITIVEBLEND) || defined(_ADDITIVEBLEND_SOFT) + //Normal Alpha, Additive and Multiply modes + finalPixel.rgb = (texureColor.rgb * lighting) * texureColor.a; + finalPixel.a = 1.0; +#else + //Pre multiplied alpha and Opaque + finalPixel.rgb = texureColor.rgb * lighting; + finalPixel.a = 1.0; +#endif + + return finalPixel; +} + +inline fixed4 calculatePixel(fixed4 texureColor, fixed4 color) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHABLEND_ON) + //Normal Alpha + finalPixel.a = texureColor.a * color.a; + finalPixel.rgb = (texureColor.rgb * color.rgb) * finalPixel.a; +#elif defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor * color; + finalPixel.rgb *= color.a; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = color * texureColor; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * color.rgb * 2.0f; + finalPixel.a = color.a * texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f * color; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = color * texureColor; + finalPixel.rgb *= finalPixel.a; +#else + //Opaque + finalPixel.a = 1; + finalPixel.rgb = texureColor.rgb * color.rgb; +#endif + + return finalPixel; +} + +inline fixed4 calculatePixel(fixed4 texureColor) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHABLEND_ON) + //Normal Alpha + finalPixel.a = texureColor.a; + finalPixel.rgb = texureColor.rgb * finalPixel.a; +#elif defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = texureColor; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * 2.0f; + finalPixel.a = texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = texureColor; + finalPixel.rgb *= finalPixel.a; +#else + //Opaque + finalPixel.a = 1; + finalPixel.rgb = texureColor.rgb; +#endif + + return finalPixel; +} + +//////////////////////////////////////// +// Alpha Clipping +// + +#if defined(_ALPHA_CLIP) + +uniform fixed _Cutoff; + +#define ALPHA_CLIP(pixel, color) clip((pixel.a * color.a) - _Cutoff); + +#else + +#define ALPHA_CLIP(pixel, color) + +#endif + +//////////////////////////////////////// +// Color functions +// + +uniform fixed4 _Color; + +inline fixed4 calculateVertexColor(fixed4 color) +{ + return color * _Color; +} + +#if defined(_COLOR_ADJUST) + +uniform float _Hue; +uniform float _Saturation; +uniform float _Brightness; +uniform fixed4 _OverlayColor; + +float3 rgb2hsv(float3 c) +{ + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +float3 hsv2rgb(float3 c) +{ + c = float3(c.x, clamp(c.yz, 0.0, 1.0)); + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +inline fixed4 adjustColor(fixed4 color) +{ + float3 hsv = rgb2hsv(color.rgb); + + hsv.x += _Hue; + hsv.y *= _Saturation; + hsv.z *= _Brightness; + + color.rgb = hsv2rgb(hsv); + + return color; +} + +#define COLORISE(pixel) pixel.rgb = lerp(pixel.rgb, _OverlayColor.rgb, _OverlayColor.a * pixel.a); +#define COLORISE_ADDITIVE(pixel) pixel.rgb = ((1.0-_OverlayColor.a) * pixel.rgb); + +#else // !_COLOR_ADJUST + +#define COLORISE(pixel) +#define COLORISE_ADDITIVE(pixel) + +#endif // !_COLOR_ADJUST + +//////////////////////////////////////// +// Fog +// + +#if defined(_FOG) && (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)) + +inline fixed4 applyFog(fixed4 pixel, float1 fogCoord) +{ +#if defined(_ADDITIVEBLEND) || defined(_ADDITIVEBLEND_SOFT) + //In additive mode blend from clear to black based on luminance + float luminance = pixel.r * 0.3 + pixel.g * 0.59 + pixel.b * 0.11; + fixed4 fogColor = lerp(fixed4(0,0,0,0), fixed4(0,0,0,1), luminance); +#elif defined(_MULTIPLYBLEND) + //In multiplied mode fade to white based on inverse luminance + float luminance = pixel.r * 0.3 + pixel.g * 0.59 + pixel.b * 0.11; + fixed4 fogColor = lerp(fixed4(1,1,1,1), fixed4(0,0,0,0), luminance); +#elif defined(_MULTIPLYBLEND_X2) + //In multipliedx2 mode fade to grey based on inverse luminance + float luminance = pixel.r * 0.3 + pixel.g * 0.59 + pixel.b * 0.11; + fixed4 fogColor = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), fixed4(0,0,0,0), luminance); +#elif defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON) + //In alpha blended modes blend to fog color based on pixel alpha + fixed4 fogColor = lerp(fixed4(0,0,0,0), unity_FogColor, pixel.a); +#else + //In opaque mode just return fog color; + fixed4 fogColor = unity_FogColor; +#endif + + UNITY_APPLY_FOG_COLOR(fogCoord, pixel, fogColor); + + return pixel; +} + +#define APPLY_FOG(pixel, input) pixel = applyFog(pixel, input.fogCoord); + +#define APPLY_FOG_ADDITIVE(pixel, input) \ + UNITY_APPLY_FOG_COLOR(input.fogCoord, pixel.rgb, fixed4(0,0,0,0)); // fog towards black in additive pass + +#else + +#define APPLY_FOG(pixel, input) +#define APPLY_FOG_ADDITIVE(pixel, input) + +#endif + +//////////////////////////////////////// +// Texture functions +// + +uniform sampler2D _MainTex; + +#if ETC1_EXTERNAL_ALPHA +//External alpha texture for ETC1 compression +uniform sampler2D _AlphaTex; +#endif //ETC1_EXTERNAL_ALPHA + +#if _TEXTURE_BLEND +uniform sampler2D _BlendTex; +uniform float _BlendAmount; + +inline fixed4 calculateBlendedTexturePixel(float2 texcoord) +{ + return (1.0-_BlendAmount) * tex2D(_MainTex, texcoord) + _BlendAmount * tex2D(_BlendTex, texcoord); +} +#endif // _TEXTURE_BLEND + +inline fixed4 calculateTexturePixel(float2 texcoord) +{ + fixed4 pixel; + +#if _TEXTURE_BLEND + pixel = calculateBlendedTexturePixel(texcoord); +#else + pixel = tex2D(_MainTex, texcoord); +#endif // !_TEXTURE_BLEND + +#if ETC1_EXTERNAL_ALPHA + fixed4 alpha = tex2D (_AlphaTex, texcoord); + pixel.a = lerp (pixel.a, alpha.r, _EnableExternalAlpha); +#endif + +#if defined(_COLOR_ADJUST) + pixel = adjustColor(pixel); +#endif // _COLOR_ADJUST + + return pixel; +} + +uniform fixed4 _MainTex_ST; + +inline float2 calculateTextureCoord(float4 texcoord) +{ + return TRANSFORM_TEX(texcoord, _MainTex); +} + +#endif // SHADER_SHARED_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderShared.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderShared.cginc.meta new file mode 100644 index 0000000..7e1ddf1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/ShaderShared.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c18c5cab567666f4d8c5b2bd4e61390b +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteLighting.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteLighting.cginc new file mode 100644 index 0000000..018ca93 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteLighting.cginc @@ -0,0 +1,200 @@ +#ifndef SPRITE_LIGHTING_INCLUDED +#define SPRITE_LIGHTING_INCLUDED + +//Check for using mesh normals +#if !defined(_FIXED_NORMALS_VIEWSPACE) && !defined(_FIXED_NORMALS_VIEWSPACE_BACKFACE) && !defined(_FIXED_NORMALS_MODELSPACE) && !defined(_FIXED_NORMALS_MODELSPACE_BACKFACE) +#define MESH_NORMALS +#endif + +//Check for fixing backfacing tangents +#if defined(_FIXED_NORMALS_VIEWSPACE_BACKFACE) || defined(_FIXED_NORMALS_MODELSPACE_BACKFACE) +#define FIXED_NORMALS_BACKFACE_RENDERING +#endif + +//////////////////////////////////////// +// Vertex structs +// + +struct VertexInput +{ + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; + float4 color : COLOR; +#if defined(MESH_NORMALS) + float3 normal : NORMAL; +#endif // _FIXED_NORMALS +#if defined(_NORMALMAP) + float4 tangent : TANGENT; +#endif // _NORMALMAP + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +//////////////////////////////////////// +// Normal functions +// + +uniform float4 _FixedNormal = float4(0, 0, 1, 1); + +inline float3 getFixedNormal() +{ + return _FixedNormal.xyz; +} + +inline float calculateBackfacingSign(float3 worldPos) +{ + //If we're using fixed normals and mesh is facing away from camera, flip tangentSign + //Unity uses a left handed coordinate system so camera always looks down the negative z axis + float3 cameraForward = float3(0,0,-1); + float3 meshWorldForward = mul((float3x3)unity_ObjectToWorld, cameraForward); + float3 toCamera = _WorldSpaceCameraPos - worldPos; + return sign(dot(toCamera, meshWorldForward)); +} + +inline half3 calculateSpriteWorldNormal(VertexInput vertex, float backFaceSign) +{ +#if defined(MESH_NORMALS) + + return calculateWorldNormal(vertex.normal); + +#else // !MESH_NORMALS + + float3 normal = getFixedNormal(); + +#if defined(_FIXED_NORMALS_VIEWSPACE) || defined(_FIXED_NORMALS_VIEWSPACE_BACKFACE) + //View space fixed normal + //Rotate fixed normal by inverse view matrix to convert the fixed normal into world space + float3x3 invView = transpose((float3x3)UNITY_MATRIX_V); + return normalize(mul(invView, normal)); +#else + //Model space fixed normal. +#if defined(FIXED_NORMALS_BACKFACE_RENDERING) + //If back face rendering is enabled and the sprite is facing away from the camera (ie we're rendering the backface) then need to flip the normal + normal *= backFaceSign; +#endif + return calculateWorldNormal(normal); +#endif + +#endif // !MESH_NORMALS +} + +inline half3 calculateSpriteViewNormal(VertexInput vertex, float backFaceSign) +{ +#if defined(MESH_NORMALS) + + return normalize(mul((float3x3)UNITY_MATRIX_IT_MV, vertex.normal)); + +#else // !MESH_NORMALS + + float3 normal = getFixedNormal(); + +#if defined(_FIXED_NORMALS_VIEWSPACE) || defined(_FIXED_NORMALS_VIEWSPACE_BACKFACE) + //View space fixed normal + return normal; +#else + //Model space fixed normal +#if defined(FIXED_NORMALS_BACKFACE_RENDERING) + //If back face rendering is enabled and the sprite is facing away from the camera (ie we're rendering the backface) then need to flip the normal + normal *= backFaceSign; +#endif + return normalize(mul((float3x3)UNITY_MATRIX_IT_MV, normal)); +#endif + +#endif // !MESH_NORMALS +} + +//////////////////////////////////////// +// Normal map functions +// + +#if defined(_NORMALMAP) + +inline half3 calculateSpriteWorldBinormal(VertexInput vertex, half3 normalWorld, half3 tangentWorld, float backFaceSign) +{ + float tangentSign = vertex.tangent.w; + +#if defined(FIXED_NORMALS_BACKFACE_RENDERING) + tangentSign *= backFaceSign; +#endif + + return calculateWorldBinormal(normalWorld, tangentWorld, tangentSign); +} + +#endif // _NORMALMAP + +#if defined(_DIFFUSE_RAMP) + + +//////////////////////////////////////// +// Diffuse ramp functions +// + +//Disable for softer, more traditional diffuse ramping +#define HARD_DIFFUSE_RAMP + +uniform sampler2D _DiffuseRamp; + +inline fixed3 calculateDiffuseRamp(float ramp) +{ + return tex2D(_DiffuseRamp, float2(ramp, ramp)).rgb; +} + +inline fixed3 calculateRampedDiffuse(fixed3 lightColor, float attenuation, float angleDot) +{ + float d = angleDot * 0.5 + 0.5; +#if defined(HARD_DIFFUSE_RAMP) + half3 ramp = calculateDiffuseRamp(d * attenuation * 2); + return lightColor * ramp; +#else + half3 ramp = calculateDiffuseRamp(d); + return lightColor * ramp * (attenuation * 2); +#endif +} +#endif // _DIFFUSE_RAMP + +//////////////////////////////////////// +// Rim Lighting functions +// + +#ifdef _RIM_LIGHTING + +uniform float _RimPower; +uniform fixed4 _RimColor; + +inline fixed3 applyRimLighting(fixed3 posWorld, fixed3 normalWorld, fixed4 pixel) : SV_Target +{ + fixed3 viewDir = normalize(_WorldSpaceCameraPos - posWorld); + float invDot = 1.0 - saturate(dot(normalWorld, viewDir)); + float rimPower = pow(invDot, _RimPower); + float rim = saturate(rimPower * _RimColor.a); + +#if defined(_DIFFUSE_RAMP) + rim = calculateDiffuseRamp(rim).r; +#endif + + return lerp(pixel.rgb, _RimColor.xyz * pixel.a, rim); +} + +#endif //_RIM_LIGHTING + +//////////////////////////////////////// +// Emission functions +// + +#ifdef _EMISSION + +uniform sampler2D _EmissionMap; +uniform fixed4 _EmissionColor; +uniform float _EmissionPower; + + +#define APPLY_EMISSION(diffuse, uv) diffuse += tex2D(_EmissionMap, uv).rgb * _EmissionColor.rgb * _EmissionPower; +#define APPLY_EMISSION_SPECULAR(pixel, uv) pixel.rgb += (tex2D(_EmissionMap, uv).rgb * _EmissionColor.rgb * _EmissionPower) * pixel.a; + +#else //!_EMISSION + +#define APPLY_EMISSION(diffuse, uv) +#define APPLY_EMISSION_SPECULAR(pixel, uv) + +#endif //!_EMISSION + +#endif // SPRITE_LIGHTING_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteLighting.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteLighting.cginc.meta new file mode 100644 index 0000000..b25bff3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteLighting.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0cfb891658099ca4bb0c9544c08e60f9 +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc new file mode 100644 index 0000000..8c763f4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc @@ -0,0 +1,252 @@ +#ifndef SPRITE_PIXEL_LIGHTING_INCLUDED +#define SPRITE_PIXEL_LIGHTING_INCLUDED + +#include "ShaderShared.cginc" +#include "SpriteLighting.cginc" +#include "SpriteSpecular.cginc" +#include "AutoLight.cginc" + +//////////////////////////////////////// +// Defines +// + +//////////////////////////////////////// +// Vertex output struct +// + +#if defined(_NORMALMAP) + #define _VERTEX_LIGHTING_INDEX TEXCOORD5 + #define _LIGHT_COORD_INDEX_0 6 + #define _LIGHT_COORD_INDEX_1 7 + #define _FOG_COORD_INDEX 8 +#else + #define _VERTEX_LIGHTING_INDEX TEXCOORD3 + #define _LIGHT_COORD_INDEX_0 4 + #define _LIGHT_COORD_INDEX_1 5 + #define _FOG_COORD_INDEX 6 +#endif // _NORMALMAP + +struct VertexOutput +{ + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 posWorld : TEXCOORD1; + half3 normalWorld : TEXCOORD2; +#if defined(_NORMALMAP) + half3 tangentWorld : TEXCOORD3; + half3 binormalWorld : TEXCOORD4; +#endif // _NORMALMAP + fixed3 vertexLighting : _VERTEX_LIGHTING_INDEX; + LIGHTING_COORDS(_LIGHT_COORD_INDEX_0, _LIGHT_COORD_INDEX_1) +#if defined(_FOG) + UNITY_FOG_COORDS(_FOG_COORD_INDEX) +#endif // _FOG + + UNITY_VERTEX_OUTPUT_STEREO +}; + +//////////////////////////////////////// +// Light calculations +// + +uniform fixed4 _LightColor0; + +inline fixed3 calculateLightDiffuse(VertexOutput input, float3 normalWorld, inout fixed4 albedo) +{ + //For directional lights _WorldSpaceLightPos0.w is set to zero + float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w); + + float attenuation = LIGHT_ATTENUATION(input); + float angleDot = max(0, dot(normalWorld, lightWorldDirection)); + +#if defined(_DIFFUSE_RAMP) + fixed3 lightDiffuse = calculateRampedDiffuse(_LightColor0.rgb, attenuation, angleDot); +#else + fixed3 lightDiffuse = _LightColor0.rgb * (attenuation * angleDot); +#endif // _DIFFUSE_RAMP + + return lightDiffuse; +} + +inline float3 calculateNormalWorld(VertexOutput input) +{ +#if defined(_NORMALMAP) + return calculateNormalFromBumpMap(input.texcoord, input.tangentWorld, input.binormalWorld, input.normalWorld); +#else + return input.normalWorld; +#endif +} + +fixed3 calculateVertexLighting(float3 posWorld, float3 normalWorld) +{ + fixed3 vertexLighting = fixed3(0,0,0); + +#ifdef VERTEXLIGHT_ON + //Get approximated illumination from non-important point lights + vertexLighting = Shade4PointLights ( unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, + unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb, + unity_4LightAtten0, posWorld, normalWorld) * 0.5; +#endif + + return vertexLighting; +} + +fixed3 calculateAmbientLight(half3 normalWorld) +{ +#if defined(_SPHERICAL_HARMONICS) + fixed3 ambient = ShadeSH9(half4(normalWorld, 1.0)); +#else + fixed3 ambient = unity_AmbientSky.rgb; +#endif + return ambient; +} + +#if defined(SPECULAR) + +fixed4 calculateSpecularLight(SpecularCommonData s, float3 viewDir, float3 normal, float3 lightDir, float3 lightColor, half3 ambient) +{ + SpecularLightData data = calculatePhysicsBasedSpecularLight (s.specColor, s.oneMinusReflectivity, s.smoothness, normal, viewDir, lightDir, lightColor, ambient, unity_IndirectSpecColor.rgb); + fixed4 pixel = calculateLitPixel(fixed4(s.diffColor, s.alpha), data.lighting); + pixel.rgb += data.specular * s.alpha; + return pixel; +} + +fixed4 calculateSpecularLightAdditive(SpecularCommonData s, float3 viewDir, float3 normal, float3 lightDir, float3 lightColor) +{ + SpecularLightData data = calculatePhysicsBasedSpecularLight (s.specColor, s.oneMinusReflectivity, s.smoothness, normal, viewDir, lightDir, lightColor, half3(0,0,0), half3(0,0,0)); + fixed4 pixel = calculateAdditiveLitPixel(fixed4(s.diffColor, s.alpha), data.lighting); + pixel.rgb += data.specular * s.alpha; + return pixel; +} + +#endif //SPECULAR + +//////////////////////////////////////// +// Vertex program +// + +VertexOutput vert(VertexInput v) +{ + VertexOutput output; + + UNITY_SETUP_INSTANCE_ID(input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + output.pos = calculateLocalPos(v.vertex); + output.color = calculateVertexColor(v.color); + output.texcoord = calculateTextureCoord(v.texcoord); + output.posWorld = calculateWorldPos(v.vertex); + + float backFaceSign = 1; +#if defined(FIXED_NORMALS_BACKFACE_RENDERING) + backFaceSign = calculateBackfacingSign(output.posWorld.xyz); +#endif + + output.normalWorld = calculateSpriteWorldNormal(v, backFaceSign); + output.vertexLighting = calculateVertexLighting(output.posWorld, output.normalWorld); + +#if defined(_NORMALMAP) + output.tangentWorld = calculateWorldTangent(v.tangent); + output.binormalWorld = calculateSpriteWorldBinormal(v, output.normalWorld, output.tangentWorld, backFaceSign); +#endif + + TRANSFER_VERTEX_TO_FRAGMENT(output) + +#if defined(_FOG) + UNITY_TRANSFER_FOG(output,output.pos); +#endif // _FOG + + return output; +} + +//////////////////////////////////////// +// Fragment programs +// + +fixed4 fragBase(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord); + ALPHA_CLIP(texureColor, input.color) + + //Get normal direction + fixed3 normalWorld = calculateNormalWorld(input); + + //Get Ambient diffuse + fixed3 ambient = calculateAmbientLight(normalWorld); + + +#if defined(SPECULAR) + + //For directional lights _WorldSpaceLightPos0.w is set to zero + float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w); + float attenuation = LIGHT_ATTENUATION(input); + + //Returns pixel lit by light, texture color should inlcluded alpha + half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz); + fixed4 pixel = calculateSpecularLight(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation, ambient + input.vertexLighting); + + APPLY_EMISSION_SPECULAR(pixel, input.texcoord) + +#else + + //Get primary pixel light diffuse + fixed3 diffuse = calculateLightDiffuse(input, normalWorld, texureColor); + + //Combine along with vertex lighting for the base lighting pass + fixed3 lighting = ambient + diffuse + input.vertexLighting; + + APPLY_EMISSION(lighting, input.texcoord) + + fixed4 pixel = calculateLitPixel(texureColor, input.color, lighting); + +#endif + +#if defined(_RIM_LIGHTING) + pixel.rgb = applyRimLighting(input.posWorld, normalWorld, pixel); +#endif + + COLORISE(pixel) + APPLY_FOG(pixel, input) + + return pixel; +} + +fixed4 fragAdd(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord); + +#if defined(_COLOR_ADJUST) + texureColor = adjustColor(texureColor); +#endif // _COLOR_ADJUST + + ALPHA_CLIP(texureColor, input.color) + + //Get normal direction + fixed3 normalWorld = calculateNormalWorld(input); + +#if defined(SPECULAR) + + //For directional lights _WorldSpaceLightPos0.w is set to zero + float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w); + float attenuation = LIGHT_ATTENUATION(input); + + half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz); + fixed4 pixel = calculateSpecularLightAdditive(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation); + +#else + + //Get light diffuse + fixed3 lighting = calculateLightDiffuse(input, normalWorld, texureColor); + fixed4 pixel = calculateAdditiveLitPixel(texureColor, input.color, lighting); + +#endif + + COLORISE_ADDITIVE(pixel) + APPLY_FOG_ADDITIVE(pixel, input) + + return pixel; +} + + +#endif // SPRITE_PIXEL_LIGHTING_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc.meta new file mode 100644 index 0000000..73da285 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpritePixelLighting.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7ffc57e05c42ec748838bea0a3aff9f9 +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteShadows.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteShadows.cginc new file mode 100644 index 0000000..a24df47 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteShadows.cginc @@ -0,0 +1,49 @@ +#ifndef SPRITE_SHADOWS_INCLUDED +#define SPRITE_SHADOWS_INCLUDED + +#include "ShaderShared.cginc" + +//////////////////////////////////////// +// Vertex structs +// + +struct vertexInput +{ + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; +}; + +struct vertexOutput +{ + V2F_SHADOW_CASTER; + float2 texcoord : TEXCOORD1; +}; + +//////////////////////////////////////// +// Vertex program +// + +vertexOutput vert(vertexInput v) +{ + vertexOutput o; + TRANSFER_SHADOW_CASTER(o) + o.texcoord = calculateTextureCoord(v.texcoord); + return o; +} + +//////////////////////////////////////// +// Fragment program +// + + +uniform fixed _ShadowAlphaCutoff; + +fixed4 frag(vertexOutput IN) : COLOR +{ + fixed4 texureColor = calculateTexturePixel(IN.texcoord); + clip(texureColor.a - _ShadowAlphaCutoff); + + SHADOW_CASTER_FRAGMENT(IN) +} + +#endif // SPRITE_SHADOWS_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteShadows.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteShadows.cginc.meta new file mode 100644 index 0000000..09089fb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteShadows.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b7dbdfb1f55ee26459284220ad6d5bc4 +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteSpecular.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteSpecular.cginc new file mode 100644 index 0000000..e96d566 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteSpecular.cginc @@ -0,0 +1,246 @@ +#ifndef SPRITE_SPECULAR_INCLUDED +#define SPRITE_SPECULAR_INCLUDED + +#include "ShaderMaths.cginc" + +//////////////////////////////////////// +// Specular functions +// + +#if defined(_SPECULAR) || defined(_SPECULAR_GLOSSMAP) + +#define SPECULAR + + +//ALL THESE FUNCTIONS ARE TAKEN AND ADAPTED FROM UNITY'S OWN PHYSICS BASED STANDARD SHADER + +uniform float _Metallic; +uniform float _Glossiness; +uniform float _GlossMapScale; +uniform sampler2D _MetallicGlossMap; + +struct SpecularLightData +{ + half3 lighting; + half3 specular; +}; + +struct SpecularCommonData +{ + half3 diffColor, specColor; + // Note: smoothness & oneMinusReflectivity for optimization purposes, mostly for DX9 SM2.0 level. + // Most of the math is being done on these (1-x) values, and that saves a few precious ALU slots. + half oneMinusReflectivity, smoothness; + half alpha; +}; + +inline half2 getMetallicGloss(float2 uv) +{ + half2 mg; + +#ifdef _SPECULAR_GLOSSMAP + mg = tex2D(_MetallicGlossMap, uv).ra; + mg.g *= _GlossMapScale; +#else + mg.r = _Metallic; + mg.g = _Glossiness; +#endif + + return mg; +} + +inline half getOneMinusReflectivityFromMetallic(half metallic) +{ + // We'll need oneMinusReflectivity, so + // 1-reflectivity = 1-lerp(dielectricSpec, 1, metallic) = lerp(1-dielectricSpec, 0, metallic) + // store (1-dielectricSpec) in unity_ColorSpaceDielectricSpec.a, then + // 1-reflectivity = lerp(alpha, 0, metallic) = alpha + metallic*(0 - alpha) = + // = alpha - metallic * alpha + half oneMinusDielectricSpec = unity_ColorSpaceDielectricSpec.a; + return oneMinusDielectricSpec - metallic * oneMinusDielectricSpec; +} + +inline SpecularCommonData getSpecularData(float2 uv, half4 texureColor, fixed4 color) +{ + half2 metallicGloss = getMetallicGloss(uv); + half metallic = metallicGloss.x; + half smoothness = metallicGloss.y; // this is 1 minus the square root of real roughness m. + + fixed4 albedo = calculatePixel(texureColor, color); + + half3 specColor = lerp (unity_ColorSpaceDielectricSpec.rgb, albedo, metallic); + half oneMinusReflectivity = getOneMinusReflectivityFromMetallic(metallic); + half3 diffColor = albedo * oneMinusReflectivity; + + SpecularCommonData o = (SpecularCommonData)0; + o.diffColor = diffColor; + o.specColor = specColor; + o.oneMinusReflectivity = oneMinusReflectivity; + o.smoothness = smoothness; + +#if defined(_ALPHAPREMULTIPLY_ON) && (SHADER_TARGET >= 30) + // Reflectivity 'removes' from the rest of components, including Transparency + // outAlpha = 1-(1-alpha)*(1-reflectivity) = 1-(oneMinusReflectivity - alpha*oneMinusReflectivity) = + // = 1-oneMinusReflectivity + alpha*oneMinusReflectivity + //o.alpha = 1-oneMinusReflectivity + albedo.a*oneMinusReflectivity; + o.alpha = albedo.a; +#else + o.alpha = albedo.a; +#endif + + return o; +} +inline half SmoothnessToPerceptualRoughness(half smoothness) +{ + return (1 - smoothness); +} + +inline half PerceptualRoughnessToRoughness(half perceptualRoughness) +{ + return perceptualRoughness * perceptualRoughness; +} + +// Ref: http://jcgt.org/published/0003/02/03/paper.pdf +inline half SmithJointGGXVisibilityTerm (half NdotL, half NdotV, half roughness) +{ +#if 0 + // Original formulation: + // lambda_v = (-1 + sqrt(a2 * (1 - NdotL2) / NdotL2 + 1)) * 0.5f; + // lambda_l = (-1 + sqrt(a2 * (1 - NdotV2) / NdotV2 + 1)) * 0.5f; + // G = 1 / (1 + lambda_v + lambda_l); + + // Reorder code to be more optimal + half a = roughness; + half a2 = a * a; + + half lambdaV = NdotL * sqrt((-NdotV * a2 + NdotV) * NdotV + a2); + half lambdaL = NdotV * sqrt((-NdotL * a2 + NdotL) * NdotL + a2); + + // Simplify visibility term: (2.0f * NdotL * NdotV) / ((4.0f * NdotL * NdotV) * (lambda_v + lambda_l + 1e-5f)); + return 0.5f / (lambdaV + lambdaL + 1e-5f); // This function is not intended to be running on Mobile, + // therefore epsilon is smaller than can be represented by half +#else + // Approximation of the above formulation (simplify the sqrt, not mathematically correct but close enough) + half a = roughness; + half lambdaV = NdotL * (NdotV * (1 - a) + a); + half lambdaL = NdotV * (NdotL * (1 - a) + a); + + return 0.5f / (lambdaV + lambdaL + 1e-5f); +#endif +} + +inline half GGXTerm (half NdotH, half roughness) +{ + half a2 = roughness * roughness; + half d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + // therefore epsilon is smaller than what can be represented by half +} + +inline half3 FresnelTerm (half3 F0, half cosA) +{ + half t = pow5 (1 - cosA); // ala Schlick interpoliation + return F0 + (1-F0) * t; +} + +inline half3 FresnelLerp (half3 F0, half F90, half cosA) +{ + half t = pow5 (1 - cosA); // ala Schlick interpoliation + return lerp (F0, F90, t); +} + +// Note: Disney diffuse must be multiply by diffuseAlbedo / PI. This is done outside of this function. +inline half DisneyDiffuse(half NdotV, half NdotL, half LdotH, half perceptualRoughness) +{ + half fd90 = 0.5 + 2 * LdotH * LdotH * perceptualRoughness; + // Two schlick fresnel term + half lightScatter = (1 + (fd90 - 1) * pow5(1 - NdotL)); + half viewScatter = (1 + (fd90 - 1) * pow5(1 - NdotV)); + + return lightScatter * viewScatter; +} + +// Main Physically Based BRDF +// Derived from Disney work and based on Torrance-Sparrow micro-facet model +// +// BRDF = kD / pi + kS * (D * V * F) / 4 +// I = BRDF * NdotL +// +// * NDF (depending on UNITY_BRDF_GGX): +// a) Normalized BlinnPhong +// b) GGX +// * Smith for Visiblity term +// * Schlick approximation for Fresnel +SpecularLightData calculatePhysicsBasedSpecularLight(half3 specColor, half oneMinusReflectivity, half smoothness, half3 normal, half3 viewDir, half3 lightdir, half3 lightColor, half3 indirectDiffuse, half3 indirectSpecular) +{ + half perceptualRoughness = SmoothnessToPerceptualRoughness (smoothness); + half3 halfDir = safeNormalize (lightdir + viewDir); + +// NdotV should not be negative for visible pixels, but it can happen due to perspective projection and normal mapping +// In this case normal should be modified to become valid (i.e facing camera) and not cause weird artifacts. +// but this operation adds few ALU and users may not want it. Alternative is to simply take the abs of NdotV (less correct but works too). +// Following define allow to control this. Set it to 0 if ALU is critical on your platform. +// This correction is interesting for GGX with SmithJoint visibility function because artifacts are more visible in this case due to highlight edge of rough surface +// Edit: Disable this code by default for now as it is not compatible with two sided lighting used in SpeedTree. +#define UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV 0 + +#if UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV + // The amount we shift the normal toward the view vector is defined by the dot product. + half shiftAmount = dot(normal, viewDir); + normal = shiftAmount < 0.0f ? normal + viewDir * (-shiftAmount + 1e-5f) : normal; + // A re-normalization should be applied here but as the shift is small we don't do it to save ALU. + //normal = normalize(normal); + + half nv = saturate(dot(normal, viewDir)); // TODO: this saturate should no be necessary here +#else + half nv = abs(dot(normal, viewDir)); // This abs allow to limit artifact +#endif + + half nl = saturate(dot(normal, lightdir)); + half nh = saturate(dot(normal, halfDir)); + + half lv = saturate(dot(lightdir, viewDir)); + half lh = saturate(dot(lightdir, halfDir)); + + // Diffuse term + half diffuseTerm = DisneyDiffuse(nv, nl, lh, perceptualRoughness) * nl; + + // Specular term + // HACK: theoretically we should divide diffuseTerm by Pi and not multiply specularTerm! + // BUT 1) that will make shader look significantly darker than Legacy ones + // and 2) on engine side "Non-important" lights have to be divided by Pi too in cases when they are injected into ambient SH + half roughness = PerceptualRoughnessToRoughness(perceptualRoughness); + half V = SmithJointGGXVisibilityTerm (nl, nv, roughness); + half D = GGXTerm (nh, roughness); + + half specularTerm = V*D * UNITY_PI; // Torrance-Sparrow model, Fresnel is applied later + +# ifdef UNITY_COLORSPACE_GAMMA + specularTerm = sqrt(max(1e-4h, specularTerm)); +# endif + + // specularTerm * nl can be NaN on Metal in some cases, use max() to make sure it's a sane value + specularTerm = max(0, specularTerm * nl); + + // surfaceReduction = Int D(NdotH) * NdotH * Id(NdotL>0) dH = 1/(roughness^2+1) + half surfaceReduction; +# ifdef UNITY_COLORSPACE_GAMMA + surfaceReduction = 1.0 - 0.28f * roughness * perceptualRoughness; // 1-0.28*x^3 as approximation for (1/(x^4+1))^(1/2.2) on the domain [0;1] +# else + surfaceReduction = 1.0 / (roughness*roughness + 1.0); // fade \in [0.5;1] +# endif + + // To provide true Lambert lighting, we need to be able to kill specular completely. + specularTerm *= any(specColor) ? 1.0 : 0.0; + + half grazingTerm = saturate(smoothness + (1-oneMinusReflectivity)); + + SpecularLightData outData = (SpecularLightData)0; + outData.lighting = indirectDiffuse + lightColor * diffuseTerm; + outData.specular = (specularTerm * lightColor * FresnelTerm (specColor, lh)) + (surfaceReduction * indirectSpecular * FresnelLerp (specColor, grazingTerm, nv)); + return outData; +} + +#endif // _SPECULAR && _SPECULAR_GLOSSMAP + +#endif // SPRITE_SPECULAR_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteSpecular.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteSpecular.cginc.meta new file mode 100644 index 0000000..a9fdc4f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteSpecular.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f195336fc94457241a37a0aa85923681 +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc new file mode 100644 index 0000000..4385ffc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc @@ -0,0 +1,72 @@ +#ifndef SPRITE_UNLIT_INCLUDED +#define SPRITE_UNLIT_INCLUDED + +#include "ShaderShared.cginc" + +//////////////////////////////////////// +// Vertex structs +// + +struct VertexInput +{ + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; + fixed4 color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct VertexOutput +{ + float4 pos : SV_POSITION; + float2 texcoord : TEXCOORD0; + fixed4 color : COLOR; +#if defined(_FOG) + UNITY_FOG_COORDS(1) +#endif // _FOG + + UNITY_VERTEX_OUTPUT_STEREO +}; + +//////////////////////////////////////// +// Vertex program +// + +VertexOutput vert(VertexInput input) +{ + VertexOutput output; + + UNITY_SETUP_INSTANCE_ID(input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + output.pos = calculateLocalPos(input.vertex); + output.texcoord = calculateTextureCoord(input.texcoord); + output.color = calculateVertexColor(input.color); + +#if defined(_FOG) + UNITY_TRANSFER_FOG(output,output.pos); +#endif // _FOG + + return output; +} + +//////////////////////////////////////// +// Fragment program +// + + + + +fixed4 frag(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord.xy); + ALPHA_CLIP(texureColor, input.color) + + fixed4 pixel = calculatePixel(texureColor, input.color); + + COLORISE(pixel) + APPLY_FOG(pixel, input) + + return pixel; +} + +#endif // SPRITE_UNLIT_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc.meta new file mode 100644 index 0000000..1e8d974 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 072e7b07ec7fb1346a9dcd3bcbbb7111 +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc new file mode 100644 index 0000000..0ffa277 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc @@ -0,0 +1,474 @@ +#ifndef SPRITE_VERTEX_LIGHTING_INCLUDED +#define SPRITE_VERTEX_LIGHTING_INCLUDED + +#include "ShaderShared.cginc" +#include "SpriteLighting.cginc" +#include "SpriteSpecular.cginc" + +//////////////////////////////////////// +// Defines +// + +//Define to use spot lights (more expensive) +#define SPOT_LIGHTS + +//Have to process lighting per pixel if using normal maps or a diffuse ramp or rim lighting or specular +#if defined(_NORMALMAP) || defined(_DIFFUSE_RAMP) || defined(_RIM_LIGHTING) || defined(SPECULAR) +#define PER_PIXEL_LIGHTING +#endif + +//Turn off bump mapping and diffuse ramping on older shader models as they dont support needed number of outputs +#if defined(PER_PIXEL_LIGHTING) && (SHADER_TARGET < 30) + #undef PER_PIXEL_LIGHTING + #undef _NORMALMAP + #undef _DIFFUSE_RAMP + #undef _RIM_LIGHTING +#endif + +//In D3D9 only have a max of 9 TEXCOORD so can't have diffuse ramping or fog or rim lighting if processing lights per pixel +#if defined(SHADER_API_D3D9) && defined(PER_PIXEL_LIGHTING) + #if defined(_NORMALMAP) + #undef _DIFFUSE_RAMP + #undef _FOG + #undef _RIM_LIGHTING + #elif defined(_DIFFUSE_RAMP) + #undef _FOG + #undef _RIM_LIGHTING + #elif defined(_RIM_LIGHTING) + #undef _FOG + #undef _DIFFUSE_RAMP + #else + #undef _DIFFUSE_RAMP + #undef _RIM_LIGHTING + #endif +#endif + +#if defined(PER_PIXEL_LIGHTING) + #if defined(_NORMALMAP) && defined(_DIFFUSE_RAMP) + #define ATTENUATIONS TEXCOORD9 + #if defined(_RIM_LIGHTING) + #define _POS_WORLD_INDEX TEXCOORD10 + #define _FOG_COORD_INDEX 11 + #else + #define _FOG_COORD_INDEX 10 + #endif + #elif defined(_NORMALMAP) != defined(_DIFFUSE_RAMP) + #define ATTENUATIONS TEXCOORD8 + #if defined(_RIM_LIGHTING) + #define _POS_WORLD_INDEX TEXCOORD9 + #define _FOG_COORD_INDEX 10 + #else + #define _FOG_COORD_INDEX 9 + #endif + #else //!_DIFFUSE_RAMP && !_NORMALMAP + #if defined(_RIM_LIGHTING) + #define _POS_WORLD_INDEX TEXCOORD8 + #define _FOG_COORD_INDEX 9 + #else + #define _FOG_COORD_INDEX 8 + #endif + #endif +#else //!PER_PIXEL_LIGHTING + #define _FOG_COORD_INDEX 2 +#endif + +//////////////////////////////////////// +// Vertex output struct +// + +struct VertexOutput +{ + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float3 texcoord : TEXCOORD0; + +#if defined(PER_PIXEL_LIGHTING) + + half4 VertexLightInfo0 : TEXCOORD1; + half4 VertexLightInfo1 : TEXCOORD2; + half4 VertexLightInfo2 : TEXCOORD3; + half4 VertexLightInfo3 : TEXCOORD4; + half4 VertexLightInfo4 : TEXCOORD5; + + #if defined(_NORMALMAP) + half4 normalWorld : TEXCOORD6; + half4 tangentWorld : TEXCOORD7; + half4 binormalWorld : TEXCOORD8; + #else + half3 normalWorld : TEXCOORD6; + half3 VertexLightInfo5 : TEXCOORD7; + #endif + #if defined(_DIFFUSE_RAMP) + half4 LightAttenuations : ATTENUATIONS; + #endif + #if defined(_RIM_LIGHTING) + float4 posWorld : _POS_WORLD_INDEX; + #endif + +#else //!PER_PIXEL_LIGHTING + + half3 FullLighting : TEXCOORD1; + +#endif // !PER_PIXEL_LIGHTING + +#if defined(_FOG) + UNITY_FOG_COORDS(_FOG_COORD_INDEX) +#endif // _FOG + + UNITY_VERTEX_OUTPUT_STEREO +}; + +//////////////////////////////////////// +// Light calculations +// + +struct VertexLightInfo +{ + half3 lightDirection; + fixed3 lightColor; + +#if defined(_DIFFUSE_RAMP) + float attenuation; +#endif // _DIFFUSE_RAMP +}; + +inline VertexLightInfo getVertexLightAttenuatedInfo(int index, float3 viewPos) +{ + VertexLightInfo lightInfo; + + //For directional lights unity_LightPosition.w is set to zero + lightInfo.lightDirection = unity_LightPosition[index].xyz - viewPos.xyz * unity_LightPosition[index].w; + float lengthSq = dot(lightInfo.lightDirection, lightInfo.lightDirection); + + // don't produce NaNs if some vertex position overlaps with the light + lengthSq = max(lengthSq, 0.000001); + + lightInfo.lightDirection *= rsqrt(lengthSq); + + float attenuation = 1.0 / (1.0 + lengthSq * unity_LightAtten[index].z); + +#if defined(SPOT_LIGHTS) + //Spot light attenuation - for non-spot lights unity_LightAtten.x is set to -1 and y is set to 1 + { + float rho = max (0, dot(lightInfo.lightDirection, unity_SpotDirection[index].xyz)); + float spotAtt = (rho - unity_LightAtten[index].x) * unity_LightAtten[index].y; + attenuation *= saturate(spotAtt); + } +#endif // SPOT_LIGHTS + + //If using a diffuse ramp texture then need to pass through the lights attenuation, otherwise premultiply the light color with it +#if defined(_DIFFUSE_RAMP) + lightInfo.lightColor = unity_LightColor[index].rgb; + lightInfo.attenuation = attenuation; +#else + lightInfo.lightColor = unity_LightColor[index].rgb * attenuation; +#endif // _DIFFUSE_RAMP + + return lightInfo; +} + +fixed3 calculateAmbientLight(half3 normalWorld) +{ +#if defined(_SPHERICAL_HARMONICS) + + //Magic constants used to tweak ambient to approximate pixel shader spherical harmonics + static const fixed3 worldUp = fixed3(0,1,0); + static const float skyGroundDotMul = 2.5; + static const float minEquatorMix = 0.5; + static const float equatorColorBlur = 0.33; + + float upDot = dot(normalWorld, worldUp); + + //Fade between a flat lerp from sky to ground and a 3 way lerp based on how bright the equator light is. + //This simulates how directional lights get blurred using spherical harmonics + + //Work out color from ground and sky, ignoring equator + float adjustedDot = upDot * skyGroundDotMul; + fixed3 skyGroundColor = lerp(unity_AmbientGround, unity_AmbientSky, saturate((adjustedDot + 1.0) * 0.5)); + + //Work out equator lights brightness + float equatorBright = saturate(dot(unity_AmbientEquator.rgb, unity_AmbientEquator.rgb)); + + //Blur equator color with sky and ground colors based on how bright it is. + fixed3 equatorBlurredColor = lerp(unity_AmbientEquator, saturate(unity_AmbientEquator + unity_AmbientGround + unity_AmbientSky), equatorBright * equatorColorBlur); + + //Work out 3 way lerp inc equator light + fixed3 equatorColor = lerp(equatorBlurredColor, unity_AmbientGround, -upDot) * step(upDot, 0) + lerp(equatorBlurredColor, unity_AmbientSky, upDot) * step(0, upDot); + + //Mix the two colors together based on how bright the equator light is + return lerp(skyGroundColor, equatorColor, saturate(equatorBright + minEquatorMix)); + +#else // !_SPHERICAL_HARMONICS + + //Flat ambient is just the sky color + return unity_AmbientSky.rgb; + +#endif // !_SPHERICAL_HARMONICS +} + +//////////////////////////////////////// +// Light Packing Functions +// + +#if defined(_DIFFUSE_RAMP) + +inline fixed3 calculateLightDiffuse(fixed3 lightColor, half3 viewNormal, half3 lightViewDir, float attenuation) +{ + float angleDot = max(0, dot(viewNormal, lightViewDir)); + fixed3 lightDiffuse = calculateRampedDiffuse(lightColor, attenuation, angleDot); + return lightDiffuse; +} + +#else + +inline fixed3 calculateLightDiffuse(fixed3 attenuatedLightColor, half3 viewNormal, half3 lightViewDir) +{ + float angleDot = max(0, dot(viewNormal, lightViewDir)); + fixed3 lightDiffuse = attenuatedLightColor * angleDot; + + return lightDiffuse; +} + +#endif // _NORMALMAP + + +#if defined(PER_PIXEL_LIGHTING) + +#define VERTEX_LIGHT_0_DIR VertexLightInfo0.xyz +#define VERTEX_LIGHT_0_R VertexLightInfo4.x +#define VERTEX_LIGHT_0_G VertexLightInfo4.y +#define VERTEX_LIGHT_0_B VertexLightInfo4.z + +#define VERTEX_LIGHT_1_DIR VertexLightInfo1.xyz +#define VERTEX_LIGHT_1_R VertexLightInfo0.w +#define VERTEX_LIGHT_1_G VertexLightInfo1.w +#define VERTEX_LIGHT_1_B VertexLightInfo2.w + +#define VERTEX_LIGHT_2_DIR VertexLightInfo2.xyz +#define VERTEX_LIGHT_2_R VertexLightInfo3.w +#define VERTEX_LIGHT_2_G VertexLightInfo4.w +#define VERTEX_LIGHT_2_B texcoord.z + +#define VERTEX_LIGHT_3_DIR VertexLightInfo3.xyz + +#if defined(_NORMALMAP) + #define VERTEX_LIGHT_3_R normalWorld.w + #define VERTEX_LIGHT_3_G tangentWorld.w + #define VERTEX_LIGHT_3_B binormalWorld.w +#else + #define VERTEX_LIGHT_3_R VertexLightInfo5.x + #define VERTEX_LIGHT_3_G VertexLightInfo5.y + #define VERTEX_LIGHT_3_B VertexLightInfo5.z +#endif + +#if defined(_DIFFUSE_RAMP) + + #define LIGHT_DIFFUSE_ATTEN_0 LightAttenuations.x + #define LIGHT_DIFFUSE_ATTEN_1 LightAttenuations.y + #define LIGHT_DIFFUSE_ATTEN_2 LightAttenuations.z + #define LIGHT_DIFFUSE_ATTEN_3 LightAttenuations.w + + #define PACK_VERTEX_LIGHT_DIFFUSE(index, output, lightInfo) \ + { \ + output.LIGHT_DIFFUSE_ATTEN_##index = lightInfo.attenuation; \ + } + + #define ADD_VERTEX_LIGHT_DIFFUSE(index, diffuse, input, lightColor, viewNormal, lightViewDir) \ + { \ + diffuse += calculateLightDiffuse(lightColor, viewNormal, lightViewDir, input.LIGHT_DIFFUSE_ATTEN_##index); \ + } +#else + #define PACK_VERTEX_LIGHT_DIFFUSE(index, output, lightInfo) + #define ADD_VERTEX_LIGHT_DIFFUSE(index, diffuse, input, lightColor, viewNormal, lightViewDir) \ + { \ + diffuse += calculateLightDiffuse(lightColor, viewNormal, lightViewDir); \ + } +#endif + +#define PACK_VERTEX_LIGHT(index, output, viewPos) \ + { \ + VertexLightInfo lightInfo = getVertexLightAttenuatedInfo(index, viewPos); \ + output.VERTEX_LIGHT_##index##_DIR = lightInfo.lightDirection; \ + output.VERTEX_LIGHT_##index##_R = lightInfo.lightColor.r; \ + output.VERTEX_LIGHT_##index##_G = lightInfo.lightColor.g; \ + output.VERTEX_LIGHT_##index##_B = lightInfo.lightColor.b; \ + PACK_VERTEX_LIGHT_DIFFUSE(index, output, lightInfo); \ + } + +#define ADD_VERTEX_LIGHT(index, input, viewNormal, diffuse) \ + { \ + half3 lightViewDir = input.VERTEX_LIGHT_##index##_DIR; \ + fixed3 lightColor = fixed3(input.VERTEX_LIGHT_##index##_R, input.VERTEX_LIGHT_##index##_G, input.VERTEX_LIGHT_##index##_B); \ + ADD_VERTEX_LIGHT_DIFFUSE(index, diffuse, input, lightColor, viewNormal, lightViewDir) \ + } + +#if defined(SPECULAR) + +#define ADD_VERTEX_LIGHT_SPEC(index, input, viewNormal, specData, combinedLightData, indirectDiffuse, indirectSpecular) \ + { \ + half3 lightViewDir = input.VERTEX_LIGHT_##index##_DIR; \ + fixed3 lightColor = fixed3(input.VERTEX_LIGHT_##index##_R, input.VERTEX_LIGHT_##index##_G, input.VERTEX_LIGHT_##index##_B); \ + SpecularLightData lightData = calculatePhysicsBasedSpecularLight(specData.specColor, specData.oneMinusReflectivity, specData.smoothness, viewNormal, fixed3(0,0,1), lightViewDir, lightColor, indirectDiffuse, indirectSpecular); \ + combinedLightData.lighting += lightData.lighting; \ + combinedLightData.specular += lightData.specular; \ + } + +#endif + +#else //!PER_PIXEL_LIGHTING + +//////////////////////////////////////// +// Vertex Only Functions +// + +inline fixed3 calculateLightDiffuse(int index, float3 viewPos, half3 viewNormal) +{ + VertexLightInfo lightInfo = getVertexLightAttenuatedInfo(index, viewPos); + float angleDot = max(0, dot(viewNormal, lightInfo.lightDirection)); + return lightInfo.lightColor * angleDot; +} + +#endif // !PER_PIXEL_LIGHTING + +//////////////////////////////////////// +// Vertex program +// + +VertexOutput vert(VertexInput input) +{ + VertexOutput output; + + UNITY_SETUP_INSTANCE_ID(input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + output.pos = calculateLocalPos(input.vertex); + output.color = calculateVertexColor(input.color); + output.texcoord = float3(calculateTextureCoord(input.texcoord), 0); + + float3 viewPos = UnityObjectToViewPos(input.vertex); //float3 viewPos = mul(UNITY_MATRIX_MV, input.vertex); // +#if defined(FIXED_NORMALS_BACKFACE_RENDERING) || defined(_RIM_LIGHTING) + float4 powWorld = calculateWorldPos(input.vertex); +#endif + + float backFaceSign = 1; +#if defined(FIXED_NORMALS_BACKFACE_RENDERING) + backFaceSign = calculateBackfacingSign(powWorld.xyz); +#endif + +#if defined(PER_PIXEL_LIGHTING) + + #if defined(_RIM_LIGHTING) + output.posWorld = powWorld; + #endif + + PACK_VERTEX_LIGHT(0, output, viewPos) + PACK_VERTEX_LIGHT(1, output, viewPos) + PACK_VERTEX_LIGHT(2, output, viewPos) + PACK_VERTEX_LIGHT(3, output, viewPos) + + output.normalWorld.xyz = calculateSpriteWorldNormal(input, backFaceSign); + + #if defined(_NORMALMAP) + output.tangentWorld.xyz = calculateWorldTangent(input.tangent); + output.binormalWorld.xyz = calculateSpriteWorldBinormal(input, output.normalWorld, output.tangentWorld, backFaceSign); + #endif + +#else // !PER_PIXEL_LIGHTING + + //Just pack full lighting + float3 viewNormal = calculateSpriteViewNormal(input, backFaceSign); + //Get Ambient diffuse + float3 normalWorld = calculateSpriteWorldNormal(input, backFaceSign); + fixed3 ambient = calculateAmbientLight(normalWorld); + + fixed3 diffuse = calculateLightDiffuse(0, viewPos, viewNormal); + diffuse += calculateLightDiffuse(1, viewPos, viewNormal); + diffuse += calculateLightDiffuse(2, viewPos, viewNormal); + diffuse += calculateLightDiffuse(3, viewPos, viewNormal); + + output.FullLighting = ambient + diffuse; + +#endif // !PER_PIXEL_LIGHTING + +#if defined(_FOG) + UNITY_TRANSFER_FOG(output, output.pos); +#endif // _FOG + + return output; +} + +//////////////////////////////////////// +// Fragment program +// + +fixed4 frag(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord.xy); + ALPHA_CLIP(texureColor, input.color) + +#if defined(PER_PIXEL_LIGHTING) + + #if defined(_NORMALMAP) + half3 normalWorld = calculateNormalFromBumpMap(input.texcoord.xy, input.tangentWorld.xyz, input.binormalWorld.xyz, input.normalWorld.xyz); + #else + half3 normalWorld = input.normalWorld.xyz; + #endif + + //Get Ambient diffuse + fixed3 ambient = calculateAmbientLight(normalWorld); + + half3 normalView = normalize(mul((float3x3)UNITY_MATRIX_V, normalWorld)); + +#if defined(SPECULAR) + + SpecularCommonData specData = getSpecularData(input.texcoord.xy, texureColor, input.color); + + SpecularLightData combinedLightData = (SpecularLightData)0; + ADD_VERTEX_LIGHT_SPEC(0, input, normalView, specData, combinedLightData, ambient, unity_IndirectSpecColor.rgb) + ADD_VERTEX_LIGHT_SPEC(1, input, normalView, specData, combinedLightData, fixed3(0,0,0), fixed3(0,0,0)) + ADD_VERTEX_LIGHT_SPEC(2, input, normalView, specData, combinedLightData, fixed3(0,0,0), fixed3(0,0,0)) + ADD_VERTEX_LIGHT_SPEC(3, input, normalView, specData, combinedLightData, fixed3(0,0,0), fixed3(0,0,0)) + + fixed4 pixel = calculateLitPixel(fixed4(specData.diffColor, specData.alpha), combinedLightData.lighting); + pixel.rgb += combinedLightData.specular * specData.alpha; + + APPLY_EMISSION_SPECULAR(pixel, input.texcoord) + +#else + + //Find vertex light diffuse + fixed3 diffuse = fixed3(0,0,0); + + //Add each vertex light to diffuse + ADD_VERTEX_LIGHT(0, input, normalView, diffuse) + ADD_VERTEX_LIGHT(1, input, normalView, diffuse) + ADD_VERTEX_LIGHT(2, input, normalView, diffuse) + ADD_VERTEX_LIGHT(3, input, normalView, diffuse) + + fixed3 lighting = ambient + diffuse; + + APPLY_EMISSION(lighting, input.texcoord.xy) + + fixed4 pixel = calculateLitPixel(texureColor, input.color, lighting); + +#endif + +#if defined(_RIM_LIGHTING) + pixel.rgb = applyRimLighting(input.posWorld, normalWorld, pixel); +#endif + +#else // !PER_PIXEL_LIGHTING + + APPLY_EMISSION(input.FullLighting, input.texcoord.xy) + + fixed4 pixel = calculateLitPixel(texureColor, input.color, input.FullLighting); + +#endif // !PER_PIXEL_LIGHTING + + COLORISE(pixel) + APPLY_FOG(pixel, input) + + return pixel; +} + +#endif // SPRITE_VERTEX_LIGHTING_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc.meta new file mode 100644 index 0000000..5987054 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CGIncludes/SpriteVertexLighting.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c739dcf9dbcab944898d0b796e11afb9 +timeCreated: 1494092582 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthNormalsTexture.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthNormalsTexture.shader new file mode 100644 index 0000000..0c80ebc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthNormalsTexture.shader @@ -0,0 +1,522 @@ +Shader "Hidden/Sprite-CameraDepthNormalsTexture" { + +// Use this shader to render a DepthNormals texture for a camera with correct sprite normals (using camera.RenderWithShader with replacement tag "RenderType") + +Properties { + _MainTex ("", 2D) = "white" {} + _Cutoff ("", Float) = 0.5 + _Color ("", Color) = (1,1,1,1) +} + +SubShader { + Tags { "RenderType"="Sprite" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderShared.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +uniform float4 _FixedNormal; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="SpriteViewSpaceFixedNormal" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderShared.cginc" +#include "CGIncludes/SpriteLighting.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + o.nz.xyz = getFixedNormal(); + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="SpriteModelSpaceFixedNormal" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderShared.cginc" +#include "CGIncludes/SpriteLighting.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + float3 worldPos = mul(unity_ObjectToWorld, v.vertex); + float3 normal = getFixedNormal(); +//Only do this if backface is enabled :/ + normal *= calculateBackfacingSign(worldPos.xyz); +// + o.nz.xyz = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, normal)); + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="Opaque" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +struct v2f { + float4 pos : SV_POSITION; + float4 nz : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TransparentCutout" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +uniform float4 _MainTex_ST; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +uniform fixed4 _Color; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a*_Color.a - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeBark" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertBark(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag( v2f i ) : SV_Target { + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeLeaf" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertLeaf(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag( v2f i ) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeOpaque" "DisableBatching"="True" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float4 nz : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeTransparentCutout" "DisableBatching"="True" } + Pass { + Cull Back +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + Pass { + Cull Front +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = -COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + +} + +SubShader { + Tags { "RenderType"="TreeBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert (appdata_tree_billboard v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.x = v.texcoord.x; + o.uv.y = v.texcoord.y > 0; + o.nz.xyz = float3(0,0,1); + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - 0.001 ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="GrassBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassBillboardVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="Grass" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +Fallback Off +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthNormalsTexture.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthNormalsTexture.shader.meta new file mode 100644 index 0000000..ba10b83 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthNormalsTexture.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4794ea6b2d07cc546ba97a809b5f9ada +timeCreated: 1494092583 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthTexture.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthTexture.shader new file mode 100644 index 0000000..3a7f60d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthTexture.shader @@ -0,0 +1,518 @@ +Shader "Hidden/Sprite-CameraDepthTexture" { + +// Use this shader to render a Depth texture for a camera with soft edged Sprites (using camera.RenderWithShader with replacement tag "RenderType") +// Note the depth is encoded into the pixels RGB not the full RGBA (alpha is needed for blending) + +Properties { + _MainTex ("", 2D) = "white" {} + _Cutoff ("", Float) = 0.5 + _Color ("", Color) = (1,1,1,1) +} + +SubShader { + Tags { "RenderType"="Sprite" } + Pass { + Cull Off + Blend SrcAlpha OneMinusSrcAlpha +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "CGIncludes/ShaderShared.cginc" +#include "CGIncludes/ShaderMaths.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return fixed4(EncodeFloatRGB (i.depth), alpha); +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="SpriteViewSpaceFixedNormal" } + Pass { + Cull Off + Blend SrcAlpha OneMinusSrcAlpha +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "CGIncludes/ShaderShared.cginc" +#include "CGIncludes/ShaderMaths.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return fixed4(EncodeFloatRGB (i.depth), alpha); +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="SpriteModelSpaceFixedNormal" } + Pass { + Cull Off + Blend SrcAlpha OneMinusSrcAlpha +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "CGIncludes/ShaderShared.cginc" +#include "CGIncludes/ShaderMaths.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return fixed4(EncodeFloatRGB (i.depth), alpha); +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="Opaque" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +struct v2f { + float4 pos : SV_POSITION; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.depth = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TransparentCutout" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +uniform float4 _MainTex_ST; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +uniform fixed4 _Color; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a*_Color.a - _Cutoff ); + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeBark" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertBark(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.depth = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag( v2f i ) : SV_Target { + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeLeaf" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertLeaf(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag( v2f i ) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeOpaque" "DisableBatching"="True" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.depth = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeTransparentCutout" "DisableBatching"="True" } + Pass { + Cull Back +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } + Pass { + Cull Front +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - _Cutoff ); + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } + +} + +SubShader { + Tags { "RenderType"="TreeBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert (appdata_tree_billboard v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.x = v.texcoord.x; + o.uv.y = v.texcoord.y > 0; + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - 0.001 ); + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="GrassBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassBillboardVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="Grass" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderMaths.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float depth : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord; + o.depth = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return fixed4(EncodeFloatRGB (i.depth), 1); +} +ENDCG + } +} + +Fallback Off +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthTexture.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthTexture.shader.meta new file mode 100644 index 0000000..abf6acb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraDepthTexture.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f768a57e040cc48489ad8c7392a31154 +timeCreated: 1494092586 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraNormalsTexture.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraNormalsTexture.shader new file mode 100644 index 0000000..1cf6a77 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraNormalsTexture.shader @@ -0,0 +1,522 @@ +Shader "Hidden/Sprite-CameraNormalsTexture" { + +// Use this shader to render a Normals texture for a camera with correct sprite normals (using camera.RenderWithShader with replacement tag "RenderType") + +Properties { + _MainTex ("", 2D) = "white" {} + _Cutoff ("", Float) = 0.5 + _Color ("", Color) = (1,1,1,1) +} + +SubShader { + Tags { "RenderType"="Sprite" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderShared.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +uniform float4 _FixedNormal; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return i.nz; +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="SpriteViewSpaceFixedNormal" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderShared.cginc" +#include "CGIncludes/SpriteLighting.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + o.nz.xyz = getFixedNormal(); + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return i.nz; +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="SpriteModelSpaceFixedNormal" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "CGIncludes/ShaderShared.cginc" +#include "CGIncludes/SpriteLighting.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = calculateTextureCoord(v.texcoord); + float3 worldPos = mul(unity_ObjectToWorld, v.vertex); + float3 normal = getFixedNormal(); +//Only do this if backface is enabled :/ + normal *= calculateBackfacingSign(worldPos.xyz); +// + o.nz.xyz = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, normal)); + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = calculateTexturePixel(i.uv ); + float alpha = texcol.a*_Color.a; + clip( alpha - _Cutoff ); + return i.nz; +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="Opaque" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +struct v2f { + float4 pos : SV_POSITION; + float4 nz : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return i.nz; +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TransparentCutout" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +uniform float4 _MainTex_ST; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +uniform fixed4 _Color; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a*_Color.a - _Cutoff ); + return i.nz; +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeBark" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertBark(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag( v2f i ) : SV_Target { + return i.nz; +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeLeaf" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertLeaf(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag( v2f i ) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return i.nz; +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeOpaque" "DisableBatching"="True" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float4 nz : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return i.nz; +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeTransparentCutout" "DisableBatching"="True" } + Pass { + Cull Back +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return i.nz; +} +ENDCG + } + Pass { + Cull Front +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = -COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - _Cutoff ); + return i.nz; +} +ENDCG + } + +} + +SubShader { + Tags { "RenderType"="TreeBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert (appdata_tree_billboard v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.x = v.texcoord.x; + o.uv.y = v.texcoord.y > 0; + o.nz.xyz = float3(0,0,1); + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - 0.001 ); + return i.nz; +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="GrassBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassBillboardVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return i.nz; +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="Grass" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return i.nz; +} +ENDCG + } +} + +Fallback Off +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraNormalsTexture.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraNormalsTexture.shader.meta new file mode 100644 index 0000000..88d7505 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/CameraNormalsTexture.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 537141eca02c6df4bb8b4f77567e9de2 +timeCreated: 1494092584 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor.meta new file mode 100644 index 0000000..c34b558 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7bebbafa671002646b3a7267b32a0d60 +folderAsset: yes +timeCreated: 1479419399 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor/SpineSpriteShaderGUI.cs b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor/SpineSpriteShaderGUI.cs new file mode 100644 index 0000000..c51eda1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor/SpineSpriteShaderGUI.cs @@ -0,0 +1,973 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEditor; + +using SpineInspectorUtility = Spine.Unity.Editor.SpineInspectorUtility; + +public class SpineSpriteShaderGUI : ShaderGUI { + static readonly string kShaderVertexLit = "Spine/Sprite/Vertex Lit"; + static readonly string kShaderPixelLit = "Spine/Sprite/Pixel Lit"; + static readonly string kShaderUnlit = "Spine/Sprite/Unlit"; + static readonly int kSolidQueue = 2000; + static readonly int kAlphaTestQueue = 2450; + static readonly int kTransparentQueue = 3000; + + private enum eBlendMode { + PreMultipliedAlpha, + StandardAlpha, + Opaque, + Additive, + SoftAdditive, + Multiply, + Multiplyx2, + }; + + private enum eLightMode { + VertexLit, + PixelLit, + Unlit, + }; + + private enum eCulling { + Off = 0, + Front = 1, + Back = 2, + }; + + private enum eNormalsMode { + MeshNormals = -1, + FixedNormalsViewSpace = 0, + FixedNormalsModelSpace = 1, + }; + + MaterialEditor _materialEditor; + + MaterialProperty _mainTexture = null; + MaterialProperty _color = null; + + MaterialProperty _pixelSnap = null; + + MaterialProperty _writeToDepth = null; + MaterialProperty _depthAlphaCutoff = null; + MaterialProperty _shadowAlphaCutoff = null; + MaterialProperty _renderQueue = null; + MaterialProperty _culling = null; + MaterialProperty _customRenderQueue = null; + + MaterialProperty _overlayColor = null; + MaterialProperty _hue = null; + MaterialProperty _saturation = null; + MaterialProperty _brightness = null; + + MaterialProperty _rimPower = null; + MaterialProperty _rimColor = null; + + MaterialProperty _bumpMap = null; + MaterialProperty _bumpScale = null; + MaterialProperty _diffuseRamp = null; + MaterialProperty _fixedNormal = null; + + MaterialProperty _blendTexture = null; + MaterialProperty _blendTextureLerp = null; + + MaterialProperty _emissionMap = null; + MaterialProperty _emissionColor = null; + MaterialProperty _emissionPower = null; + + MaterialProperty _metallic = null; + MaterialProperty _metallicGlossMap = null; + MaterialProperty _smoothness = null; + MaterialProperty _smoothnessScale = null; + + static GUIContent _albedoText = new GUIContent("Albedo", "Albedo (RGB) and Transparency (A)"); + static GUIContent _altAlbedoText = new GUIContent("Secondary Albedo", "When a secondary albedo texture is set the albedo will be a blended mix of the two textures based on the blend value."); + static GUIContent _metallicMapText = new GUIContent("Metallic", "Metallic (R) and Smoothness (A)"); + static GUIContent _smoothnessText = new GUIContent("Smoothness", "Smoothness value"); + static GUIContent _smoothnessScaleText = new GUIContent("Smoothness", "Smoothness scale factor"); + static GUIContent _normalMapText = new GUIContent("Normal Map", "Normal Map"); + static GUIContent _emissionText = new GUIContent("Emission", "Emission (RGB)"); + static GUIContent _emissionPowerText = new GUIContent("Emission Power"); + static GUIContent _emissionToggleText = new GUIContent("Emission", "Enable Emission."); + static GUIContent _diffuseRampText = new GUIContent("Diffuse Ramp", "A black and white gradient can be used to create a 'Toon Shading' effect."); + static GUIContent _depthText = new GUIContent("Write to Depth", "Write to Depth Buffer by clipping alpha."); + static GUIContent _depthAlphaCutoffText = new GUIContent("Depth Alpha Cutoff", "Threshold for depth write alpha cutoff"); + static GUIContent _shadowAlphaCutoffText = new GUIContent("Shadow Alpha Cutoff", "Threshold for shadow alpha cutoff"); + static GUIContent _fixedNormalText = new GUIContent("Fixed Normals", "If this is ticked instead of requiring mesh normals a Fixed Normal will be used instead (it's quicker and can result in better looking lighting effects on 2d objects)."); + static GUIContent _fixedNormalDirectionText = new GUIContent("Fixed Normal Direction", "Should normally be (0,0,1) if in view-space or (0,0,-1) if in model-space."); + static GUIContent _adjustBackfaceTangentText = new GUIContent("Adjust Back-face Tangents", "Tick only if you are going to rotate the sprite to face away from the camera, the tangents will be flipped when this is the case to make lighting correct."); + static GUIContent _sphericalHarmonicsText = new GUIContent("Spherical Harmonics", "Enable to use spherical harmonics to calculate ambient light / light probes. In vertex-lit mode this will be approximated from scenes ambient trilight settings."); + static GUIContent _lightingModeText = new GUIContent("Lighting Mode", "Lighting Mode"); + static GUIContent[] _lightingModeOptions = { + new GUIContent("Vertex Lit"), + new GUIContent("Pixel Lit"), + new GUIContent("Unlit") + }; + static GUIContent _blendModeText = new GUIContent("Blend Mode", "Blend Mode"); + static GUIContent[] _blendModeOptions = { + new GUIContent("Pre-Multiplied Alpha"), + new GUIContent("Standard Alpha"), + new GUIContent("Opaque"), + new GUIContent("Additive"), + new GUIContent("Soft Additive"), + new GUIContent("Multiply"), + new GUIContent("Multiply x2") + }; + static GUIContent _rendererQueueText = new GUIContent("Renderer Queue"); + static GUIContent _cullingModeText = new GUIContent("Culling Mode"); + static GUIContent[] _cullingModeOptions = { new GUIContent("Off"), new GUIContent("Front"), new GUIContent("Back") }; + static GUIContent _pixelSnapText = new GUIContent("Pixel Snap"); + //static GUIContent _customRenderTypetagsText = new GUIContent("Use Custom RenderType tags"); + static GUIContent _fixedNormalSpaceText = new GUIContent("Fixed Normal Space"); + static GUIContent[] _fixedNormalSpaceOptions = { new GUIContent("View-Space"), new GUIContent("Model-Space") }; + static GUIContent _rimLightingToggleText = new GUIContent("Rim Lighting", "Enable Rim Lighting."); + static GUIContent _rimColorText = new GUIContent("Rim Color"); + static GUIContent _rimPowerText = new GUIContent("Rim Power"); + static GUIContent _specularToggleText = new GUIContent("Specular", "Enable Specular."); + static GUIContent _colorAdjustmentToggleText = new GUIContent("Color Adjustment", "Enable material color adjustment."); + static GUIContent _colorAdjustmentColorText = new GUIContent("Overlay Color"); + static GUIContent _colorAdjustmentHueText = new GUIContent("Hue"); + static GUIContent _colorAdjustmentSaturationText = new GUIContent("Saturation"); + static GUIContent _colorAdjustmentBrightnessText = new GUIContent("Brightness"); + static GUIContent _fogToggleText = new GUIContent("Fog", "Enable Fog rendering on this renderer."); + static GUIContent _meshRequiresTangentsText = new GUIContent("Note: Material requires a mesh with tangents."); + static GUIContent _meshRequiresNormalsText = new GUIContent("Note: Material requires a mesh with normals."); + static GUIContent _meshRequiresNormalsAndTangentsText = new GUIContent("Note: Material requires a mesh with Normals and Tangents."); + + const string _primaryMapsText = "Main Maps"; + const string _depthLabelText = "Depth"; + const string _shadowsText = "Shadows"; + const string _customRenderType = "Use Custom RenderType"; + + #region ShaderGUI + + public override void OnGUI (MaterialEditor materialEditor, MaterialProperty[] properties) { + FindProperties(properties); // MaterialProperties can be animated so we do not cache them but fetch them every event to ensure animated values are updated correctly + _materialEditor = materialEditor; + ShaderPropertiesGUI(); + } + + public override void AssignNewShaderToMaterial (Material material, Shader oldShader, Shader newShader) { + base.AssignNewShaderToMaterial(material, oldShader, newShader); + + //If not originally a sprite shader set default keywords + if (oldShader.name != kShaderVertexLit && oldShader.name != kShaderPixelLit && oldShader.name != kShaderUnlit) { + SetDefaultSpriteKeywords(material, newShader); + } + + SetMaterialKeywords(material); + } + + #endregion + + #region Virtual Interface + + protected virtual void FindProperties (MaterialProperty[] props) { + _mainTexture = FindProperty("_MainTex", props); + _color = FindProperty("_Color", props); + + _pixelSnap = FindProperty("PixelSnap", props); + + _writeToDepth = FindProperty("_ZWrite", props); + _depthAlphaCutoff = FindProperty("_Cutoff", props); + _shadowAlphaCutoff = FindProperty("_ShadowAlphaCutoff", props); + _renderQueue = FindProperty("_RenderQueue", props); + _culling = FindProperty("_Cull", props); + _customRenderQueue = FindProperty("_CustomRenderQueue", props); + + _bumpMap = FindProperty("_BumpMap", props, false); + _bumpScale = FindProperty("_BumpScale", props, false); + _diffuseRamp = FindProperty("_DiffuseRamp", props, false); + _fixedNormal = FindProperty("_FixedNormal", props, false); + _blendTexture = FindProperty("_BlendTex", props, false); + _blendTextureLerp = FindProperty("_BlendAmount", props, false); + + _overlayColor = FindProperty("_OverlayColor", props, false); + _hue = FindProperty("_Hue", props, false); + _saturation = FindProperty("_Saturation", props, false); + _brightness = FindProperty("_Brightness", props, false); + + _rimPower = FindProperty("_RimPower", props, false); + _rimColor = FindProperty("_RimColor", props, false); + + _emissionMap = FindProperty("_EmissionMap", props, false); + _emissionColor = FindProperty("_EmissionColor", props, false); + _emissionPower = FindProperty("_EmissionPower", props, false); + + _metallic = FindProperty("_Metallic", props, false); + _metallicGlossMap = FindProperty("_MetallicGlossMap", props, false); + _smoothness = FindProperty("_Glossiness", props, false); + _smoothnessScale = FindProperty("_GlossMapScale", props, false); + } + + static bool BoldToggleField (GUIContent label, bool value) { + FontStyle origFontStyle = EditorStyles.label.fontStyle; + EditorStyles.label.fontStyle = FontStyle.Bold; + value = EditorGUILayout.Toggle(label, value, EditorStyles.toggle); + EditorStyles.label.fontStyle = origFontStyle; + return value; + } + + protected virtual void ShaderPropertiesGUI () { + // Use default labelWidth + EditorGUIUtility.labelWidth = 0f; + + RenderMeshInfoBox(); + + // Detect any changes to the material + bool dataChanged = RenderModes(); + + GUILayout.Label(_primaryMapsText, EditorStyles.boldLabel); + { + dataChanged |= RenderTextureProperties(); + } + + GUILayout.Label(_depthLabelText, EditorStyles.boldLabel); + { + dataChanged |= RenderDepthProperties(); + } + + GUILayout.Label(_shadowsText, EditorStyles.boldLabel); + { + dataChanged |= RenderShadowsProperties(); + } + + if (_metallic != null) { + dataChanged |= RenderSpecularProperties(); + } + + if (_emissionMap != null && _emissionColor != null) { + dataChanged |= RenderEmissionProperties(); + } + + if (_fixedNormal != null) { + dataChanged |= RenderNormalsProperties(); + } + + if (_fixedNormal != null) { + dataChanged |= RenderSphericalHarmonicsProperties(); + } + + { + dataChanged |= RenderFogProperties(); + } + + { + dataChanged |= RenderColorProperties(); + } + + if (_rimColor != null) { + dataChanged |= RenderRimLightingProperties(); + } + + if (dataChanged) { + MaterialChanged(_materialEditor); + } + } + + protected virtual bool RenderModes () { + bool dataChanged = false; + + //Lighting Mode + { + EditorGUI.BeginChangeCheck(); + + eLightMode lightMode = GetMaterialLightMode((Material)_materialEditor.target); + EditorGUI.showMixedValue = false; + foreach (Material material in _materialEditor.targets) { + if (lightMode != GetMaterialLightMode(material)) { + EditorGUI.showMixedValue = true; + break; + } + } + + lightMode = (eLightMode)EditorGUILayout.Popup(_lightingModeText, (int)lightMode, _lightingModeOptions); + if (EditorGUI.EndChangeCheck()) { + foreach (Material material in _materialEditor.targets) { + switch (lightMode) { + case eLightMode.VertexLit: + if (material.shader.name != kShaderVertexLit) + _materialEditor.SetShader(Shader.Find(kShaderVertexLit), false); + break; + case eLightMode.PixelLit: + if (material.shader.name != kShaderPixelLit) + _materialEditor.SetShader(Shader.Find(kShaderPixelLit), false); + break; + case eLightMode.Unlit: + if (material.shader.name != kShaderUnlit) + _materialEditor.SetShader(Shader.Find(kShaderUnlit), false); + break; + } + } + + dataChanged = true; + } + } + + //Blend Mode + { + eBlendMode blendMode = GetMaterialBlendMode((Material)_materialEditor.target); + EditorGUI.showMixedValue = false; + foreach (Material material in _materialEditor.targets) { + if (blendMode != GetMaterialBlendMode(material)) { + EditorGUI.showMixedValue = true; + break; + } + } + + EditorGUI.BeginChangeCheck(); + blendMode = (eBlendMode)EditorGUILayout.Popup(_blendModeText, (int)blendMode, _blendModeOptions); + if (EditorGUI.EndChangeCheck()) { + foreach (Material mat in _materialEditor.targets) { + SetBlendMode(mat, blendMode); + } + + dataChanged = true; + } + } + + // GUILayout.Label(Styles.advancedText, EditorStyles.boldLabel); + // m_MaterialEditor.RenderQueueField(); + // m_MaterialEditor.EnableInstancingField(); + + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = _renderQueue.hasMixedValue; + int renderQueue = EditorGUILayout.IntSlider(_rendererQueueText, (int)_renderQueue.floatValue, 0, 49); + if (EditorGUI.EndChangeCheck()) { + SetInt("_RenderQueue", renderQueue); + dataChanged = true; + } + + EditorGUI.BeginChangeCheck(); + var culling = (eCulling)Mathf.RoundToInt(_culling.floatValue); + EditorGUI.showMixedValue = _culling.hasMixedValue; + culling = (eCulling)EditorGUILayout.Popup(_cullingModeText, (int)culling, _cullingModeOptions); + if (EditorGUI.EndChangeCheck()) { + SetInt("_Cull", (int)culling); + dataChanged = true; + } + + EditorGUI.showMixedValue = false; + + EditorGUI.BeginChangeCheck(); + _materialEditor.ShaderProperty(_pixelSnap, _pixelSnapText); + dataChanged |= EditorGUI.EndChangeCheck(); + + return dataChanged; + } + + protected virtual bool RenderTextureProperties () { + bool dataChanged = false; + + EditorGUI.BeginChangeCheck(); + + _materialEditor.TexturePropertySingleLine(_albedoText, _mainTexture, _color); + + if (_bumpMap != null) + _materialEditor.TexturePropertySingleLine(_normalMapText, _bumpMap, _bumpMap.textureValue != null ? _bumpScale : null); + + if (_diffuseRamp != null) + _materialEditor.TexturePropertySingleLine(_diffuseRampText, _diffuseRamp); + + dataChanged |= EditorGUI.EndChangeCheck(); + + if (_blendTexture != null) { + EditorGUI.BeginChangeCheck(); + _materialEditor.TexturePropertySingleLine(_altAlbedoText, _blendTexture, _blendTextureLerp); + if (EditorGUI.EndChangeCheck()) { + SetKeyword(_materialEditor, "_TEXTURE_BLEND", _blendTexture != null); + dataChanged = true; + } + } + + EditorGUI.BeginChangeCheck(); + _materialEditor.TextureScaleOffsetProperty(_mainTexture); + dataChanged |= EditorGUI.EndChangeCheck(); + + EditorGUI.showMixedValue = false; + + return dataChanged; + } + + protected virtual bool RenderDepthProperties () { + bool dataChanged = false; + + EditorGUI.BeginChangeCheck(); + + bool mixedValue = _writeToDepth.hasMixedValue; + EditorGUI.showMixedValue = mixedValue; + bool writeTodepth = EditorGUILayout.Toggle(_depthText, _writeToDepth.floatValue != 0.0f); + + if (EditorGUI.EndChangeCheck()) { + SetInt("_ZWrite", writeTodepth ? 1 : 0); + _depthAlphaCutoff.floatValue = writeTodepth ? 0.5f : 0.0f; + mixedValue = false; + dataChanged = true; + } + + if (writeTodepth && !mixedValue && GetMaterialBlendMode((Material)_materialEditor.target) != eBlendMode.Opaque) { + EditorGUI.BeginChangeCheck(); + _materialEditor.RangeProperty(_depthAlphaCutoff, _depthAlphaCutoffText.text); + dataChanged |= EditorGUI.EndChangeCheck(); + } + + { + bool useCustomRenderType = _customRenderQueue.floatValue > 0.0f; + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = _customRenderQueue.hasMixedValue; + useCustomRenderType = EditorGUILayout.Toggle(_customRenderType, useCustomRenderType); + if (EditorGUI.EndChangeCheck()) { + dataChanged = true; + + _customRenderQueue.floatValue = useCustomRenderType ? 1.0f : 0.0f; + + foreach (Material material in _materialEditor.targets) { + eBlendMode blendMode = GetMaterialBlendMode(material); + + switch (blendMode) { + case eBlendMode.Opaque: + { + SetRenderType(material, "Opaque", useCustomRenderType); + } + break; + default: + { + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + SetRenderType(material, zWrite ? "TransparentCutout" : "Transparent", useCustomRenderType); + } + break; + } + } + } + } + + EditorGUI.showMixedValue = false; + + return dataChanged; + } + + protected virtual bool RenderNormalsProperties () { + bool dataChanged = false; + + eNormalsMode normalsMode = GetMaterialNormalsMode((Material)_materialEditor.target); + bool mixedNormalsMode = false; + foreach (Material material in _materialEditor.targets) { + if (normalsMode != GetMaterialNormalsMode(material)) { + mixedNormalsMode = true; + break; + } + } + + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = mixedNormalsMode; + bool fixedNormals = BoldToggleField(_fixedNormalText, normalsMode != eNormalsMode.MeshNormals); + + if (EditorGUI.EndChangeCheck()) { + normalsMode = fixedNormals ? eNormalsMode.FixedNormalsViewSpace : eNormalsMode.MeshNormals; + SetNormalsMode(_materialEditor, normalsMode, false); + _fixedNormal.vectorValue = new Vector4(0.0f, 0.0f, normalsMode == eNormalsMode.FixedNormalsViewSpace ? 1.0f : -1.0f, 1.0f); + mixedNormalsMode = false; + dataChanged = true; + } + + if (fixedNormals) { + //Show drop down for normals space + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = mixedNormalsMode; + normalsMode = (eNormalsMode)EditorGUILayout.Popup(_fixedNormalSpaceText, (int)normalsMode, _fixedNormalSpaceOptions); + if (EditorGUI.EndChangeCheck()) { + SetNormalsMode((Material)_materialEditor.target, normalsMode, GetMaterialFixedNormalsBackfaceRenderingOn((Material)_materialEditor.target)); + + foreach (Material material in _materialEditor.targets) { + SetNormalsMode(material, normalsMode, GetMaterialFixedNormalsBackfaceRenderingOn(material)); + } + + //Reset fixed normal to default (Vector3.forward for model-space, -Vector3.forward for view-space). + _fixedNormal.vectorValue = new Vector4(0.0f, 0.0f, normalsMode == eNormalsMode.FixedNormalsViewSpace ? 1.0f : -1.0f, 1.0f); + + mixedNormalsMode = false; + dataChanged = true; + } + + //Show fixed normal + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = _fixedNormal.hasMixedValue; + Vector3 normal = EditorGUILayout.Vector3Field(_fixedNormalDirectionText, _fixedNormal.vectorValue); + if (EditorGUI.EndChangeCheck()) { + _fixedNormal.vectorValue = new Vector4(normal.x, normal.y, normal.z, 1.0f); + dataChanged = true; + } + + //Show adjust for back face rendering + { + bool fixBackFaceRendering = GetMaterialFixedNormalsBackfaceRenderingOn((Material)_materialEditor.target); + bool mixedBackFaceRendering = false; + foreach (Material material in _materialEditor.targets) { + if (fixBackFaceRendering != GetMaterialFixedNormalsBackfaceRenderingOn(material)) { + mixedBackFaceRendering = true; + break; + } + } + + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = mixedBackFaceRendering; + bool backRendering = EditorGUILayout.Toggle(_adjustBackfaceTangentText, fixBackFaceRendering); + + if (EditorGUI.EndChangeCheck()) { + SetNormalsMode(_materialEditor, normalsMode, backRendering); + dataChanged = true; + } + } + + } + + EditorGUI.showMixedValue = false; + + return dataChanged; + } + + protected virtual bool RenderShadowsProperties () { + EditorGUI.BeginChangeCheck(); + _materialEditor.RangeProperty(_shadowAlphaCutoff, _shadowAlphaCutoffText.text); + return EditorGUI.EndChangeCheck(); + } + + protected virtual bool RenderSphericalHarmonicsProperties () { + EditorGUI.BeginChangeCheck(); + bool mixedValue; + bool enabled = IsKeywordEnabled(_materialEditor, "_SPHERICAL_HARMONICS", out mixedValue); + EditorGUI.showMixedValue = mixedValue; + enabled = BoldToggleField(_sphericalHarmonicsText, enabled); + EditorGUI.showMixedValue = false; + + if (EditorGUI.EndChangeCheck()) { + SetKeyword(_materialEditor, "_SPHERICAL_HARMONICS", enabled); + return true; + } + + return false; + } + + protected virtual bool RenderFogProperties () { + EditorGUI.BeginChangeCheck(); + bool mixedValue; + bool fog = IsKeywordEnabled(_materialEditor, "_FOG", out mixedValue); + EditorGUI.showMixedValue = mixedValue; + fog = BoldToggleField(_fogToggleText, fog); + EditorGUI.showMixedValue = false; + + if (EditorGUI.EndChangeCheck()) { + SetKeyword(_materialEditor, "_FOG", fog); + return true; + } + + return false; + } + + protected virtual bool RenderColorProperties () { + bool dataChanged = false; + + EditorGUI.BeginChangeCheck(); + bool mixedValue; + bool colorAdjust = IsKeywordEnabled(_materialEditor, "_COLOR_ADJUST", out mixedValue); + EditorGUI.showMixedValue = mixedValue; + colorAdjust = BoldToggleField(_colorAdjustmentToggleText, colorAdjust); + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) { + SetKeyword(_materialEditor, "_COLOR_ADJUST", colorAdjust); + mixedValue = false; + dataChanged = true; + } + + if (colorAdjust && !mixedValue) { + EditorGUI.BeginChangeCheck(); + _materialEditor.ColorProperty(_overlayColor, _colorAdjustmentColorText.text); + _materialEditor.RangeProperty(_hue, _colorAdjustmentHueText.text); + _materialEditor.RangeProperty(_saturation, _colorAdjustmentSaturationText.text); + _materialEditor.RangeProperty(_brightness, _colorAdjustmentBrightnessText.text); + dataChanged |= EditorGUI.EndChangeCheck(); + } + + return dataChanged; + } + + protected virtual bool RenderSpecularProperties () { + bool dataChanged = false; + + bool mixedSpecularValue; + bool specular = IsKeywordEnabled(_materialEditor, "_SPECULAR", out mixedSpecularValue); + bool mixedSpecularGlossMapValue; + bool specularGlossMap = IsKeywordEnabled(_materialEditor, "_SPECULAR_GLOSSMAP", out mixedSpecularGlossMapValue); + bool mixedValue = mixedSpecularValue || mixedSpecularGlossMapValue; + + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = mixedValue; + bool specularEnabled = BoldToggleField(_specularToggleText, specular || specularGlossMap); + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) { + foreach (Material material in _materialEditor.targets) { + bool hasGlossMap = material.GetTexture("_MetallicGlossMap") != null; + SetKeyword(material, "_SPECULAR", specularEnabled && !hasGlossMap); + SetKeyword(material, "_SPECULAR_GLOSSMAP", specularEnabled && hasGlossMap); + } + + mixedValue = false; + dataChanged = true; + } + + if (specularEnabled && !mixedValue) { + EditorGUI.BeginChangeCheck(); + bool hasGlossMap = _metallicGlossMap.textureValue != null; + _materialEditor.TexturePropertySingleLine(_metallicMapText, _metallicGlossMap, hasGlossMap ? null : _metallic); + if (EditorGUI.EndChangeCheck()) { + hasGlossMap = _metallicGlossMap.textureValue != null; + SetKeyword(_materialEditor, "_SPECULAR", !hasGlossMap); + SetKeyword(_materialEditor, "_SPECULAR_GLOSSMAP", hasGlossMap); + + dataChanged = true; + } + + const int indentation = 2; + _materialEditor.ShaderProperty(hasGlossMap ? _smoothnessScale : _smoothness, hasGlossMap ? _smoothnessScaleText : _smoothnessText, indentation); + } + + return dataChanged; + } + + protected virtual bool RenderEmissionProperties () { + bool dataChanged = false; + + bool mixedValue; + bool emission = IsKeywordEnabled(_materialEditor, "_EMISSION", out mixedValue); + + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = mixedValue; + emission = BoldToggleField(_emissionToggleText, emission); + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) { + SetKeyword(_materialEditor, "_EMISSION", emission); + mixedValue = false; + dataChanged = true; + } + + if (emission && !mixedValue) { + EditorGUI.BeginChangeCheck(); + +#if UNITY_2018 + _materialEditor.TexturePropertyWithHDRColor(_emissionText, _emissionMap, _emissionColor, true); +#else + _materialEditor.TexturePropertyWithHDRColor(_emissionText, _emissionMap, _emissionColor, new ColorPickerHDRConfig(0, 1, 0.01010101f, 3), true); +#endif + _materialEditor.FloatProperty(_emissionPower, _emissionPowerText.text); + dataChanged |= EditorGUI.EndChangeCheck(); + } + + return dataChanged; + } + + protected virtual bool RenderRimLightingProperties () { + bool dataChanged = false; + + bool mixedValue; + bool rimLighting = IsKeywordEnabled(_materialEditor, "_RIM_LIGHTING", out mixedValue); + + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = mixedValue; + rimLighting = BoldToggleField(_rimLightingToggleText, rimLighting); + EditorGUI.showMixedValue = false; + if (EditorGUI.EndChangeCheck()) { + SetKeyword(_materialEditor, "_RIM_LIGHTING", rimLighting); + mixedValue = false; + dataChanged = true; + } + + if (rimLighting && !mixedValue) { + EditorGUI.BeginChangeCheck(); + _materialEditor.ColorProperty(_rimColor, _rimColorText.text); + _materialEditor.FloatProperty(_rimPower, _rimPowerText.text); + dataChanged |= EditorGUI.EndChangeCheck(); + } + + return dataChanged; + } + + #endregion + + #region Private Functions + + void RenderMeshInfoBox () { + var material = (Material)_materialEditor.target; + bool requiresNormals = _fixedNormal != null && GetMaterialNormalsMode(material) == eNormalsMode.MeshNormals; + bool requiresTangents = material.HasProperty("_BumpMap") && material.GetTexture("_BumpMap") != null; + + if (requiresNormals || requiresTangents) { + GUILayout.Label(requiresNormals && requiresTangents ? _meshRequiresNormalsAndTangentsText : requiresNormals ? _meshRequiresNormalsText : _meshRequiresTangentsText, GUI.skin.GetStyle("helpBox")); + } + } + + void SetInt (string propertyName, int value) { + foreach (Material material in _materialEditor.targets) { + material.SetInt(propertyName, value); + } + } + + void SetDefaultSpriteKeywords (Material material, Shader shader) { + //Disable emission by default (is set on by default in standard shader) + SetKeyword(material, "_EMISSION", false); + //Start with preMultiply alpha by default + SetBlendMode(material, eBlendMode.PreMultipliedAlpha); + //Start with mesh normals by default + SetNormalsMode(material, eNormalsMode.MeshNormals, false); + if (_fixedNormal != null) + _fixedNormal.vectorValue = new Vector4(0.0f, 0.0f, 1.0f, 1.0f); + //Start with spherical harmonics disabled? + SetKeyword(material, "_SPHERICAL_HARMONICS", false); + //Start with specular disabled + SetKeyword(material, "_SPECULAR", false); + SetKeyword(material, "_SPECULAR_GLOSSMAP", false); + //Start with Culling disabled + material.SetInt("_Cull", (int)eCulling.Off); + //Start with Z writing disabled + material.SetInt("_ZWrite", 0); + } + + //Z write is on then + + static void SetRenderType (Material material, string renderType, bool useCustomRenderQueue) { + //Want a check box to say if should use Sprite render queue (for custom writing depth and normals) + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + + if (useCustomRenderQueue) { + //If sprite has fixed normals then assign custom render type so we can write its correct normal with soft edges + eNormalsMode normalsMode = GetMaterialNormalsMode(material); + + switch (normalsMode) { + case eNormalsMode.FixedNormalsViewSpace: + renderType = "SpriteViewSpaceFixedNormal"; + break; + case eNormalsMode.FixedNormalsModelSpace: + renderType = "SpriteModelSpaceFixedNormal"; + break; + case eNormalsMode.MeshNormals: + { + //If sprite doesn't write to depth assign custom render type so we can write its depth with soft edges + if (!zWrite) { + renderType = "Sprite"; + } + } + break; + } + } + + //If we don't write to depth set tag so custom shaders can write to depth themselves + material.SetOverrideTag("AlphaDepth", zWrite ? "False" : "True"); + + material.SetOverrideTag("RenderType", renderType); + } + + static void SetMaterialKeywords (Material material) { + eBlendMode blendMode = GetMaterialBlendMode(material); + SetBlendMode(material, blendMode); + + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + bool clipAlpha = zWrite && blendMode != eBlendMode.Opaque && material.GetFloat("_Cutoff") > 0.0f; + SetKeyword(material, "_ALPHA_CLIP", clipAlpha); + + bool normalMap = material.HasProperty("_BumpMap") && material.GetTexture("_BumpMap") != null; + SetKeyword(material, "_NORMALMAP", normalMap); + + bool diffuseRamp = material.HasProperty("_DiffuseRamp") && material.GetTexture("_DiffuseRamp") != null; + SetKeyword(material, "_DIFFUSE_RAMP", diffuseRamp); + + bool blendTexture = material.HasProperty("_BlendTex") && material.GetTexture("_BlendTex") != null; + SetKeyword(material, "_TEXTURE_BLEND", blendTexture); + } + + static void MaterialChanged (MaterialEditor materialEditor) { + foreach (Material material in materialEditor.targets) + SetMaterialKeywords(material); + } + + static void SetKeyword (MaterialEditor m, string keyword, bool state) { + foreach (Material material in m.targets) { + SetKeyword(material, keyword, state); + } + } + + static void SetKeyword (Material m, string keyword, bool state) { + if (state) + m.EnableKeyword(keyword); + else + m.DisableKeyword(keyword); + } + + static bool IsKeywordEnabled (MaterialEditor editor, string keyword, out bool mixedValue) { + bool keywordEnabled = ((Material)editor.target).IsKeywordEnabled(keyword); + mixedValue = false; + + foreach (Material material in editor.targets) { + if (material.IsKeywordEnabled(keyword) != keywordEnabled) { + mixedValue = true; + break; + } + } + + return keywordEnabled; + } + + static eLightMode GetMaterialLightMode (Material material) { + if (material.shader.name == kShaderPixelLit) { + return eLightMode.PixelLit; + } else if (material.shader.name == kShaderUnlit) { + return eLightMode.Unlit; + } else { + return eLightMode.VertexLit; + } + } + + static eBlendMode GetMaterialBlendMode (Material material) { + if (material.IsKeywordEnabled("_ALPHABLEND_ON")) + return eBlendMode.StandardAlpha; + if (material.IsKeywordEnabled("_ALPHAPREMULTIPLY_ON")) + return eBlendMode.PreMultipliedAlpha; + if (material.IsKeywordEnabled("_MULTIPLYBLEND")) + return eBlendMode.Multiply; + if (material.IsKeywordEnabled("_MULTIPLYBLEND_X2")) + return eBlendMode.Multiplyx2; + if (material.IsKeywordEnabled("_ADDITIVEBLEND")) + return eBlendMode.Additive; + if (material.IsKeywordEnabled("_ADDITIVEBLEND_SOFT")) + return eBlendMode.SoftAdditive; + + return eBlendMode.Opaque; + } + + static void SetBlendMode (Material material, eBlendMode blendMode) { + SetKeyword(material, "_ALPHABLEND_ON", blendMode == eBlendMode.StandardAlpha); + SetKeyword(material, "_ALPHAPREMULTIPLY_ON", blendMode == eBlendMode.PreMultipliedAlpha); + SetKeyword(material, "_MULTIPLYBLEND", blendMode == eBlendMode.Multiply); + SetKeyword(material, "_MULTIPLYBLEND_X2", blendMode == eBlendMode.Multiplyx2); + SetKeyword(material, "_ADDITIVEBLEND", blendMode == eBlendMode.Additive); + SetKeyword(material, "_ADDITIVEBLEND_SOFT", blendMode == eBlendMode.SoftAdditive); + + int renderQueue; + bool useCustomRenderQueue = material.GetFloat("_CustomRenderQueue") > 0.0f; + + switch (blendMode) { + case eBlendMode.Opaque: + { + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); + SetRenderType(material, "Opaque", useCustomRenderQueue); + renderQueue = kSolidQueue; + } + break; + case eBlendMode.Additive: + { + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + SetRenderType(material, zWrite ? "TransparentCutout" : "Transparent", useCustomRenderQueue); + renderQueue = zWrite ? kAlphaTestQueue : kTransparentQueue; + } + break; + case eBlendMode.SoftAdditive: + { + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcColor); + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + SetRenderType(material, zWrite ? "TransparentCutout" : "Transparent", useCustomRenderQueue); + renderQueue = zWrite ? kAlphaTestQueue : kTransparentQueue; + } + break; + case eBlendMode.Multiply: + { + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.Zero); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.SrcColor); + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + SetRenderType(material, zWrite ? "TransparentCutout" : "Transparent", useCustomRenderQueue); + renderQueue = zWrite ? kAlphaTestQueue : kTransparentQueue; + } + break; + case eBlendMode.Multiplyx2: + { + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.SrcColor); + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + SetRenderType(material, zWrite ? "TransparentCutout" : "Transparent", useCustomRenderQueue); + renderQueue = zWrite ? kAlphaTestQueue : kTransparentQueue; + } + break; + default: + { + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + bool zWrite = material.GetFloat("_ZWrite") > 0.0f; + SetRenderType(material, zWrite ? "TransparentCutout" : "Transparent", useCustomRenderQueue); + renderQueue = zWrite ? kAlphaTestQueue : kTransparentQueue; + } + break; + } + + material.renderQueue = renderQueue + material.GetInt("_RenderQueue"); + material.SetOverrideTag("IgnoreProjector", blendMode == eBlendMode.Opaque ? "False" : "True"); + } + + static eNormalsMode GetMaterialNormalsMode (Material material) { + if (material.IsKeywordEnabled("_FIXED_NORMALS_VIEWSPACE") || material.IsKeywordEnabled("_FIXED_NORMALS_VIEWSPACE_BACKFACE")) + return eNormalsMode.FixedNormalsViewSpace; + if (material.IsKeywordEnabled("_FIXED_NORMALS_MODELSPACE") || material.IsKeywordEnabled("_FIXED_NORMALS_MODELSPACE_BACKFACE")) + return eNormalsMode.FixedNormalsModelSpace; + + return eNormalsMode.MeshNormals; + } + + static void SetNormalsMode (MaterialEditor materialEditor, eNormalsMode normalsMode, bool allowBackFaceRendering) { + SetNormalsMode((Material)materialEditor.target, normalsMode, allowBackFaceRendering); + + foreach (Material material in materialEditor.targets) { + SetNormalsMode(material, normalsMode, allowBackFaceRendering); + } + } + + static void SetNormalsMode (Material material, eNormalsMode normalsMode, bool allowBackFaceRendering) { + SetKeyword(material, "_FIXED_NORMALS_VIEWSPACE", normalsMode == eNormalsMode.FixedNormalsViewSpace && !allowBackFaceRendering); + SetKeyword(material, "_FIXED_NORMALS_VIEWSPACE_BACKFACE", normalsMode == eNormalsMode.FixedNormalsViewSpace && allowBackFaceRendering); + SetKeyword(material, "_FIXED_NORMALS_MODELSPACE", normalsMode == eNormalsMode.FixedNormalsModelSpace && !allowBackFaceRendering); + SetKeyword(material, "_FIXED_NORMALS_MODELSPACE_BACKFACE", normalsMode == eNormalsMode.FixedNormalsModelSpace && allowBackFaceRendering); + } + + static bool GetMaterialFixedNormalsBackfaceRenderingOn (Material material) { + return material.IsKeywordEnabled("_FIXED_NORMALS_VIEWSPACE_BACKFACE") || material.IsKeywordEnabled("_FIXED_NORMALS_MODELSPACE_BACKFACE"); + } + + #endregion +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor/SpineSpriteShaderGUI.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor/SpineSpriteShaderGUI.cs.meta new file mode 100644 index 0000000..2215e75 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/Editor/SpineSpriteShaderGUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aef90b4c481362e42891bb46de344c1c +timeCreated: 1479458475 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/README.md b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/README.md new file mode 100644 index 0000000..15d7899 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/README.md @@ -0,0 +1,46 @@ +Contributed by ToddRivers + +# Unity Sprite Shaders +An Uber Shader specialised for rendering Sprites in Unity. +Even though it's designed for Sprites it can be used for a whole range of uses. It supports a wide range of optional shader features that won't effect performance unless they are used. +It also supports per-pixel effects such as normal maps and diffuse ramping whilst using Vertex Lit rendering. + +### Lighting +The shaders support lighting using both Forward Rendering and Vertex Lit Rendering. +Forward rendering is more accurate but is slower and crucially means the sprite has to write to depth using alpha clipping to avoid overdraw. +Vertex lit means all lighting can be done in one pass meaning full alpha can be used. + +### Normal Mapping +Normals maps are supported in both lighting modes (in Vertex Lit rendering data for normal mapping is packed into texture channels and then processed per pixel). + +### Blend Modes +Easily switch between blend modes including pre-multiplied alpha, additive, multiply etc. + +### Rim Lighting +Camera-space rim lighting is supported in both lighting modes. + +### Diffuse Ramp +A ramp texture is optionally supported for toon shading effects. + +### Shadows +Shadows are supported using alpha clipping. + +### Gradient based Ambient lighting +Both lighting modes support using a gradient for ambient light. In Vertex Lit mode the Spherical Harmonics is approximated from the ground, equator and sky colors. + +### Emission Map +An optional emission map is supported. + +### Camera Space Normals +As sprites are 2d their normals will always be constant. The shaders allow you to define a fixed normal in camera space rather than pass through mesh normals. +This not only saves vertex throughput but means lighting looks less 'flat' for rendering sprites with a perspective camera. + +### Color Adjustment +The shaders allow optional adjustment of hue / saturation and brightness as well as applying a solid color overlay effect for flashing a sprite to a solid color (eg. for damage effects). + +### Fog +Fog is optionally supported + + +## To Use +On your object's material click the drop down for shader and select Spine\Sprite\Pixel Lit, Vertex Lit or Unlit. diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/README.md.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/README.md.meta new file mode 100644 index 0000000..78cb908 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cecd0ea162097a94c89a97af6baf0a66 +timeCreated: 1479457854 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/ShaderShared.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/ShaderShared.cginc new file mode 100644 index 0000000..65d6f27 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/ShaderShared.cginc @@ -0,0 +1,363 @@ +#ifndef SHADER_SHARED_INCLUDED +#define SHADER_SHARED_INCLUDED + +#include "UnityCG.cginc" + +//////////////////////////////////////// +// Space functions +// + +inline float4 calculateWorldPos(float4 vertex) +{ + return mul(unity_ObjectToWorld, vertex); +} + +inline float4 calculateLocalPos(float4 vertex) +{ + return UnityObjectToClipPos(vertex); +} + +inline half3 calculateWorldNormal(float3 normal) +{ + return UnityObjectToWorldNormal(normal); +} + +//////////////////////////////////////// +// Maths functions +// + +inline float dotClamped(float3 a, float3 b) +{ + #if (SHADER_TARGET < 30 || defined(SHADER_API_PS3)) + return saturate(dot(a, b)); + #else + return max(0.0h, dot(a, b)); + #endif +} + +inline float oneDividedBy(float value) +{ + //Catches NANs + float sign_value = sign(value); + float sign_value_squared = sign_value*sign_value; + return sign_value_squared / ( value + sign_value_squared - 1.0); +} + +inline float4 quat_from_axis_angle(float3 axis, float angleRadians) +{ + float4 qr; + float half_angle = (angleRadians * 0.5); + qr.x = axis.x * sin(half_angle); + qr.y = axis.y * sin(half_angle); + qr.z = axis.z * sin(half_angle); + qr.w = cos(half_angle); + return qr; +} + +inline float3 rotate_vertex_position(float3 position, float3 axis, float angleRadians) +{ + float4 q = quat_from_axis_angle(axis, angleRadians); + float3 v = position.xyz; + return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v); +} + +//////////////////////////////////////// +// Normal map functions +// + +#if defined(_NORMALMAP) + +uniform sampler2D _BumpMap; + +inline half3 calculateWorldTangent(float4 tangent) +{ + return UnityObjectToWorldDir(tangent); +} + +inline half3 calculateWorldBinormal(half3 normalWorld, half3 tangentWorld, float tangentW) +{ + // For odd-negative scale transforms we need to flip the binormal + return cross(normalWorld, tangentWorld.xyz) * tangentW * unity_WorldTransformParams.w; +} + +inline half3 calculateNormalFromBumpMap(float2 texUV, half3 tangentWorld, half3 binormalWorld, half3 normalWorld) +{ + half3 localNormal = UnpackNormal(tex2D(_BumpMap, texUV)); + half3x3 rotation = half3x3(tangentWorld, binormalWorld, normalWorld); + half3 normal = normalize(mul(localNormal, rotation)); + return normal; +} + +#endif // _NORMALMAP + +//////////////////////////////////////// +// Blending functions +// + +inline fixed4 calculateLitPixel(fixed4 texureColor, fixed4 color, fixed3 lighting) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor * color; + finalPixel.rgb *= lighting * color.a; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = color * texureColor; + finalPixel.rgb *= lighting; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * color.rgb * lighting * 2.0f; + finalPixel.a = color.a * texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f * color; + finalPixel.rgb *= lighting * color.a; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = texureColor * color; + finalPixel.rgb *= lighting * finalPixel.a; +#else + finalPixel.a = texureColor.a * color.a; + finalPixel.rgb = texureColor.rgb * color.rgb * (lighting * finalPixel.a); +#endif + + return finalPixel; +} + +inline fixed4 calculateLitPixel(fixed4 texureColor, fixed3 lighting) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor; + finalPixel.rgb *= lighting; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = texureColor; + finalPixel.rgb *= lighting; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * lighting * 2.0f; + finalPixel.a = texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f; + finalPixel.rgb *= lighting; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = texureColor; + finalPixel.rgb *= lighting * finalPixel.a; +#else + finalPixel.a = texureColor.a; + finalPixel.rgb = texureColor.rgb * (lighting * finalPixel.a); +#endif + + return finalPixel; +} + +inline fixed4 calculateAdditiveLitPixel(fixed4 texureColor, fixed4 color, fixed3 lighting) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel.rgb = texureColor.rgb * lighting * color.rgb * color.a; + finalPixel.a = 1.0; +#else + //All other alpha + finalPixel.rgb = (texureColor.rgb * lighting * color.rgb) * (texureColor.a * color.a); + finalPixel.a = 1.0; +#endif + + return finalPixel; +} + +inline fixed4 calculatePixel(fixed4 texureColor, fixed4 color) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor * color; + finalPixel.rgb *= color.a; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = color * texureColor; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * color.rgb * 2.0f; + finalPixel.a = color.a * texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f * color; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = color * texureColor; + finalPixel.rgb *= finalPixel.a; +#else + //Standard alpha + finalPixel.a = texureColor.a * color.a; + finalPixel.rgb = (texureColor.rgb * color.rgb) * finalPixel.a; +#endif + + return finalPixel; +} + +inline fixed4 calculatePixel(fixed4 texureColor) : SV_Target +{ + fixed4 finalPixel; + +#if defined(_ALPHAPREMULTIPLY_ON) + //Pre multiplied alpha + finalPixel = texureColor; +#elif defined(_MULTIPLYBLEND) + //Multiply + finalPixel = texureColor; + finalPixel = lerp(fixed4(1,1,1,1), finalPixel, finalPixel.a); +#elif defined(_MULTIPLYBLEND_X2) + //Multiply x2 + finalPixel.rgb = texureColor.rgb * 2.0f; + finalPixel.a = texureColor.a; + finalPixel = lerp(fixed4(0.5f,0.5f,0.5f,0.5f), finalPixel, finalPixel.a); +#elif defined(_ADDITIVEBLEND) + //Additive + finalPixel = texureColor * 2.0f; +#elif defined(_ADDITIVEBLEND_SOFT) + //Additive soft + finalPixel = texureColor; + finalPixel.rgb *= finalPixel.a; +#else + //Standard alpha + finalPixel.a = texureColor.a; + finalPixel.rgb = texureColor.rgb * finalPixel.a; +#endif + + return finalPixel; +} + +//////////////////////////////////////// +// Alpha Clipping +// + +#if defined(_ALPHA_CLIP) + +uniform fixed _Cutoff; + +#define ALPHA_CLIP(pixel, color) clip((pixel.a * color.a) - _Cutoff); + +#else + +#define ALPHA_CLIP(pixel, color) + +#endif + +//////////////////////////////////////// +// Color functions +// + +uniform fixed4 _Color; + +inline fixed4 calculateVertexColor(fixed4 color) +{ + return color * _Color; +} + +#if defined(_COLOR_ADJUST) + +uniform float _Hue; +uniform float _Saturation; +uniform float _Brightness; +uniform fixed4 _OverlayColor; + +float3 rgb2hsv(float3 c) +{ + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +float3 hsv2rgb(float3 c) +{ + c = float3(c.x, clamp(c.yz, 0.0, 1.0)); + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +inline fixed4 adjustColor(fixed4 color) +{ + float3 hsv = rgb2hsv(color.rgb); + + hsv.x += _Hue; + hsv.y *= _Saturation; + hsv.z *= _Brightness; + + color.rgb = hsv2rgb(hsv); + + return color; +} + +#define COLORISE(pixel) pixel.rgb = lerp(pixel.rgb, _OverlayColor.rgb, _OverlayColor.a * pixel.a); +#define COLORISE_ADDITIVE(pixel) pixel.rgb = ((1.0-_OverlayColor.a) * pixel.rgb); + +#else // !_COLOR_ADJUST + +#define COLORISE(pixel) +#define COLORISE_ADDITIVE(pixel) + +#endif // !_COLOR_ADJUST + +//////////////////////////////////////// +// Texture functions +// + +uniform sampler2D _MainTex; + +#if _TEXTURE_BLEND +uniform sampler2D _BlendTex; +uniform float _BlendAmount; + +fixed4 calculateBlendedTexturePixel(float2 texcoord) +{ + return (1.0-_BlendAmount) * tex2D(_MainTex, texcoord) + _BlendAmount * tex2D(_BlendTex, texcoord); +} +#endif // _TEXTURE_BLEND + +inline fixed4 calculateTexturePixel(float2 texcoord) +{ + fixed4 pixel; + +#if _TEXTURE_BLEND + pixel = calculateBlendedTexturePixel(texcoord); +#else + pixel = tex2D(_MainTex, texcoord); +#endif // !_TEXTURE_BLEND + +#if defined(_COLOR_ADJUST) + pixel = adjustColor(pixel); +#endif // _COLOR_ADJUST + + return pixel; +} + +uniform fixed4 _MainTex_ST; + +inline float2 calculateTextureCoord(float4 texcoord) +{ + return TRANSFORM_TEX(texcoord, _MainTex); +} + +#endif // SHADER_SHARED_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/ShaderShared.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/ShaderShared.cginc.meta new file mode 100644 index 0000000..ad2f18c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/ShaderShared.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ce9f78731d2f39c49a8688633f53a524 +timeCreated: 1479457856 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteDepthNormalsTexture.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteDepthNormalsTexture.shader new file mode 100644 index 0000000..4d834a2 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteDepthNormalsTexture.shader @@ -0,0 +1,446 @@ +Shader "Hidden/Internal-SpriteDepthNormalsTexture" { + +// Use this shader to render a DepthNormals texture for a camera with correct sprite normals (using camera.RenderWithShader) + +Properties { + _MainTex ("", 2D) = "white" {} + _Cutoff ("", Float) = 0.5 + _Color ("", Color) = (1,1,1,1) +} + +SubShader { + Tags { "RenderType"="Sprite" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +uniform float4 _MainTex_ST; +uniform float4 _FixedNormal; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + o.nz.xyz = _FixedNormal.xyz; +#if UNITY_REVERSED_Z + o.nz.z = -o.nz.z; +#endif + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +uniform fixed4 _Color; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a*_Color.a - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + } + +SubShader { + Tags { "RenderType"="Opaque" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +struct v2f { + float4 pos : SV_POSITION; + float4 nz : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TransparentCutout" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +uniform float4 _MainTex_ST; +v2f vert( appdata_base v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +uniform fixed4 _Color; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a*_Color.a - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeBark" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertBark(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag( v2f i ) : SV_Target { + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeLeaf" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "Lighting.cginc" +#include "UnityBuiltin3xTreeLibrary.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert( appdata_full v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TreeVertLeaf(v); + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag( v2f i ) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeOpaque" "DisableBatching"="True" } + Pass { +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float4 nz : TEXCOORD0; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +fixed4 frag(v2f i) : SV_Target { + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="TreeTransparentCutout" "DisableBatching"="True" } + Pass { + Cull Back +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + half alpha = tex2D(_MainTex, i.uv).a; + + clip (alpha - _Cutoff); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + Pass { + Cull Front +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +struct appdata { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; +v2f vert( appdata v ) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainAnimateTree(v.vertex, v.color.w); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = -COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } + +} + +SubShader { + Tags { "RenderType"="TreeBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; +v2f vert (appdata_tree_billboard v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y); + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.x = v.texcoord.x; + o.uv.y = v.texcoord.y > 0; + o.nz.xyz = float3(0,0,1); + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + clip( texcol.a - 0.001 ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="GrassBillboard" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" + +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassBillboardVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +SubShader { + Tags { "RenderType"="Grass" } + Pass { + Cull Off +CGPROGRAM +#pragma target 3.0 +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#include "TerrainEngine.cginc" +struct v2f { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 uv : TEXCOORD0; + float4 nz : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO +}; + +v2f vert (appdata_full v) { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + WavingGrassVert (v); + o.color = v.color; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord; + o.nz.xyz = COMPUTE_VIEW_NORMAL; + o.nz.w = COMPUTE_DEPTH_01; + return o; +} +uniform sampler2D _MainTex; +uniform fixed _Cutoff; +fixed4 frag(v2f i) : SV_Target { + fixed4 texcol = tex2D( _MainTex, i.uv ); + fixed alpha = texcol.a * i.color.a; + clip( alpha - _Cutoff ); + return EncodeDepthNormal (i.nz.w, i.nz.xyz); +} +ENDCG + } +} + +Fallback Off +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteDepthNormalsTexture.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteDepthNormalsTexture.shader.meta new file mode 100644 index 0000000..7290467 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteDepthNormalsTexture.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: abbda12fddbb0b048a842a3835470d30 +timeCreated: 1480325971 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteLighting.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteLighting.cginc new file mode 100644 index 0000000..45a8b01 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteLighting.cginc @@ -0,0 +1,162 @@ +#ifndef SPRITE_LIGHTING_INCLUDED +#define SPRITE_LIGHTING_INCLUDED + +//Check for using mesh normals +#if !defined(_FIXED_NORMALS) && !defined(_FIXED_NORMALS_BACK_RENDERING) +#define MESH_NORMALS +#endif // _FIXED_NORMALS || _FIXED_NORMALS_BACK_RENDERING + +//////////////////////////////////////// +// Vertex structs +// + +struct VertexInput +{ + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; + float4 color : COLOR; +#if defined(MESH_NORMALS) + float3 normal : NORMAL; +#endif // MESH_NORMALS +#if defined(_NORMALMAP) + float4 tangent : TANGENT; +#endif // _NORMALMAP + +}; + +//////////////////////////////////////// +// Normal functions +// + +//Fixed Normal defined in view space +uniform float4 _FixedNormal = float4(0, 0, -1, 1); + +inline half3 calculateSpriteWorldNormal(VertexInput vertex) +{ +#if defined(MESH_NORMALS) + return calculateWorldNormal(vertex.normal); +#else //MESH_NORMALS + //Rotate fixed normal by inverse camera matrix to convert the fixed normal into world space + float3x3 invView = transpose((float3x3)UNITY_MATRIX_VP); + float3 normal = _FixedNormal.xyz; +#if UNITY_REVERSED_Z + normal.z = -normal.z; +#endif + return normalize(mul(invView, normal)); +#endif // !MESH_NORMALS +} + +inline half3 calculateSpriteViewNormal(VertexInput vertex) +{ +#if defined(MESH_NORMALS) + return normalize(mul((float3x3)UNITY_MATRIX_IT_MV, vertex.normal)); +#else // !MESH_NORMALS + float3 normal = _FixedNormal.xyz; +#if UNITY_REVERSED_Z + normal.z = -normal.z; +#endif + return normal; +#endif // !MESH_NORMALS +} + +//////////////////////////////////////// +// Normal map functions +// + +#if defined(_NORMALMAP) + +inline half3 calculateSpriteWorldBinormal(half3 normalWorld, half3 tangentWorld, float tangentW) +{ +#if defined(_FIXED_NORMALS_BACK_RENDERING) + //If we're using fixed normals and sprite is facing away from camera, flip tangentW + float3 zAxis = float3(0.0, 0.0, 1.0); + float3 modelForward = mul((float3x3)unity_ObjectToWorld, zAxis); + float3 cameraForward = mul((float3x3)UNITY_MATRIX_VP, zAxis); + float directionDot = dot(modelForward, cameraForward); + //Don't worry if directionDot is zero, sprite will be side on to camera so invisible meaning it doesnt matter that tangentW will be zero too + tangentW *= sign(directionDot); +#endif // _FIXED_NORMALS_BACK_RENDERING + + return calculateWorldBinormal(normalWorld, tangentWorld, tangentW); +} + +#endif // _NORMALMAP + +#if defined(_DIFFUSE_RAMP) + + +//////////////////////////////////////// +// Diffuse ramp functions +// + +//Disable for softer, more traditional diffuse ramping +#define HARD_DIFFUSE_RAMP + +uniform sampler2D _DiffuseRamp; + +inline fixed3 calculateDiffuseRamp(float ramp) +{ + return tex2D(_DiffuseRamp, float2(ramp, ramp)).rgb; +} + +inline fixed3 calculateRampedDiffuse(fixed3 lightColor, float attenuation, float angleDot) +{ + float d = angleDot * 0.5 + 0.5; +#if defined(HARD_DIFFUSE_RAMP) + half3 ramp = calculateDiffuseRamp(d * attenuation * 2); + return lightColor * ramp; +#else + half3 ramp = calculateDiffuseRamp(d); + return lightColor * ramp * (attenuation * 2); +#endif +} +#endif // _DIFFUSE_RAMP + +//////////////////////////////////////// +// Rim Lighting functions +// + +#ifdef _RIM_LIGHTING + +uniform float _RimPower; +uniform fixed4 _RimColor; + +inline fixed3 applyRimLighting(fixed3 posWorld, fixed3 normalWorld, fixed4 pixel) : SV_Target +{ + fixed3 viewDir = normalize(_WorldSpaceCameraPos - posWorld); + float invDot = 1.0 - saturate(dot(normalWorld, viewDir)); + float rimPower = pow(invDot, _RimPower); + float rim = saturate(rimPower * _RimColor.a); + +#if defined(_DIFFUSE_RAMP) + rim = calculateDiffuseRamp(rim).r; +#endif + + return lerp(pixel.rgb, _RimColor.xyz * pixel.a, rim); +} + +#endif //_RIM_LIGHTING + +//////////////////////////////////////// +// Emission functions +// + +#ifdef _EMISSION + +uniform sampler2D _EmissionMap; +uniform fixed4 _EmissionColor; +uniform float _EmissionPower; + + +#define APPLY_EMISSION(diffuse, uv) \ + { \ + diffuse += tex2D(_EmissionMap, uv).rgb * _EmissionColor.rgb * _EmissionPower; \ + } + +#else //!_EMISSION + +#define APPLY_EMISSION(diffuse, uv) + +#endif //!_EMISSION + +#endif // SPRITE_LIGHTING_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteLighting.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteLighting.cginc.meta new file mode 100644 index 0000000..279520a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteLighting.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 252dba02e84702448a0838ced241467d +timeCreated: 1479457856 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritePixelLighting.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritePixelLighting.cginc new file mode 100644 index 0000000..f08b59a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritePixelLighting.cginc @@ -0,0 +1,198 @@ +#ifndef SPRITE_PIXEL_LIGHTING_INCLUDED +#define SPRITE_PIXEL_LIGHTING_INCLUDED + +#include "ShaderShared.cginc" +#include "SpriteLighting.cginc" +#include "AutoLight.cginc" + +//////////////////////////////////////// +// Defines +// + +//////////////////////////////////////// +// Vertex output struct +// + +#if defined(_NORMALMAP) + #define _VERTEX_LIGHTING_INDEX TEXCOORD5 + #define _LIGHT_COORD_INDEX_0 6 + #define _LIGHT_COORD_INDEX_1 7 + #define _FOG_COORD_INDEX 8 +#else + #define _VERTEX_LIGHTING_INDEX TEXCOORD3 + #define _LIGHT_COORD_INDEX_0 4 + #define _LIGHT_COORD_INDEX_1 5 + #define _FOG_COORD_INDEX 6 +#endif // _NORMALMAP + +struct VertexOutput +{ + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 posWorld : TEXCOORD1; + half3 normalWorld : TEXCOORD2; +#if defined(_NORMALMAP) + half3 tangentWorld : TEXCOORD3; + half3 binormalWorld : TEXCOORD4; +#endif // _NORMALMAP + fixed3 vertexLighting : _VERTEX_LIGHTING_INDEX; + LIGHTING_COORDS(_LIGHT_COORD_INDEX_0, _LIGHT_COORD_INDEX_1) +#if defined(_FOG) + UNITY_FOG_COORDS(_FOG_COORD_INDEX) +#endif // _FOG +}; + +//////////////////////////////////////// +// Light calculations +// + +uniform fixed4 _LightColor0; + +inline fixed3 calculateLightDiffuse(VertexOutput input, float3 normalWorld) +{ + //For directional lights _WorldSpaceLightPos0.w is set to zero + float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w); + + float attenuation = LIGHT_ATTENUATION(input); + float angleDot = max(0, dot(normalWorld, lightWorldDirection)); + +#if defined(_DIFFUSE_RAMP) + fixed3 lightDiffuse = calculateRampedDiffuse(_LightColor0.rgb, attenuation, angleDot); +#else + fixed3 lightDiffuse = _LightColor0.rgb * (attenuation * angleDot); +#endif // _DIFFUSE_RAMP + + return lightDiffuse; +} + +inline float3 calculateNormalWorld(VertexOutput input) +{ +#if defined(_NORMALMAP) + return calculateNormalFromBumpMap(input.texcoord, input.tangentWorld, input.binormalWorld, input.normalWorld); +#else + return input.normalWorld; +#endif +} + +fixed3 calculateVertexLighting(float3 posWorld, float3 normalWorld) +{ + fixed3 vertexLighting = fixed3(0,0,0); + +#ifdef VERTEXLIGHT_ON + //Get approximated illumination from non-important point lights + vertexLighting = Shade4PointLights ( unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, + unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb, + unity_4LightAtten0, posWorld, normalWorld) * 0.5; +#endif + + return vertexLighting; +} + +fixed3 calculateAmbientLight(half3 normalWorld) +{ +#if defined(_SPHERICAL_HARMONICS) + fixed3 ambient = ShadeSH9(half4(normalWorld, 1.0)) * 0.75f; +#else + fixed3 ambient = unity_AmbientSky.rgb * 0.75; +#endif + return ambient; +} + +//////////////////////////////////////// +// Vertex program +// + +VertexOutput vert(VertexInput v) +{ + VertexOutput output; + + output.pos = calculateLocalPos(v.vertex); + output.color = calculateVertexColor(v.color); + output.texcoord = calculateTextureCoord(v.texcoord); + output.posWorld = calculateWorldPos(v.vertex); + output.normalWorld = calculateSpriteWorldNormal(v); + output.vertexLighting = calculateVertexLighting(output.posWorld, output.normalWorld); + +#if defined(_NORMALMAP) + output.tangentWorld = calculateWorldTangent(v.tangent); + output.binormalWorld = calculateSpriteWorldBinormal(output.normalWorld, output.tangentWorld, v.tangent.w); +#endif + + TRANSFER_VERTEX_TO_FRAGMENT(output) + +#if defined(_FOG) + UNITY_TRANSFER_FOG(output,output.pos); +#endif // _FOG + + return output; +} + +//////////////////////////////////////// +// Fragment programs +// + +fixed4 fragBase(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord); + ALPHA_CLIP(texureColor, input.color) + + //Get normal direction + fixed3 normalWorld = calculateNormalWorld(input); + + //Get Ambient diffuse + fixed3 ambient = calculateAmbientLight(normalWorld); + + //Get primary pixel light diffuse + fixed3 diffuse = calculateLightDiffuse(input, normalWorld); + + //Combine along with vertex lighting for the base lighting pass + fixed3 lighting = ambient + diffuse + input.vertexLighting; + + APPLY_EMISSION(lighting, input.texcoord) + + fixed4 pixel = calculateLitPixel(texureColor, input.color, lighting); + +#if defined(_RIM_LIGHTING) + pixel.rgb = applyRimLighting(input.posWorld, normalWorld, pixel); +#endif + + COLORISE(pixel) + +#if defined(_FOG) + fixed4 fogColor = lerp(fixed4(0,0,0,0), unity_FogColor, pixel.a); + UNITY_APPLY_FOG_COLOR(input.fogCoord, pixel, fogColor); +#endif // _FOG + + return pixel; +} + +fixed4 fragAdd(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord); + +#if defined(_COLOR_ADJUST) + texureColor = adjustColor(texureColor); +#endif // _COLOR_ADJUST + + ALPHA_CLIP(texureColor, input.color) + + //Get normal direction + fixed3 normalWorld = calculateNormalWorld(input); + + //Get light diffuse + fixed3 lighting = calculateLightDiffuse(input, normalWorld); + + fixed4 pixel = calculateAdditiveLitPixel(texureColor, input.color, lighting); + + COLORISE_ADDITIVE(pixel) + +#if defined(_FOG) + UNITY_APPLY_FOG_COLOR(input.fogCoord, pixel.rgb, fixed4(0,0,0,0)); // fog towards black in additive pass +#endif // _FOG + + return pixel; +} + + +#endif // SPRITE_PIXEL_LIGHTING_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritePixelLighting.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritePixelLighting.cginc.meta new file mode 100644 index 0000000..2759558 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritePixelLighting.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 38bcbfc10385d424c9cbac5b5b9ec1af +timeCreated: 1479457856 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteShadows.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteShadows.cginc new file mode 100644 index 0000000..6b88c19 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteShadows.cginc @@ -0,0 +1,52 @@ +#ifndef SPRITE_SHADOWS_INCLUDED +#define SPRITE_SHADOWS_INCLUDED + +#include "UnityCG.cginc" + +//////////////////////////////////////// +// Vertex structs +// + +struct vertexInput +{ + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; +}; + +struct vertexOutput +{ + V2F_SHADOW_CASTER; + float4 texcoord : TEXCOORD1; +}; + +//////////////////////////////////////// +// Vertex program +// + +uniform sampler2D _MainTex; +uniform fixed4 _MainTex_ST; + +vertexOutput vert(vertexInput v) +{ + vertexOutput o; + TRANSFER_SHADOW_CASTER(o) + o.texcoord = float4(TRANSFORM_TEX(v.texcoord, _MainTex), 0, 0); + return o; +} + +//////////////////////////////////////// +// Fragment program +// + + +uniform fixed _ShadowAlphaCutoff; + +fixed4 frag(vertexOutput IN) : COLOR +{ + fixed4 texureColor = tex2D(_MainTex, IN.texcoord.xy); + clip(texureColor.a - _ShadowAlphaCutoff); + + SHADOW_CASTER_FRAGMENT(IN) +} + +#endif // SPRITE_SHADOWS_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteShadows.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteShadows.cginc.meta new file mode 100644 index 0000000..610e02e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteShadows.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0f58b811a44f1b44cb9aac3ddfe24f37 +timeCreated: 1479457856 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteUnlit.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteUnlit.cginc new file mode 100644 index 0000000..b58a509 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteUnlit.cginc @@ -0,0 +1,67 @@ +#ifndef SPRITE_UNLIT_INCLUDED +#define SPRITE_UNLIT_INCLUDED + +#include "ShaderShared.cginc" + +//////////////////////////////////////// +// Vertex structs +// + +struct VertexInput +{ + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; + fixed4 color : COLOR; +}; + +struct VertexOutput +{ + float4 pos : SV_POSITION; + float2 texcoord : TEXCOORD0; + fixed4 color : COLOR; +#if defined(_FOG) + UNITY_FOG_COORDS(1) +#endif // _FOG +}; + +//////////////////////////////////////// +// Vertex program +// + +VertexOutput vert(VertexInput input) +{ + VertexOutput output; + + output.pos = calculateLocalPos(input.vertex); + output.texcoord = calculateTextureCoord(input.texcoord); + output.color = calculateVertexColor(input.color); + +#if defined(_FOG) + UNITY_TRANSFER_FOG(output,output.pos); +#endif // _FOG + + return output; +} + +//////////////////////////////////////// +// Fragment program +// + +fixed4 frag(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord.xy); + ALPHA_CLIP(texureColor, input.color) + + fixed4 pixel = calculatePixel(texureColor, input.color); + + COLORISE(pixel) + +#if defined(_FOG) + fixed4 fogColor = lerp(fixed4(0,0,0,0), unity_FogColor, pixel.a); + UNITY_APPLY_FOG_COLOR(input.fogCoord, pixel, fogColor); +#endif // _FOG + + return pixel; +} + +#endif // SPRITE_UNLIT_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteUnlit.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteUnlit.cginc.meta new file mode 100644 index 0000000..684bd24 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteUnlit.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e67832d6dd9dd914ca946fa7fcaa4a9e +timeCreated: 1479457856 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteVertexLighting.cginc b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteVertexLighting.cginc new file mode 100644 index 0000000..aae3b27 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteVertexLighting.cginc @@ -0,0 +1,430 @@ +#ifndef SPRITE_VERTEX_LIGHTING_INCLUDED +#define SPRITE_VERTEX_LIGHTING_INCLUDED + +#include "ShaderShared.cginc" +#include "SpriteLighting.cginc" +#include "UnityStandardUtils.cginc" + +//////////////////////////////////////// +// Defines +// + +//Define to use spot lights (more expensive) +#define SPOT_LIGHTS + +//Have to process lighting per pixel if using normal maps or a diffuse ramp or rim lighting +#if defined(_NORMALMAP) || defined(_DIFFUSE_RAMP) || defined(_RIM_LIGHTING) +#define PER_PIXEL_LIGHTING +#endif + +//Turn off bump mapping and diffuse ramping on older shader models as they dont support needed number of outputs +#if defined(PER_PIXEL_LIGHTING) && (SHADER_TARGET < 30) + #undef PER_PIXEL_LIGHTING + #undef _NORMALMAP + #undef _DIFFUSE_RAMP + #undef _RIM_LIGHTING +#endif + +//In D3D9 only have a max of 9 TEXCOORD so can't have diffuse ramping or fog or rim lighting if processing lights per pixel +#if defined(SHADER_API_D3D9) && defined(PER_PIXEL_LIGHTING) + #if defined(_NORMALMAP) + #undef _DIFFUSE_RAMP + #undef _FOG + #undef _RIM_LIGHTING + #elif defined(_DIFFUSE_RAMP) + #undef _FOG + #undef _RIM_LIGHTING + #elif defined(_RIM_LIGHTING) + #undef _FOG + #undef _DIFFUSE_RAMP + #else + #undef _DIFFUSE_RAMP + #undef _RIM_LIGHTING + #endif +#endif + +#if defined(PER_PIXEL_LIGHTING) + #if defined(_NORMALMAP) && defined(_DIFFUSE_RAMP) + #define ATTENUATIONS TEXCOORD9 + #if defined(_RIM_LIGHTING) + #define _POS_WORLD_INDEX TEXCOORD10 + #define _FOG_COORD_INDEX 11 + #else + #define _FOG_COORD_INDEX 10 + #endif + #elif defined(_NORMALMAP) != defined(_DIFFUSE_RAMP) + #define ATTENUATIONS TEXCOORD8 + #if defined(_RIM_LIGHTING) + #define _POS_WORLD_INDEX TEXCOORD9 + #define _FOG_COORD_INDEX 10 + #else + #define _FOG_COORD_INDEX 9 + #endif + #else //!_DIFFUSE_RAMP && !_NORMALMAP + #if defined(_RIM_LIGHTING) + #define _POS_WORLD_INDEX TEXCOORD8 + #define _FOG_COORD_INDEX 9 + #else + #define _FOG_COORD_INDEX 8 + #endif + #endif +#else //!PER_PIXEL_LIGHTING + #define _FOG_COORD_INDEX 2 +#endif + +//////////////////////////////////////// +// Vertex output struct +// + +struct VertexOutput +{ + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float3 texcoord : TEXCOORD0; + +#if defined(PER_PIXEL_LIGHTING) + + half4 VertexLightInfo0 : TEXCOORD1; + half4 VertexLightInfo1 : TEXCOORD2; + half4 VertexLightInfo2 : TEXCOORD3; + half4 VertexLightInfo3 : TEXCOORD4; + half4 VertexLightInfo4 : TEXCOORD5; + + #if defined(_NORMALMAP) + half4 normalWorld : TEXCOORD6; + half4 tangentWorld : TEXCOORD7; + half4 binormalWorld : TEXCOORD8; + #else + half3 normalWorld : TEXCOORD6; + half3 VertexLightInfo5 : TEXCOORD7; + #endif + #if defined(_DIFFUSE_RAMP) + half4 LightAttenuations : ATTENUATIONS; + #endif + #if defined(_RIM_LIGHTING) + float4 posWorld : _POS_WORLD_INDEX; + #endif + +#else //!PER_PIXEL_LIGHTING + + half3 FullLighting : TEXCOORD1; + +#endif // !PER_PIXEL_LIGHTING + +#if defined(_FOG) + UNITY_FOG_COORDS(_FOG_COORD_INDEX) +#endif // _FOG +}; + +//////////////////////////////////////// +// Light calculations +// + +struct VertexLightInfo +{ + half3 lightDirection; + fixed3 lightColor; + +#if defined(_DIFFUSE_RAMP) + float attenuation; +#endif // _DIFFUSE_RAMP +}; + +inline VertexLightInfo getVertexLightAttenuatedInfo(int index, float3 viewPos) +{ + VertexLightInfo lightInfo; + + //For directional lights unity_LightPosition.w is set to zero + lightInfo.lightDirection = unity_LightPosition[index].xyz - viewPos.xyz * unity_LightPosition[index].w; + float lengthSq = dot(lightInfo.lightDirection, lightInfo.lightDirection); + + // don't produce NaNs if some vertex position overlaps with the light + lengthSq = max(lengthSq, 0.000001); + + lightInfo.lightDirection *= rsqrt(lengthSq); + + float attenuation = 1.0 / (1.0 + lengthSq * unity_LightAtten[index].z); + +#if defined(SPOT_LIGHTS) + //Spot light attenuation - for non-spot lights unity_LightAtten.x is set to -1 and y is set to 1 + { + float rho = max (0, dot(lightInfo.lightDirection, unity_SpotDirection[index].xyz)); + float spotAtt = (rho - unity_LightAtten[index].x) * unity_LightAtten[index].y; + attenuation *= saturate(spotAtt); + } +#endif // SPOT_LIGHTS + + //If using a diffuse ramp texture then need to pass through the lights attenuation, otherwise premultiply the light color with it +#if defined(_DIFFUSE_RAMP) + lightInfo.lightColor = unity_LightColor[index].rgb; + lightInfo.attenuation = attenuation; +#else + lightInfo.lightColor = unity_LightColor[index].rgb * attenuation; +#endif // _DIFFUSE_RAMP + + return lightInfo; +} + +fixed3 calculateAmbientLight(half3 normalWorld) +{ +#if defined(_SPHERICAL_HARMONICS) + + //Magic constants used to tweak ambient to approximate pixel shader spherical harmonics + static const fixed3 worldUp = fixed3(0,1,0); + static const float skyGroundDotMul = 2.5; + static const float minEquatorMix = 0.5; + static const float equatorColorBlur = 0.33; + + float upDot = dot(normalWorld, worldUp); + + //Fade between a flat lerp from sky to ground and a 3 way lerp based on how bright the equator light is. + //This simulates how directional lights get blurred using spherical harmonics + + //Work out color from ground and sky, ignoring equator + float adjustedDot = upDot * skyGroundDotMul; + fixed3 skyGroundColor = lerp(unity_AmbientGround, unity_AmbientSky, saturate((adjustedDot + 1.0) * 0.5)); + + //Work out equator lights brightness + float equatorBright = saturate(dot(unity_AmbientEquator.rgb, unity_AmbientEquator.rgb)); + + //Blur equator color with sky and ground colors based on how bright it is. + fixed3 equatorBlurredColor = lerp(unity_AmbientEquator, saturate(unity_AmbientEquator + unity_AmbientGround + unity_AmbientSky), equatorBright * equatorColorBlur); + + //Work out 3 way lerp inc equator light + fixed3 equatorColor = lerp(equatorBlurredColor, unity_AmbientGround, -upDot) * step(upDot, 0) + lerp(equatorBlurredColor, unity_AmbientSky, upDot) * step(0, upDot); + + //Mix the two colors together based on how bright the equator light is + return lerp(skyGroundColor, equatorColor, saturate(equatorBright + minEquatorMix)) * 0.75; + +#else // !_SPHERICAL_HARMONICS + + //Flat ambient is just the sky color + return unity_AmbientSky.rgb * 0.75; + +#endif // !_SPHERICAL_HARMONICS +} + +//////////////////////////////////////// +// Light Packing Functions +// + +#if defined(_DIFFUSE_RAMP) + +inline fixed3 calculateLightDiffuse(fixed3 lightColor, half3 viewNormal, half3 lightViewDir, float attenuation) +{ + float angleDot = max(0, dot(viewNormal, lightViewDir)); + return calculateRampedDiffuse(lightColor, attenuation, angleDot); +} + +#else + +inline fixed3 calculateLightDiffuse(fixed3 attenuatedLightColor, half3 viewNormal, half3 lightViewDir) +{ + float angleDot = max(0, dot(viewNormal, lightViewDir)); + return attenuatedLightColor * angleDot; +} + +#endif // _NORMALMAP + + +#if defined(PER_PIXEL_LIGHTING) + +#define VERTEX_LIGHT_0_DIR VertexLightInfo0.xyz +#define VERTEX_LIGHT_0_R VertexLightInfo4.x +#define VERTEX_LIGHT_0_G VertexLightInfo4.y +#define VERTEX_LIGHT_0_B VertexLightInfo4.z + +#define VERTEX_LIGHT_1_DIR VertexLightInfo1.xyz +#define VERTEX_LIGHT_1_R VertexLightInfo0.w +#define VERTEX_LIGHT_1_G VertexLightInfo1.w +#define VERTEX_LIGHT_1_B VertexLightInfo2.w + +#define VERTEX_LIGHT_2_DIR VertexLightInfo2.xyz +#define VERTEX_LIGHT_2_R VertexLightInfo3.w +#define VERTEX_LIGHT_2_G VertexLightInfo4.w +#define VERTEX_LIGHT_2_B texcoord.z + +#define VERTEX_LIGHT_3_DIR VertexLightInfo3.xyz + +#if defined(_NORMALMAP) + #define VERTEX_LIGHT_3_R normalWorld.w + #define VERTEX_LIGHT_3_G tangentWorld.w + #define VERTEX_LIGHT_3_B binormalWorld.w +#else + #define VERTEX_LIGHT_3_R VertexLightInfo5.x + #define VERTEX_LIGHT_3_G VertexLightInfo5.y + #define VERTEX_LIGHT_3_B VertexLightInfo5.z +#endif + +#if defined(_DIFFUSE_RAMP) + + #define LIGHT_DIFFUSE_ATTEN_0 LightAttenuations.x + #define LIGHT_DIFFUSE_ATTEN_1 LightAttenuations.y + #define LIGHT_DIFFUSE_ATTEN_2 LightAttenuations.z + #define LIGHT_DIFFUSE_ATTEN_3 LightAttenuations.w + + #define PACK_VERTEX_LIGHT_DIFFUSE(index, output, lightInfo) \ + { \ + output.LIGHT_DIFFUSE_ATTEN_##index = lightInfo.attenuation; \ + } + + #define ADD_VERTEX_LIGHT_DIFFUSE(index, diffuse, input, lightColor, viewNormal, lightViewDir) \ + { \ + diffuse += calculateLightDiffuse(lightColor, viewNormal, lightViewDir, input.LIGHT_DIFFUSE_ATTEN_##index); \ + } +#else + #define PACK_VERTEX_LIGHT_DIFFUSE(index, output, lightInfo) + #define ADD_VERTEX_LIGHT_DIFFUSE(index, diffuse, input, lightColor, viewNormal, lightViewDir) \ + { \ + diffuse += calculateLightDiffuse(lightColor, viewNormal, lightViewDir); \ + } +#endif + +#define PACK_VERTEX_LIGHT(index, output, viewPos) \ + { \ + VertexLightInfo lightInfo = getVertexLightAttenuatedInfo(index, viewPos); \ + output.VERTEX_LIGHT_##index##_DIR = lightInfo.lightDirection; \ + output.VERTEX_LIGHT_##index##_R = lightInfo.lightColor.r; \ + output.VERTEX_LIGHT_##index##_G = lightInfo.lightColor.g; \ + output.VERTEX_LIGHT_##index##_B = lightInfo.lightColor.b; \ + PACK_VERTEX_LIGHT_DIFFUSE(index, output, lightInfo); \ + } + +#define ADD_VERTEX_LIGHT(index, input, viewNormal, diffuse) \ + { \ + half3 lightViewDir = input.VERTEX_LIGHT_##index##_DIR; \ + fixed3 lightColor = fixed3(input.VERTEX_LIGHT_##index##_R, input.VERTEX_LIGHT_##index##_G, input.VERTEX_LIGHT_##index##_B); \ + ADD_VERTEX_LIGHT_DIFFUSE(index, diffuse, input, lightColor, viewNormal, lightViewDir) \ + } + +#else //!PER_PIXEL_LIGHTING + +//////////////////////////////////////// +// Vertex Only Functions +// + +inline fixed3 calculateLightDiffuse(int index, float3 viewPos, half3 viewNormal) +{ + VertexLightInfo lightInfo = getVertexLightAttenuatedInfo(index, viewPos); + float angleDot = max(0, dot(viewNormal, lightInfo.lightDirection)); + return lightInfo.lightColor * angleDot; +} + +#endif // !PER_PIXEL_LIGHTING + +//////////////////////////////////////// +// Vertex program +// + +VertexOutput vert(VertexInput input) +{ + VertexOutput output; + + output.pos = calculateLocalPos(input.vertex); + output.color = calculateVertexColor(input.color); + output.texcoord = float3(calculateTextureCoord(input.texcoord), 0); + + float3 viewPos = UnityObjectToViewPos(input.vertex); + +#if defined(PER_PIXEL_LIGHTING) + + #if defined(_RIM_LIGHTING) + output.posWorld = calculateWorldPos(input.vertex); + #endif + + PACK_VERTEX_LIGHT(0, output, viewPos) + PACK_VERTEX_LIGHT(1, output, viewPos) + PACK_VERTEX_LIGHT(2, output, viewPos) + PACK_VERTEX_LIGHT(3, output, viewPos) + + output.normalWorld.xyz = calculateSpriteWorldNormal(input); + + #if defined(_NORMALMAP) + output.tangentWorld.xyz = calculateWorldTangent(input.tangent); + output.binormalWorld.xyz = calculateSpriteWorldBinormal(output.normalWorld, output.tangentWorld, input.tangent.w); + #endif + +#else // !PER_PIXEL_LIGHTING + + //Just pack full lighting + float3 viewNormal = calculateSpriteViewNormal(input); + + //Get Ambient diffuse + float3 normalWorld = calculateSpriteWorldNormal(input); + fixed3 ambient = calculateAmbientLight(normalWorld); + + fixed3 diffuse = calculateLightDiffuse(0, viewPos, viewNormal); + diffuse += calculateLightDiffuse(1, viewPos, viewNormal); + diffuse += calculateLightDiffuse(2, viewPos, viewNormal); + diffuse += calculateLightDiffuse(3, viewPos, viewNormal); + + output.FullLighting = ambient + diffuse; + +#endif // !PER_PIXEL_LIGHTING + +#if defined(_FOG) + UNITY_TRANSFER_FOG(output, output.pos); +#endif // _FOG + + return output; +} + +//////////////////////////////////////// +// Fragment program +// + +fixed4 frag(VertexOutput input) : SV_Target +{ + fixed4 texureColor = calculateTexturePixel(input.texcoord.xy); + ALPHA_CLIP(texureColor, input.color) + +#if defined(PER_PIXEL_LIGHTING) + + #if defined(_NORMALMAP) + half3 normalWorld = calculateNormalFromBumpMap(input.texcoord.xy, input.tangentWorld.xyz, input.binormalWorld.xyz, input.normalWorld.xyz); + #else + half3 normalWorld = input.normalWorld.xyz; + #endif + + //Get Ambient diffuse + fixed3 ambient = calculateAmbientLight(normalWorld); + + //Find vertex light diffuse + fixed3 diffuse = fixed3(0,0,0); + + //Add each vertex light to diffuse + half3 normalView = normalize(mul((float3x3)UNITY_MATRIX_V, normalWorld)); + ADD_VERTEX_LIGHT(0, input, normalView, diffuse) + ADD_VERTEX_LIGHT(1, input, normalView, diffuse) + ADD_VERTEX_LIGHT(2, input, normalView, diffuse) + ADD_VERTEX_LIGHT(3, input, normalView, diffuse) + + fixed3 lighting = ambient + diffuse; + + APPLY_EMISSION(lighting, input.texcoord.xy) + + fixed4 pixel = calculateLitPixel(texureColor, input.color, lighting); + +#if defined(_RIM_LIGHTING) + pixel.rgb = applyRimLighting(input.posWorld, normalWorld, pixel); +#endif + +#else // !PER_PIXEL_LIGHTING + + APPLY_EMISSION(input.FullLighting, input.texcoord.xy) + + fixed4 pixel = calculateLitPixel(texureColor, input.color, input.FullLighting); + +#endif // !PER_PIXEL_LIGHTING + + COLORISE(pixel) + +#if defined(_FOG) + fixed4 fogColor = lerp(fixed4(0,0,0,0), unity_FogColor, pixel.a); + UNITY_APPLY_FOG_COLOR(input.fogCoord, pixel, fogColor); +#endif // _FOG + + return pixel; +} + +#endif // SPRITE_VERTEX_LIGHTING_INCLUDED \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteVertexLighting.cginc.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteVertexLighting.cginc.meta new file mode 100644 index 0000000..f206cca --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpriteVertexLighting.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b256f9f092407414392d98f339173a2d +timeCreated: 1479457856 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesPixelLit.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesPixelLit.shader new file mode 100644 index 0000000..fca34de --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesPixelLit.shader @@ -0,0 +1,153 @@ +Shader "Spine/Sprite/Pixel Lit" +{ + Properties + { + _MainTex ("Main Texture", 2D) = "white" {} + _Color ("Color", Color) = (1,1,1,1) + + _BumpScale("Scale", Float) = 1.0 + _BumpMap ("Normal Map", 2D) = "bump" {} + + [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 + [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {} + [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0 + + _EmissionColor("Color", Color) = (0,0,0,0) + _EmissionMap("Emission", 2D) = "white" {} + _EmissionPower("Emission Power", Float) = 2.0 + + _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5 + _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0 + [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0 + _MetallicGlossMap("Metallic", 2D) = "white" {} + + _DiffuseRamp ("Diffuse Ramp Texture", 2D) = "gray" {} + + _FixedNormal ("Fixed Normal", Vector) = (0,0,1,1) + _ZWrite ("Depth Write", Float) = 1.0 + _Cutoff ("Depth alpha cutoff", Range(0,1)) = 0.5 + _ShadowAlphaCutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + _CustomRenderQueue ("Custom Render Queue", Float) = 0.0 + + _OverlayColor ("Overlay Color", Color) = (0,0,0,0) + _Hue("Hue", Range(-0.5,0.5)) = 0.0 + _Saturation("Saturation", Range(0,2)) = 1.0 + _Brightness("Brightness", Range(0,2)) = 1.0 + + _RimPower("Rim Power", Float) = 2.0 + _RimColor ("Rim Color", Color) = (1,1,1,1) + + _BlendTex ("Blend Texture", 2D) = "white" {} + _BlendAmount ("Blend", Range(0,1)) = 0.0 + + [HideInInspector] _SrcBlend ("__src", Float) = 1.0 + [HideInInspector] _DstBlend ("__dst", Float) = 0.0 + [HideInInspector] _RenderQueue ("__queue", Float) = 0.0 + [HideInInspector] _Cull ("__cull", Float) = 0.0 + } + + SubShader + { + Tags { "Queue"="Transparent" "RenderType"="Sprite" "AlphaDepth"="False" "CanUseSpriteAtlas"="True" "IgnoreProjector"="True" } + LOD 200 + + Pass + { + Name "FORWARD" + Tags { "LightMode" = "ForwardBase" } + Blend [_SrcBlend] [_DstBlend] + ZWrite [_ZWrite] + ZTest LEqual + Cull [_Cull] + + CGPROGRAM + #pragma target 3.0 + + #pragma shader_feature _ _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ADDITIVEBLEND _ADDITIVEBLEND_SOFT _MULTIPLYBLEND _MULTIPLYBLEND_X2 + #pragma shader_feature _ _FIXED_NORMALS_VIEWSPACE _FIXED_NORMALS_VIEWSPACE_BACKFACE _FIXED_NORMALS_MODELSPACE _FIXED_NORMALS_MODELSPACE_BACKFACE + #pragma shader_feature _ _SPECULAR _SPECULAR_GLOSSMAP + #pragma shader_feature _NORMALMAP + #pragma shader_feature _ALPHA_CLIP + #pragma shader_feature _EMISSION + #pragma shader_feature _RIM_LIGHTING + #pragma shader_feature _DIFFUSE_RAMP + #pragma shader_feature _COLOR_ADJUST + #pragma shader_feature _TEXTURE_BLEND + #pragma shader_feature _SPHERICAL_HARMONICS + #pragma shader_feature _FOG + + #pragma multi_compile_fwdbase + #pragma fragmentoption ARB_precision_hint_fastest + #pragma multi_compile_fog + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + + #pragma vertex vert + #pragma fragment fragBase + + #include "CGIncludes/SpritePixelLighting.cginc" + ENDCG + } + Pass + { + Name "FORWARD_DELTA" + Tags { "LightMode" = "ForwardAdd" } + Blend [_SrcBlend] One + ZWrite Off + ZTest LEqual + Cull [_Cull] + + CGPROGRAM + #pragma target 3.0 + + #pragma shader_feature _ _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ADDITIVEBLEND _ADDITIVEBLEND_SOFT _MULTIPLYBLEND _MULTIPLYBLEND_X2 + #pragma shader_feature _ _FIXED_NORMALS_VIEWSPACE _FIXED_NORMALS_VIEWSPACE_BACKFACE _FIXED_NORMALS_MODELSPACE _FIXED_NORMALS_MODELSPACE_BACKFACE + #pragma shader_feature _ _SPECULAR _SPECULAR_GLOSSMAP + #pragma shader_feature _NORMALMAP + #pragma shader_feature _ALPHA_CLIP + #pragma shader_feature _DIFFUSE_RAMP + #pragma shader_feature _COLOR_ADJUST + #pragma shader_feature _TEXTURE_BLEND + #pragma shader_feature _FOG + + #pragma multi_compile_fwdadd_fullshadows + #pragma fragmentoption ARB_precision_hint_fastest + #pragma multi_compile_fog + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + + #pragma vertex vert + #pragma fragment fragAdd + + #include "CGIncludes/SpritePixelLighting.cginc" + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + + Fog { Mode Off } + ZWrite On + ZTest LEqual + Cull Off + Lighting Off + + CGPROGRAM + #pragma fragmentoption ARB_precision_hint_fastest + #pragma multi_compile_shadowcaster + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + + #pragma vertex vert + #pragma fragment frag + + #include "CGIncludes/SpriteShadows.cginc" + ENDCG + } + } + + FallBack "Spine/Sprite/Unlit" + CustomEditor "SpineSpriteShaderGUI" +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesPixelLit.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesPixelLit.shader.meta new file mode 100644 index 0000000..c5a0947 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesPixelLit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6f7a5a97a82637f478494bc40ea8c8a2 +timeCreated: 1479457857 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesUnlit.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesUnlit.shader new file mode 100644 index 0000000..807a4c2 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesUnlit.shader @@ -0,0 +1,90 @@ +Shader "Spine/Sprite/Unlit" +{ + Properties + { + _MainTex ("Main Texture", 2D) = "white" {} + _Color ("Color", Color) = (1,1,1,1) + + [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 + [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {} + [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0 + + _ZWrite ("Depth Write", Float) = 0.0 + _Cutoff ("Depth alpha cutoff", Range(0,1)) = 0.0 + _ShadowAlphaCutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + _CustomRenderQueue ("Custom Render Queue", Float) = 0.0 + + _OverlayColor ("Overlay Color", Color) = (0,0,0,0) + _Hue("Hue", Range(-0.5,0.5)) = 0.0 + _Saturation("Saturation", Range(0,2)) = 1.0 + _Brightness("Brightness", Range(0,2)) = 1.0 + + _BlendTex ("Blend Texture", 2D) = "white" {} + _BlendAmount ("Blend", Range(0,1)) = 0.0 + + [HideInInspector] _SrcBlend ("__src", Float) = 1.0 + [HideInInspector] _DstBlend ("__dst", Float) = 0.0 + [HideInInspector] _RenderQueue ("__queue", Float) = 0.0 + [HideInInspector] _Cull ("__cull", Float) = 0.0 + } + + SubShader + { + Tags { "Queue"="Transparent" "RenderType"="Sprite" "AlphaDepth"="False" "CanUseSpriteAtlas"="True" "IgnoreProjector"="True" } + LOD 100 + + Pass + { + Blend [_SrcBlend] [_DstBlend] + Lighting Off + ZWrite [_ZWrite] + ZTest LEqual + Cull [_Cull] + Lighting Off + + CGPROGRAM + #pragma shader_feature _ _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ADDITIVEBLEND _ADDITIVEBLEND_SOFT _MULTIPLYBLEND _MULTIPLYBLEND_X2 + #pragma shader_feature _ALPHA_CLIP + #pragma shader_feature _TEXTURE_BLEND + #pragma shader_feature _COLOR_ADJUST + #pragma shader_feature _FOG + + #pragma fragmentoption ARB_precision_hint_fastest + #pragma multi_compile_fog + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + + #pragma vertex vert + #pragma fragment frag + + #include "CGIncludes/SpriteUnlit.cginc" + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + + Fog { Mode Off } + ZWrite On + ZTest LEqual + Cull Off + Lighting Off + + CGPROGRAM + #pragma fragmentoption ARB_precision_hint_fastest + #pragma multi_compile_shadowcaster + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + + #pragma vertex vert + #pragma fragment frag + + #include "CGIncludes/SpriteShadows.cginc" + ENDCG + } + } + + CustomEditor "SpineSpriteShaderGUI" +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesUnlit.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesUnlit.shader.meta new file mode 100644 index 0000000..0304ebb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesUnlit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 64005298b9a80bb4899eabd5140dc4a8 +timeCreated: 1479457857 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesVertexLit.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesVertexLit.shader new file mode 100644 index 0000000..7137b0d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesVertexLit.shader @@ -0,0 +1,120 @@ +Shader "Spine/Sprite/Vertex Lit" +{ + Properties + { + _MainTex ("Main Texture", 2D) = "white" {} + _Color ("Color", Color) = (1,1,1,1) + + _BumpScale("Scale", Float) = 1.0 + _BumpMap ("Normal Map", 2D) = "bump" {} + + [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 + [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {} + [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0 + + _EmissionColor("Color", Color) = (0,0,0,0) + _EmissionMap("Emission", 2D) = "white" {} + _EmissionPower("Emission Power", Float) = 2.0 + + _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5 + _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0 + [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0 + _MetallicGlossMap("Metallic", 2D) = "white" {} + + _DiffuseRamp ("Diffuse Ramp Texture", 2D) = "gray" {} + + _FixedNormal ("Fixed Normal", Vector) = (0,0,1,1) + _ZWrite ("Depth Write", Float) = 0.0 + _Cutoff ("Depth alpha cutoff", Range(0,1)) = 0.0 + _ShadowAlphaCutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + _CustomRenderQueue ("Custom Render Queue", Float) = 0.0 + + _OverlayColor ("Overlay Color", Color) = (0,0,0,0) + _Hue("Hue", Range(-0.5,0.5)) = 0.0 + _Saturation("Saturation", Range(0,2)) = 1.0 + _Brightness("Brightness", Range(0,2)) = 1.0 + + _RimPower("Rim Power", Float) = 2.0 + _RimColor ("Rim Color", Color) = (1,1,1,1) + + _BlendTex ("Blend Texture", 2D) = "white" {} + _BlendAmount ("Blend", Range(0,1)) = 0.0 + + [HideInInspector] _SrcBlend ("__src", Float) = 1.0 + [HideInInspector] _DstBlend ("__dst", Float) = 0.0 + [HideInInspector] _RenderQueue ("__queue", Float) = 0.0 + [HideInInspector] _Cull ("__cull", Float) = 0.0 + } + + SubShader + { + Tags { "Queue"="Transparent" "RenderType"="Sprite" "AlphaDepth"="False" "CanUseSpriteAtlas"="True" "IgnoreProjector"="True" } + LOD 150 + + Pass + { + Name "Vertex" + Tags { "LightMode" = "Vertex" } + Blend [_SrcBlend] [_DstBlend] + ZWrite [_ZWrite] + ZTest LEqual + Cull [_Cull] + Lighting On + + CGPROGRAM + #pragma target 3.0 + + #pragma shader_feature _ _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ADDITIVEBLEND _ADDITIVEBLEND_SOFT _MULTIPLYBLEND _MULTIPLYBLEND_X2 + #pragma shader_feature _ _FIXED_NORMALS_VIEWSPACE _FIXED_NORMALS_VIEWSPACE_BACKFACE _FIXED_NORMALS_MODELSPACE _FIXED_NORMALS_MODELSPACE_BACKFACE + #pragma shader_feature _ _SPECULAR _SPECULAR_GLOSSMAP + #pragma shader_feature _NORMALMAP + #pragma shader_feature _ALPHA_CLIP + #pragma shader_feature _EMISSION + #pragma shader_feature _DIFFUSE_RAMP + #pragma shader_feature _COLOR_ADJUST + #pragma shader_feature _RIM_LIGHTING + #pragma shader_feature _TEXTURE_BLEND + #pragma shader_feature _SPHERICAL_HARMONICS + #pragma shader_feature _FOG + + + #pragma fragmentoption ARB_precision_hint_fastest + #pragma multi_compile_fog + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + + #pragma vertex vert + #pragma fragment frag + + #include "CGIncludes/SpriteVertexLighting.cginc" + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + + Fog { Mode Off } + ZWrite On + ZTest LEqual + Cull Off + Lighting Off + + CGPROGRAM + #pragma fragmentoption ARB_precision_hint_fastest + #pragma multi_compile_shadowcaster + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + + #pragma vertex vert + #pragma fragment frag + + #include "CGIncludes/SpriteShadows.cginc" + ENDCG + } + } + + FallBack "Spine/Sprite/Unlit" + CustomEditor "SpineSpriteShaderGUI" +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesVertexLit.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesVertexLit.shader.meta new file mode 100644 index 0000000..34d232e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Sprite/SpritesVertexLit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2ce511398fb980f41b7d316c51534590 +timeCreated: 1479457856 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha.meta new file mode 100644 index 0000000..e423168 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d6f7e10049c6d6348ae5c92ccb3825e0 +folderAsset: yes +timeCreated: 1521392482 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader new file mode 100644 index 0000000..a4c0eba --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader @@ -0,0 +1,56 @@ +// - Unlit + no shadow +// - Double-sided, no depth + +Shader "Spine/Straight Alpha/Skeleton Fill" { + Properties { + _FillColor ("FillColor", Color) = (1,1,1,1) + _FillPhase ("FillPhase", Range(0, 1)) = 0 + [NoScaleOffset]_MainTex ("MainTex", 2D) = "white" {} + } + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + Blend One OneMinusSrcAlpha + Cull Off + ZWrite Off + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float4 _FillColor; + float _FillPhase; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o = (VertexOutput)0; + o.uv = v.uv; + o.vertexColor = v.vertexColor; + o.pos = UnityObjectToClipPos(v.vertex); + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 rawColor = tex2D(_MainTex,i.uv); + float finalAlpha = (rawColor.a * i.vertexColor.a); + float3 finalColor = lerp((rawColor.rgb * i.vertexColor.rgb * rawColor.a), (_FillColor.rgb * finalAlpha), _FillPhase); + return fixed4(finalColor, finalAlpha); + } + ENDCG + } + } + FallBack "Diffuse" +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader.meta new file mode 100644 index 0000000..38c4a7c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ec3c686f972ccf5459c2b55555e6635f +timeCreated: 1492385797 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader new file mode 100644 index 0000000..85d89cf --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader @@ -0,0 +1,99 @@ +// - Two color tint +// - unlit +// - No depth, no backface culling, no fog. + +Shader "Spine/Straight Alpha/Skeleton Tint" { + Properties { + _Color ("Tint Color", Color) = (1,1,1,1) + _Black ("Black Point", Color) = (0,0,0,0) + [NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {} + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + + Fog { Mode Off } + Cull Off + ZWrite Off + Blend One OneMinusSrcAlpha + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float4 _Color; + float4 _Black; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); // replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + o.uv = v.uv; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 texColor = tex2D(_MainTex, i.uv); + texColor = float4(texColor.rgb * texColor.a, texColor.a); + return (texColor * i.vertexColor) + float4(((1-texColor.rgb) * _Black.rgb * texColor.a*_Color.a*i.vertexColor.a), 0); + } + ENDCG + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + ZWrite On + ZTest LEqual + + Fog { Mode Off } + Cull Off + Lighting Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + sampler2D _MainTex; + fixed _Cutoff; + + struct VertexOutput { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + VertexOutput vert (appdata_base v) { + VertexOutput o; + o.uv = v.texcoord; + TRANSFER_SHADOW_CASTER(o) + return o; + } + + float4 frag (VertexOutput i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader.meta new file mode 100644 index 0000000..e2b0cbe --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c9a84b3418d033a4f9749511a6ac36d6 +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic.meta new file mode 100644 index 0000000..dfa68ee --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6338355ec521d6848bb8ef1e10272b3e +folderAsset: yes +timeCreated: 1455493504 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/BoneFollowerGraphic.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/BoneFollowerGraphic.cs new file mode 100644 index 0000000..018189d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/BoneFollowerGraphic.cs @@ -0,0 +1,133 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Spine.Unity { + [ExecuteInEditMode] + [DisallowMultipleComponent] + [AddComponentMenu("Spine/UI/BoneFollowerGraphic")] + public class BoneFollowerGraphic : MonoBehaviour { + public SkeletonGraphic skeletonGraphic; + public SkeletonGraphic SkeletonGraphic { + get { return skeletonGraphic; } + set { + skeletonGraphic = value; + Initialize(); + } + } + + public bool initializeOnAwake = true; + + /// If a bone isn't set in code, boneName is used to find the bone at the beginning. For runtime switching by name, use SetBoneByName. You can also set the BoneFollower.bone field directly. + [SpineBone(dataField: "skeletonGraphic")] + [SerializeField] public string boneName; + + public bool followBoneRotation = true; + [Tooltip("Follows the skeleton's flip state by controlling this Transform's local scale.")] + public bool followSkeletonFlip = true; + [Tooltip("Follows the target bone's local scale. BoneFollower cannot inherit world/skewed scale because of UnityEngine.Transform property limitations.")] + public bool followLocalScale = false; + public bool followZPosition = true; + + [System.NonSerialized] public Bone bone; + + Transform skeletonTransform; + bool skeletonTransformIsParent; + + [System.NonSerialized] public bool valid; + + /// + /// Sets the target bone by its bone name. Returns false if no bone was found. + public bool SetBone (string name) { + bone = skeletonGraphic.Skeleton.FindBone(name); + if (bone == null) { + Debug.LogError("Bone not found: " + name, this); + return false; + } + boneName = name; + return true; + } + + public void Awake () { + if (initializeOnAwake) Initialize(); + } + + public void Initialize () { + bone = null; + valid = skeletonGraphic != null && skeletonGraphic.IsValid; + if (!valid) return; + + skeletonTransform = skeletonGraphic.transform; +// skeletonGraphic.OnRebuild -= HandleRebuildRenderer; +// skeletonGraphic.OnRebuild += HandleRebuildRenderer; + skeletonTransformIsParent = Transform.ReferenceEquals(skeletonTransform, transform.parent); + + if (!string.IsNullOrEmpty(boneName)) + bone = skeletonGraphic.Skeleton.FindBone(boneName); + + #if UNITY_EDITOR + if (Application.isEditor) { + LateUpdate(); + } + #endif + } + + public void LateUpdate () { + if (!valid) { + Initialize(); + return; + } + + #if UNITY_EDITOR + if (!Application.isPlaying) + skeletonTransformIsParent = Transform.ReferenceEquals(skeletonTransform, transform.parent); + #endif + + if (bone == null) { + if (string.IsNullOrEmpty(boneName)) return; + bone = skeletonGraphic.Skeleton.FindBone(boneName); + if (!SetBone(boneName)) return; + } + + var thisTransform = this.transform as RectTransform; + if (thisTransform == null) return; + + var canvas = skeletonGraphic.canvas; + if (canvas == null) canvas = skeletonGraphic.GetComponentInParent(); + float scale = canvas.referencePixelsPerUnit; + + if (skeletonTransformIsParent) { + // Recommended setup: Use local transform properties if Spine GameObject is the immediate parent + thisTransform.localPosition = new Vector3(bone.worldX * scale, bone.worldY * scale, followZPosition ? 0f : thisTransform.localPosition.z); + if (followBoneRotation) thisTransform.localRotation = bone.GetQuaternion(); + } else { + // For special cases: Use transform world properties if transform relationship is complicated + Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX * scale, bone.worldY * scale, 0f)); + if (!followZPosition) targetWorldPosition.z = thisTransform.position.z; + + float boneWorldRotation = bone.WorldRotationX; + + Transform transformParent = thisTransform.parent; + if (transformParent != null) { + Matrix4x4 m = transformParent.localToWorldMatrix; + if (m.m00 * m.m11 - m.m01 * m.m10 < 0) // Determinant2D is negative + boneWorldRotation = -boneWorldRotation; + } + + if (followBoneRotation) { + Vector3 worldRotation = skeletonTransform.rotation.eulerAngles; + thisTransform.position = targetWorldPosition; + thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, + skeletonTransform.rotation.eulerAngles.z + boneWorldRotation); + } else { + thisTransform.position = targetWorldPosition; + } + } + + Vector3 localScale = followLocalScale ? new Vector3(bone.scaleX, bone.scaleY, 1f) : new Vector3(1f, 1f, 1f); + if (followSkeletonFlip) localScale.y *= bone.skeleton.flipX ^ bone.skeleton.flipY ? -1f : 1f; + thisTransform.localScale = localScale; + } + + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/BoneFollowerGraphic.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/BoneFollowerGraphic.cs.meta new file mode 100644 index 0000000..b227966 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/BoneFollowerGraphic.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b42a195b47491d34b9bcbc40898bcb29 +timeCreated: 1499211965 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor.meta new file mode 100644 index 0000000..12c3774 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 78bba472871bc624f8930d51dea6dd3d +folderAsset: yes +timeCreated: 1455570938 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/BoneFollowerGraphicInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/BoneFollowerGraphicInspector.cs new file mode 100644 index 0000000..1d74f0b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/BoneFollowerGraphicInspector.cs @@ -0,0 +1,172 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +using Spine.Unity; + +namespace Spine.Unity.Editor { + + using Editor = UnityEditor.Editor; + using Event = UnityEngine.Event; + + [CustomEditor(typeof(BoneFollowerGraphic)), CanEditMultipleObjects] + public class BoneFollowerGraphicInspector : Editor { + + SerializedProperty boneName, skeletonGraphic, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip; + BoneFollowerGraphic targetBoneFollower; + bool needsReset; + + #region Context Menu Item + [MenuItem ("CONTEXT/SkeletonGraphic/Add BoneFollower GameObject")] + static void AddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonGraphic = cmd.context as SkeletonGraphic; + var go = new GameObject("BoneFollower", typeof(RectTransform)); + var t = go.transform; + t.SetParent(skeletonGraphic.transform); + t.localPosition = Vector3.zero; + + var f = go.AddComponent(); + f.skeletonGraphic = skeletonGraphic; + f.SetBone(skeletonGraphic.Skeleton.RootBone.Data.Name); + + EditorGUIUtility.PingObject(t); + + Undo.RegisterCreatedObjectUndo(go, "Add BoneFollowerGraphic"); + } + + // Validate + [MenuItem ("CONTEXT/SkeletonGraphic/Add BoneFollower GameObject", true)] + static bool ValidateAddBoneFollowerGameObject (MenuCommand cmd) { + var skeletonGraphic = cmd.context as SkeletonGraphic; + return skeletonGraphic.IsValid; + } + #endregion + + void OnEnable () { + skeletonGraphic = serializedObject.FindProperty("skeletonGraphic"); + boneName = serializedObject.FindProperty("boneName"); + followBoneRotation = serializedObject.FindProperty("followBoneRotation"); + followZPosition = serializedObject.FindProperty("followZPosition"); + followLocalScale = serializedObject.FindProperty("followLocalScale"); + followSkeletonFlip = serializedObject.FindProperty("followSkeletonFlip"); + + targetBoneFollower = (BoneFollowerGraphic)target; + if (targetBoneFollower.SkeletonGraphic != null) + targetBoneFollower.SkeletonGraphic.Initialize(false); + + if (!targetBoneFollower.valid || needsReset) { + targetBoneFollower.Initialize(); + targetBoneFollower.LateUpdate(); + needsReset = false; + SceneView.RepaintAll(); + } + } + + public void OnSceneGUI () { + var tbf = target as BoneFollowerGraphic; + var skeletonGraphicComponent = tbf.SkeletonGraphic; + if (skeletonGraphicComponent == null) return; + + var transform = skeletonGraphicComponent.transform; + var skeleton = skeletonGraphicComponent.Skeleton; + var canvas = skeletonGraphicComponent.canvas; + float positionScale = canvas == null ? 1f : skeletonGraphicComponent.canvas.referencePixelsPerUnit; + + if (string.IsNullOrEmpty(boneName.stringValue)) { + SpineHandles.DrawBones(transform, skeleton, positionScale); + SpineHandles.DrawBoneNames(transform, skeleton, positionScale); + Handles.Label(tbf.transform.position, "No bone selected", EditorStyles.helpBox); + } else { + var targetBone = tbf.bone; + if (targetBone == null) return; + + SpineHandles.DrawBoneWireframe(transform, targetBone, SpineHandles.TransformContraintColor, positionScale); + Handles.Label(targetBone.GetWorldPosition(transform, positionScale), targetBone.Data.Name, SpineHandles.BoneNameStyle); + } + } + + override public void OnInspectorGUI () { + if (serializedObject.isEditingMultipleObjects) { + if (needsReset) { + needsReset = false; + foreach (var o in targets) { + var bf = (BoneFollower)o; + bf.Initialize(); + bf.LateUpdate(); + } + SceneView.RepaintAll(); + } + + EditorGUI.BeginChangeCheck(); + DrawDefaultInspector(); + needsReset |= EditorGUI.EndChangeCheck(); + return; + } + + if (needsReset && Event.current.type == EventType.Layout) { + targetBoneFollower.Initialize(); + targetBoneFollower.LateUpdate(); + needsReset = false; + SceneView.RepaintAll(); + } + serializedObject.Update(); + + // Find Renderer + if (skeletonGraphic.objectReferenceValue == null) { + SkeletonGraphic parentRenderer = targetBoneFollower.GetComponentInParent(); + if (parentRenderer != null && parentRenderer.gameObject != targetBoneFollower.gameObject) { + skeletonGraphic.objectReferenceValue = parentRenderer; + Debug.Log("Inspector automatically assigned BoneFollowerGraphic.SkeletonGraphic"); + } + } + + EditorGUILayout.PropertyField(skeletonGraphic); + var skeletonGraphicComponent = skeletonGraphic.objectReferenceValue as SkeletonGraphic; + if (skeletonGraphicComponent != null) { + if (skeletonGraphicComponent.gameObject == targetBoneFollower.gameObject) { + skeletonGraphic.objectReferenceValue = null; + EditorUtility.DisplayDialog("Invalid assignment.", "BoneFollowerGraphic can only follow a skeleton on a separate GameObject.\n\nCreate a new GameObject for your BoneFollower, or choose a SkeletonGraphic from a different GameObject.", "Ok"); + } + } + + if (!targetBoneFollower.valid) { + needsReset = true; + } + + if (targetBoneFollower.valid) { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(boneName); + needsReset |= EditorGUI.EndChangeCheck(); + + EditorGUILayout.PropertyField(followBoneRotation); + EditorGUILayout.PropertyField(followZPosition); + EditorGUILayout.PropertyField(followLocalScale); + EditorGUILayout.PropertyField(followSkeletonFlip); + + //BoneFollowerInspector.RecommendRigidbodyButton(targetBoneFollower); + } else { + var boneFollowerSkeletonGraphic = targetBoneFollower.skeletonGraphic; + if (boneFollowerSkeletonGraphic == null) { + EditorGUILayout.HelpBox("SkeletonGraphic is unassigned. Please assign a SkeletonRenderer (SkeletonAnimation or SkeletonAnimator).", MessageType.Warning); + } else { + boneFollowerSkeletonGraphic.Initialize(false); + + if (boneFollowerSkeletonGraphic.skeletonDataAsset == null) + EditorGUILayout.HelpBox("Assigned SkeletonGraphic does not have SkeletonData assigned to it.", MessageType.Warning); + + if (!boneFollowerSkeletonGraphic.IsValid) + EditorGUILayout.HelpBox("Assigned SkeletonGraphic is invalid. Check target SkeletonGraphic, its SkeletonDataAsset or the console for other errors.", MessageType.Warning); + } + } + + var current = Event.current; + bool wasUndo = (current.type == EventType.ValidateCommand && current.commandName == "UndoRedoPerformed"); + if (wasUndo) + targetBoneFollower.Initialize(); + + serializedObject.ApplyModifiedProperties(); + } + + } +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/BoneFollowerGraphicInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/BoneFollowerGraphicInspector.cs.meta new file mode 100644 index 0000000..b3d60a4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/BoneFollowerGraphicInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: da44a8561fd243c43a1f77bda36de0eb +timeCreated: 1499279157 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/SkeletonGraphicInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/SkeletonGraphicInspector.cs new file mode 100644 index 0000000..10687c3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/SkeletonGraphicInspector.cs @@ -0,0 +1,229 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEditor; +using Spine; + +namespace Spine.Unity.Editor { + + [InitializeOnLoad] + [CustomEditor(typeof(SkeletonGraphic))] + [CanEditMultipleObjects] + public class SkeletonGraphicInspector : UnityEditor.Editor { + SerializedProperty material, color; + SerializedProperty skeletonDataAsset, initialSkinName; + SerializedProperty startingAnimation, startingLoop, timeScale, freeze, unscaledTime, tintBlack; + SerializedProperty initialFlipX, initialFlipY; + SerializedProperty meshGeneratorSettings; + SerializedProperty raycastTarget; + + SkeletonGraphic thisSkeletonGraphic; + + void OnEnable () { + var so = this.serializedObject; + thisSkeletonGraphic = target as SkeletonGraphic; + + // MaskableGraphic + material = so.FindProperty("m_Material"); + color = so.FindProperty("m_Color"); + raycastTarget = so.FindProperty("m_RaycastTarget"); + + // SkeletonRenderer + skeletonDataAsset = so.FindProperty("skeletonDataAsset"); + initialSkinName = so.FindProperty("initialSkinName"); + + initialFlipX = so.FindProperty("initialFlipX"); + initialFlipY = so.FindProperty("initialFlipY"); + + // SkeletonAnimation + startingAnimation = so.FindProperty("startingAnimation"); + startingLoop = so.FindProperty("startingLoop"); + timeScale = so.FindProperty("timeScale"); + unscaledTime = so.FindProperty("unscaledTime"); + freeze = so.FindProperty("freeze"); + + meshGeneratorSettings = so.FindProperty("meshGenerator").FindPropertyRelative("settings"); + meshGeneratorSettings.isExpanded = SkeletonRendererInspector.advancedFoldout; + } + + public override void OnInspectorGUI () { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(skeletonDataAsset); + EditorGUILayout.PropertyField(material); + EditorGUILayout.PropertyField(color); + + if (thisSkeletonGraphic.skeletonDataAsset == null) { + EditorGUILayout.HelpBox("You need to assign a SkeletonDataAsset first.", MessageType.Info); + serializedObject.ApplyModifiedProperties(); + serializedObject.Update(); + return; + } + using (new SpineInspectorUtility.BoxScope()) { + EditorGUILayout.PropertyField(meshGeneratorSettings, SpineInspectorUtility.TempContent("Advanced..."), includeChildren: true); + SkeletonRendererInspector.advancedFoldout = meshGeneratorSettings.isExpanded; + } + + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(initialSkinName); + { + var rect = GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, EditorGUIUtility.singleLineHeight); + EditorGUI.PrefixLabel(rect, SpineInspectorUtility.TempContent("Initial Flip")); + rect.x += EditorGUIUtility.labelWidth; + rect.width = 30f; + SpineInspectorUtility.ToggleLeft(rect, initialFlipX, SpineInspectorUtility.TempContent("X", tooltip: "initialFlipX")); + rect.x += 35f; + SpineInspectorUtility.ToggleLeft(rect, initialFlipY, SpineInspectorUtility.TempContent("Y", tooltip: "initialFlipY")); + } + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Animation", EditorStyles.boldLabel); + EditorGUILayout.PropertyField(startingAnimation); + EditorGUILayout.PropertyField(startingLoop); + EditorGUILayout.PropertyField(timeScale); + EditorGUILayout.PropertyField(unscaledTime, SpineInspectorUtility.TempContent(unscaledTime.displayName, tooltip: "If checked, this will use Time.unscaledDeltaTime to make this update independent of game Time.timeScale. Instance SkeletonGraphic.timeScale will still be applied.")); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(freeze); + EditorGUILayout.Space(); + EditorGUILayout.LabelField("UI", EditorStyles.boldLabel); + EditorGUILayout.PropertyField(raycastTarget); + + bool wasChanged = EditorGUI.EndChangeCheck(); + + if (wasChanged) + serializedObject.ApplyModifiedProperties(); + } + + #region Menus + [MenuItem("CONTEXT/SkeletonGraphic/Match RectTransform with Mesh Bounds")] + static void MatchRectTransformWithBounds (MenuCommand command) { + var skeletonGraphic = (SkeletonGraphic)command.context; + Mesh mesh = skeletonGraphic.GetLastMesh(); + if (mesh == null) { + Debug.Log("Mesh was not previously generated."); + return; + } + + if (mesh.vertexCount == 0) { + skeletonGraphic.rectTransform.sizeDelta = new Vector2(50f, 50f); + skeletonGraphic.rectTransform.pivot = new Vector2(0.5f, 0.5f); + return; + } + + mesh.RecalculateBounds(); + var bounds = mesh.bounds; + var size = bounds.size; + var center = bounds.center; + var p = new Vector2( + 0.5f - (center.x / size.x), + 0.5f - (center.y / size.y) + ); + + skeletonGraphic.rectTransform.sizeDelta = size; + skeletonGraphic.rectTransform.pivot = p; + } + + [MenuItem("GameObject/Spine/SkeletonGraphic (UnityUI)", false, 15)] + static public void SkeletonGraphicCreateMenuItem () { + var parentGameObject = Selection.activeObject as GameObject; + var parentTransform = parentGameObject == null ? null : parentGameObject.GetComponent(); + + if (parentTransform == null) + Debug.LogWarning("Your new SkeletonGraphic will not be visible until it is placed under a Canvas"); + + var gameObject = NewSkeletonGraphicGameObject("New SkeletonGraphic"); + gameObject.transform.SetParent(parentTransform, false); + EditorUtility.FocusProjectWindow(); + Selection.activeObject = gameObject; + EditorGUIUtility.PingObject(Selection.activeObject); + } + + // SpineEditorUtilities.InstantiateDelegate. Used by drag and drop. + public static Component SpawnSkeletonGraphicFromDrop (SkeletonDataAsset data) { + return InstantiateSkeletonGraphic(data); + } + + public static SkeletonGraphic InstantiateSkeletonGraphic (SkeletonDataAsset skeletonDataAsset, string skinName) { + return InstantiateSkeletonGraphic(skeletonDataAsset, skeletonDataAsset.GetSkeletonData(true).FindSkin(skinName)); + } + + public static SkeletonGraphic InstantiateSkeletonGraphic (SkeletonDataAsset skeletonDataAsset, Skin skin = null) { + string spineGameObjectName = string.Format("SkeletonGraphic ({0})", skeletonDataAsset.name.Replace("_SkeletonData", "")); + var go = NewSkeletonGraphicGameObject(spineGameObjectName); + var graphic = go.GetComponent(); + graphic.skeletonDataAsset = skeletonDataAsset; + + SkeletonData data = skeletonDataAsset.GetSkeletonData(true); + + if (data == null) { + for (int i = 0; i < skeletonDataAsset.atlasAssets.Length; i++) { + string reloadAtlasPath = AssetDatabase.GetAssetPath(skeletonDataAsset.atlasAssets[i]); + skeletonDataAsset.atlasAssets[i] = (AtlasAsset)AssetDatabase.LoadAssetAtPath(reloadAtlasPath, typeof(AtlasAsset)); + } + + data = skeletonDataAsset.GetSkeletonData(true); + } + + skin = skin ?? data.DefaultSkin ?? data.Skins.Items[0]; + graphic.MeshGenerator.settings.zSpacing = SpineEditorUtilities.defaultZSpacing; + + graphic.Initialize(false); + if (skin != null) graphic.Skeleton.SetSkin(skin); + graphic.initialSkinName = skin.Name; + graphic.Skeleton.UpdateWorldTransform(); + graphic.UpdateMesh(); + + return graphic; + } + + static GameObject NewSkeletonGraphicGameObject (string gameObjectName) { + var go = new GameObject(gameObjectName, typeof(RectTransform), typeof(CanvasRenderer), typeof(SkeletonGraphic)); + var graphic = go.GetComponent(); + graphic.material = SkeletonGraphicInspector.DefaultSkeletonGraphicMaterial; + return go; + } + + public static Material DefaultSkeletonGraphicMaterial { + get { + var guids = AssetDatabase.FindAssets("SkeletonGraphicDefault t:material"); + if (guids.Length <= 0) return null; + + var firstAssetPath = AssetDatabase.GUIDToAssetPath(guids[0]); + if (string.IsNullOrEmpty(firstAssetPath)) return null; + + var firstMaterial = AssetDatabase.LoadAssetAtPath(firstAssetPath); + return firstMaterial; + } + } + + #endregion + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/SkeletonGraphicInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/SkeletonGraphicInspector.cs.meta new file mode 100644 index 0000000..5fced2e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Editor/SkeletonGraphicInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0d81cc76b52fcdf499b2db252a317726 +timeCreated: 1455570945 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders.meta new file mode 100644 index 0000000..da6d0a2 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 43897010c7e77c54897cb98c1ddf84f1 +folderAsset: yes +timeCreated: 1455128695 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicDefault.mat b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicDefault.mat new file mode 100644 index 0000000..08d7764 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicDefault.mat @@ -0,0 +1,87 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: SkeletonGraphicDefault + m_Shader: {fileID: 4800000, guid: fa95b0fb6983c0f40a152e6f9aa82bfb, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - PixelSnap: 0 + - _BumpScale: 1 + - _ColorMask: 15 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnableExternalAlpha: 0 + - _Glossiness: 0.5 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SrcBlend: 1 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UVSec: 0 + - _UseUIAlphaClip: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Flip: {r: 1, g: 1, b: 1, a: 1} + - _RendererColor: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicDefault.mat.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicDefault.mat.meta new file mode 100644 index 0000000..aaa80ff --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicDefault.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b66cf7a186d13054989b33a5c90044e4 +timeCreated: 1455140322 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicTintBlack.mat b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicTintBlack.mat new file mode 100644 index 0000000..d78d415 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicTintBlack.mat @@ -0,0 +1,79 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: SkeletonGraphicTintBlack + m_Shader: {fileID: 4800000, guid: f64c7bc238bb2c246b8ca1912b2b6b9c, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _ColorMask: 15 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Glossiness: 0.5 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SrcBlend: 1 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UVSec: 0 + - _UseUIAlphaClip: 0 + - _ZWrite: 1 + m_Colors: + - _Black: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicTintBlack.mat.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicTintBlack.mat.meta new file mode 100644 index 0000000..0d83b23 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/SkeletonGraphicTintBlack.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cfcea0e11aa80bb4b8d05790b905fc31 +timeCreated: 1455140322 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic-TintBlack.shader b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic-TintBlack.shader new file mode 100644 index 0000000..eb02354 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic-TintBlack.shader @@ -0,0 +1,118 @@ +// This is a premultiply-alpha adaptation of the built-in Unity shader "UI/Default" to allow Unity UI stencil masking. + +Shader "Spine/SkeletonGraphic Tint Black (Premultiply Alpha)" +{ + Properties + { + [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} + _Color ("Tint", Color) = (1,1,1,1) + _Black ("Black Point", Color) = (0,0,0,0) + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _ColorMask ("Color Mask", Float) = 15 + + [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 + } + + SubShader + { + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull Off + Lighting Off + ZWrite Off + ZTest [unity_GUIZTestMode] + Fog { Mode Off } + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + struct VertexInput { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + half2 texcoord : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float4 worldPosition : TEXCOORD3; + UNITY_VERTEX_OUTPUT_STEREO + }; + + fixed4 _Color; + fixed4 _Black; + fixed4 _TextureSampleAdd; + float4 _ClipRect; + + VertexOutput vert (VertexInput IN) { + VertexOutput OUT; + + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); + + OUT.worldPosition = IN.vertex; + OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); + OUT.texcoord = IN.texcoord; + + OUT.color = IN.color * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + OUT.uv1 = IN.uv1; + OUT.uv2 = IN.uv2; + return OUT; + } + + sampler2D _MainTex; + + fixed4 frag (VertexOutput IN) : SV_Target + { + half4 texColor = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd); + + texColor.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + + #ifdef UNITY_UI_ALPHACLIP + clip (texColor.a - 0.001); + #endif + + return (texColor * IN.color) + float4(((1-texColor.rgb) * (_Black.rgb + float3(IN.uv1.r, IN.uv1.g, IN.uv2.r)) * texColor.a * _Color.a * IN.color.a), 0); + } + ENDCG + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic-TintBlack.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic-TintBlack.shader.meta new file mode 100644 index 0000000..5193a26 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic-TintBlack.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f64c7bc238bb2c246b8ca1912b2b6b9c +timeCreated: 1455080068 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic.shader b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic.shader new file mode 100644 index 0000000..fa25e7b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic.shader @@ -0,0 +1,115 @@ +// This is a premultiply-alpha adaptation of the built-in Unity shader "UI/Default" in Unity 5.6.2 to allow Unity UI stencil masking. + +Shader "Spine/SkeletonGraphic (Premultiply Alpha)" +{ + Properties + { + [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} + _Color ("Tint", Color) = (1,1,1,1) + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _ColorMask ("Color Mask", Float) = 15 + + [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 + } + + SubShader + { + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull Off + Lighting Off + ZWrite Off + ZTest [unity_GUIZTestMode] + Fog { Mode Off } + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + struct VertexInput { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + half2 texcoord : TEXCOORD0; + float4 worldPosition : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO + }; + + fixed4 _Color; + fixed4 _TextureSampleAdd; + float4 _ClipRect; + + VertexOutput vert (VertexInput IN) { + VertexOutput OUT; + + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); + + OUT.worldPosition = IN.vertex; + OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); + OUT.texcoord = IN.texcoord; + + #ifdef UNITY_HALF_TEXEL_OFFSET + OUT.vertex.xy += (_ScreenParams.zw-1.0) * float2(-1,1); + #endif + + OUT.color = IN.color * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + return OUT; + } + + sampler2D _MainTex; + + fixed4 frag (VertexOutput IN) : SV_Target + { + half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; + + color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + + #ifdef UNITY_UI_ALPHACLIP + clip (color.a - 0.001); + #endif + + return color; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic.shader.meta new file mode 100644 index 0000000..167123f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/Shaders/Spine-SkeletonGraphic.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fa95b0fb6983c0f40a152e6f9aa82bfb +timeCreated: 1455080068 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs new file mode 100644 index 0000000..d6db696 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs @@ -0,0 +1,299 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEngine.UI; +using Spine; + +namespace Spine.Unity { + [ExecuteInEditMode, RequireComponent(typeof(CanvasRenderer), typeof(RectTransform)), DisallowMultipleComponent] + [AddComponentMenu("Spine/SkeletonGraphic (Unity UI Canvas)")] + public class SkeletonGraphic : MaskableGraphic, ISkeletonComponent, IAnimationStateComponent, ISkeletonAnimation, IHasSkeletonDataAsset { + + #region Inspector + public SkeletonDataAsset skeletonDataAsset; + public SkeletonDataAsset SkeletonDataAsset { get { return skeletonDataAsset; } } + + [SpineSkin(dataField:"skeletonDataAsset")] + public string initialSkinName = "default"; + public bool initialFlipX, initialFlipY; + + [SpineAnimation(dataField:"skeletonDataAsset")] + public string startingAnimation; + public bool startingLoop; + public float timeScale = 1f; + public bool freeze; + public bool unscaledTime; + + #if UNITY_EDITOR + protected override void OnValidate () { + // This handles Scene View preview. + base.OnValidate (); + if (this.IsValid) { + if (skeletonDataAsset == null) { + Clear(); + startingAnimation = ""; + } else if (skeletonDataAsset.GetSkeletonData(true) != skeleton.data) { + Clear(); + Initialize(true); + startingAnimation = ""; + if (skeletonDataAsset.atlasAssets.Length > 1 || skeletonDataAsset.atlasAssets[0].materials.Length > 1) + Debug.LogError("Unity UI does not support multiple textures per Renderer. Your skeleton will not be rendered correctly. Recommend using SkeletonAnimation instead. This requires the use of a Screen space camera canvas."); + } else { + if (freeze) return; + + if (!string.IsNullOrEmpty(initialSkinName)) { + var skin = skeleton.data.FindSkin(initialSkinName); + if (skin != null) { + if (skin == skeleton.data.defaultSkin) + skeleton.SetSkin((Skin)null); + else + skeleton.SetSkin(skin); + } + + } + + // Only provide visual feedback to inspector changes in Unity Editor Edit mode. + if (!Application.isPlaying) { + skeleton.flipX = this.initialFlipX; + skeleton.flipY = this.initialFlipY; + + skeleton.SetToSetupPose(); + if (!string.IsNullOrEmpty(startingAnimation)) + skeleton.PoseWithAnimation(startingAnimation, 0f, false); + } + + } + } else { + if (skeletonDataAsset != null) + Initialize(true); + } + } + + protected override void Reset () { + base.Reset(); + if (material == null || material.shader != Shader.Find("Spine/SkeletonGraphic (Premultiply Alpha)")) + Debug.LogWarning("SkeletonGraphic works best with the SkeletonGraphic material."); + } + #endif + #endregion + + #region Runtime Instantiation + public static SkeletonGraphic NewSkeletonGraphicGameObject (SkeletonDataAsset skeletonDataAsset, Transform parent) { + SkeletonGraphic sg = SkeletonGraphic.AddSkeletonGraphicComponent(new GameObject("New Spine GameObject"), skeletonDataAsset); + if (parent != null) sg.transform.SetParent(parent, false); + return sg; + } + + public static SkeletonGraphic AddSkeletonGraphicComponent (GameObject gameObject, SkeletonDataAsset skeletonDataAsset) { + var c = gameObject.AddComponent(); + if (skeletonDataAsset != null) { + c.skeletonDataAsset = skeletonDataAsset; + c.Initialize(false); + } + return c; + } + #endregion + + #region Internals + // This is used by the UI system to determine what to put in the MaterialPropertyBlock. + Texture overrideTexture; + public Texture OverrideTexture { + get { return overrideTexture; } + set { + overrideTexture = value; + canvasRenderer.SetTexture(this.mainTexture); // Refresh canvasRenderer's texture. Make sure it handles null. + } + } + public override Texture mainTexture { + get { + // Fail loudly when incorrectly set up. + if (overrideTexture != null) return overrideTexture; + return skeletonDataAsset == null ? null : skeletonDataAsset.atlasAssets[0].materials[0].mainTexture; + } + } + + protected override void Awake () { + base.Awake (); + if (!this.IsValid) { + Initialize(false); + Rebuild(CanvasUpdate.PreRender); + } + } + + public override void Rebuild (CanvasUpdate update) { + base.Rebuild(update); + if (canvasRenderer.cull) return; + if (update == CanvasUpdate.PreRender) UpdateMesh(); + } + + public virtual void Update () { + if (freeze) return; + Update(unscaledTime ? Time.unscaledDeltaTime : Time.deltaTime); + } + + public virtual void Update (float deltaTime) { + if (!this.IsValid) return; + + deltaTime *= timeScale; + skeleton.Update(deltaTime); + state.Update(deltaTime); + state.Apply(skeleton); + + if (UpdateLocal != null) UpdateLocal(this); + + skeleton.UpdateWorldTransform(); + + if (UpdateWorld != null) { + UpdateWorld(this); + skeleton.UpdateWorldTransform(); + } + + if (UpdateComplete != null) UpdateComplete(this); + } + + public void LateUpdate () { + if (freeze) return; + //this.SetVerticesDirty(); // Which is better? + UpdateMesh(); + } + #endregion + + #region API + protected Skeleton skeleton; + public Skeleton Skeleton { get { return skeleton; } internal set { skeleton = value; } } + public SkeletonData SkeletonData { get { return skeleton == null ? null : skeleton.data; } } + public bool IsValid { get { return skeleton != null; } } + + protected Spine.AnimationState state; + public Spine.AnimationState AnimationState { get { return state; } } + + [SerializeField] protected Spine.Unity.MeshGenerator meshGenerator = new MeshGenerator(); + public Spine.Unity.MeshGenerator MeshGenerator { get { return this.meshGenerator; } } + DoubleBuffered meshBuffers; + SkeletonRendererInstruction currentInstructions = new SkeletonRendererInstruction(); + + public Mesh GetLastMesh () { + return meshBuffers.GetCurrent().mesh; + } + + public event UpdateBonesDelegate UpdateLocal; + public event UpdateBonesDelegate UpdateWorld; + public event UpdateBonesDelegate UpdateComplete; + + /// Occurs after the vertex data populated every frame, before the vertices are pushed into the mesh. + public event Spine.Unity.MeshGeneratorDelegate OnPostProcessVertices; + + public void Clear () { + skeleton = null; + canvasRenderer.Clear(); + } + + public void Initialize (bool overwrite) { + if (this.IsValid && !overwrite) return; + + // Make sure none of the stuff is null + if (this.skeletonDataAsset == null) return; + var skeletonData = this.skeletonDataAsset.GetSkeletonData(false); + if (skeletonData == null) return; + + if (skeletonDataAsset.atlasAssets.Length <= 0 || skeletonDataAsset.atlasAssets[0].materials.Length <= 0) return; + + this.state = new Spine.AnimationState(skeletonDataAsset.GetAnimationStateData()); + if (state == null) { + Clear(); + return; + } + + this.skeleton = new Skeleton(skeletonData) { + flipX = this.initialFlipX, + flipY = this.initialFlipY + }; + + meshBuffers = new DoubleBuffered(); + canvasRenderer.SetTexture(this.mainTexture); // Needed for overwriting initializations. + + // Set the initial Skin and Animation + if (!string.IsNullOrEmpty(initialSkinName)) + skeleton.SetSkin(initialSkinName); + + #if UNITY_EDITOR + if (!string.IsNullOrEmpty(startingAnimation)) { + if (Application.isPlaying) { + state.SetAnimation(0, startingAnimation, startingLoop); + } else { + // Assume SkeletonAnimation is valid for skeletonData and skeleton. Checked above. + var animationObject = skeletonDataAsset.GetSkeletonData(false).FindAnimation(startingAnimation); + if (animationObject != null) + animationObject.PoseSkeleton(skeleton, 0); + } + Update(0); + } + #else + if (!string.IsNullOrEmpty(startingAnimation)) { + state.SetAnimation(0, startingAnimation, startingLoop); + Update(0); + } + #endif + } + + public void UpdateMesh () { + if (!this.IsValid) return; + + skeleton.SetColor(this.color); + var smartMesh = meshBuffers.GetNext(); + var currentInstructions = this.currentInstructions; + + MeshGenerator.GenerateSingleSubmeshInstruction(currentInstructions, skeleton, this.material); + bool updateTriangles = SkeletonRendererInstruction.GeometryNotEqual(currentInstructions, smartMesh.instructionUsed); + + meshGenerator.Begin(); + if (currentInstructions.hasActiveClipping) { + meshGenerator.AddSubmesh(currentInstructions.submeshInstructions.Items[0], updateTriangles); + } else { + meshGenerator.BuildMeshWithArrays(currentInstructions, updateTriangles); + } + + if (canvas != null) meshGenerator.ScaleVertexData(canvas.referencePixelsPerUnit); + if (OnPostProcessVertices != null) OnPostProcessVertices.Invoke(this.meshGenerator.Buffers); + + var mesh = smartMesh.mesh; + meshGenerator.FillVertexData(mesh); + if (updateTriangles) meshGenerator.FillTrianglesSingle(mesh); + meshGenerator.FillLateVertexData(mesh); + + canvasRenderer.SetMesh(mesh); + smartMesh.instructionUsed.Set(currentInstructions); + + //this.UpdateMaterial(); // TODO: This allocates memory. + } + #endregion + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs.meta new file mode 100644 index 0000000..e44ab78 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: d85b887af7e6c3f45a2e2d2920d641bc +timeCreated: 1455576193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: + - m_Material: {fileID: 2100000, guid: b66cf7a186d13054989b33a5c90044e4, type: 2} + - skeletonDataAsset: {instanceID: 0} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphicMirror.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphicMirror.cs new file mode 100644 index 0000000..8fa8996 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphicMirror.cs @@ -0,0 +1,101 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Spine.Unity.Modules { + public class SkeletonGraphicMirror : MonoBehaviour { + + public SkeletonRenderer source; + public bool mirrorOnStart = true; + public bool restoreOnDisable = true; + SkeletonGraphic skeletonGraphic; + + Skeleton originalSkeleton; + bool originalFreeze; + Texture2D overrideTexture; + + private void Awake () { + skeletonGraphic = GetComponent(); + } + + void Start () { + if (mirrorOnStart) StartMirroring(); + } + + void LateUpdate () { + skeletonGraphic.UpdateMesh(); + } + + void OnDisable () { + if (restoreOnDisable) RestoreIndependentSkeleton(); + } + + /// Freeze the SkeletonGraphic on this GameObject, and use the source as the Skeleton to be rendered by the SkeletonGraphic. + public void StartMirroring () { + if (source == null) return; + if (skeletonGraphic == null) return; + + skeletonGraphic.startingAnimation = string.Empty; + + if (originalSkeleton == null) { + originalSkeleton = skeletonGraphic.Skeleton; + originalFreeze = skeletonGraphic.freeze; + } + + skeletonGraphic.Skeleton = source.skeleton; + skeletonGraphic.freeze = true; + if (overrideTexture != null) + skeletonGraphic.OverrideTexture = overrideTexture; + } + + /// Use a new texture for the SkeletonGraphic. Use this if your source skeleton uses a repacked atlas. + public void UpdateTexture (Texture2D newOverrideTexture) { + overrideTexture = newOverrideTexture; + if (newOverrideTexture != null) + skeletonGraphic.OverrideTexture = overrideTexture; + } + + /// Stops mirroring the source SkeletonRenderer and allows the SkeletonGraphic to become an independent Skeleton component again. + public void RestoreIndependentSkeleton () { + if (originalSkeleton == null) + return; + + skeletonGraphic.Skeleton = originalSkeleton; + skeletonGraphic.freeze = originalFreeze; + skeletonGraphic.OverrideTexture = null; + + originalSkeleton = null; + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphicMirror.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphicMirror.cs.meta new file mode 100644 index 0000000..3e0f6bc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphicMirror.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dbeb0b9949e46754eb0e0b61021b4f1c +timeCreated: 1532024358 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator.meta new file mode 100644 index 0000000..72398a4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3a361f5ac799a5149b340f9e20da27d1 +folderAsset: yes +timeCreated: 1457405502 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor.meta new file mode 100644 index 0000000..1d2ca48 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 211465c9f045fd142abe552a6ffdc799 +folderAsset: yes +timeCreated: 1457405813 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonPartsRendererInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonPartsRendererInspector.cs new file mode 100644 index 0000000..81eda3f --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonPartsRendererInspector.cs @@ -0,0 +1,56 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEditor; +using Spine.Unity.Editor; + +namespace Spine.Unity.Modules { + [CustomEditor(typeof(SkeletonPartsRenderer))] + public class SkeletonRenderPartInspector : UnityEditor.Editor { + SpineInspectorUtility.SerializedSortingProperties sortingProperties; + + void OnEnable () { + sortingProperties = new SpineInspectorUtility.SerializedSortingProperties((target as Component).GetComponent()); + } + + public override void OnInspectorGUI () { + SpineInspectorUtility.SortingPropertyFields(sortingProperties, true); + EditorGUILayout.Space(); + if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Select SkeletonRenderer", SpineEditorUtilities.Icons.spine))) { + var thisSkeletonPartsRenderer = target as SkeletonPartsRenderer; + var srs = thisSkeletonPartsRenderer.GetComponentInParent(); + if (srs != null && srs.partsRenderers.Contains(thisSkeletonPartsRenderer) && srs.SkeletonRenderer != null) + Selection.activeGameObject = srs.SkeletonRenderer.gameObject; + } + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonPartsRendererInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonPartsRendererInspector.cs.meta new file mode 100644 index 0000000..a97d662 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonPartsRendererInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 30e43037bf4433645ad70266f34c1c8b +timeCreated: 1458051036 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs new file mode 100644 index 0000000..856e531 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs @@ -0,0 +1,291 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEditor; + +using System.Collections.Generic; + +using Spine.Unity; +using Spine.Unity.Editor; + +namespace Spine.Unity.Modules { + + [CustomEditor(typeof(SkeletonRenderSeparator))] + public class SkeletonRenderSeparatorInspector : UnityEditor.Editor { + SkeletonRenderSeparator component; + + // Properties + SerializedProperty skeletonRenderer_, copyPropertyBlock_, copyMeshRendererFlags_, partsRenderers_; + static bool partsRenderersExpanded = false; + + // For separator field. + SerializedObject skeletonRendererSerializedObject; + SerializedProperty separatorNamesProp; + static bool skeletonRendererExpanded = true; + bool slotsReapplyRequired = false; + + void OnEnable () { + if (component == null) + component = target as SkeletonRenderSeparator; + + skeletonRenderer_ = serializedObject.FindProperty("skeletonRenderer"); + copyPropertyBlock_ = serializedObject.FindProperty("copyPropertyBlock"); + copyMeshRendererFlags_ = serializedObject.FindProperty("copyMeshRendererFlags"); + + var partsRenderers = component.partsRenderers; + partsRenderers_ = serializedObject.FindProperty("partsRenderers"); + partsRenderers_.isExpanded = partsRenderersExpanded || // last state + partsRenderers.Contains(null) || // null items found + partsRenderers.Count < 1 || // no parts renderers + (skeletonRenderer_.objectReferenceValue != null && SkeletonRendererSeparatorCount + 1 > partsRenderers.Count); // not enough parts renderers + } + + int SkeletonRendererSeparatorCount { + get { + if (Application.isPlaying) + return component.SkeletonRenderer.separatorSlots.Count; + else + return separatorNamesProp == null ? 0 : separatorNamesProp.arraySize; + } + } + + public override void OnInspectorGUI () { + var componentRenderers = component.partsRenderers; + int totalParts; + + using (new SpineInspectorUtility.LabelWidthScope()) { + bool componentEnabled = component.enabled; + bool checkBox = EditorGUILayout.Toggle("Enable Separator", componentEnabled); + if (checkBox != componentEnabled) + component.enabled = checkBox; + if (component.SkeletonRenderer.disableRenderingOnOverride && !component.enabled) + EditorGUILayout.HelpBox("By default, SkeletonRenderer's MeshRenderer is disabled while the SkeletonRenderSeparator takes over rendering. It is re-enabled when SkeletonRenderSeparator is disabled.", MessageType.Info); + + EditorGUILayout.PropertyField(copyPropertyBlock_); + EditorGUILayout.PropertyField(copyMeshRendererFlags_); + } + + // SkeletonRenderer Box + using (new SpineInspectorUtility.BoxScope(false)) { + // Fancy SkeletonRenderer foldout reference field + { + EditorGUI.indentLevel++; + EditorGUI.BeginChangeCheck(); + var foldoutSkeletonRendererRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); + EditorGUI.PropertyField(foldoutSkeletonRendererRect, skeletonRenderer_); + if (EditorGUI.EndChangeCheck()) + serializedObject.ApplyModifiedProperties(); + if (component.SkeletonRenderer != null) { + skeletonRendererExpanded = EditorGUI.Foldout(foldoutSkeletonRendererRect, skeletonRendererExpanded, ""); + } + EditorGUI.indentLevel--; + } + + int separatorCount = 0; + EditorGUI.BeginChangeCheck(); + if (component.SkeletonRenderer != null) { + // Separators from SkeletonRenderer + { + bool skeletonRendererMismatch = skeletonRendererSerializedObject != null && skeletonRendererSerializedObject.targetObject != component.SkeletonRenderer; + if (separatorNamesProp == null || skeletonRendererMismatch) { + if (component.SkeletonRenderer != null) { + skeletonRendererSerializedObject = new SerializedObject(component.SkeletonRenderer); + separatorNamesProp = skeletonRendererSerializedObject.FindProperty("separatorSlotNames"); + separatorNamesProp.isExpanded = true; + } + } + + if (separatorNamesProp != null) { + if (skeletonRendererExpanded) { + EditorGUI.indentLevel++; + SkeletonRendererInspector.SeparatorsField(separatorNamesProp); + EditorGUI.indentLevel--; + } + separatorCount = this.SkeletonRendererSeparatorCount; + } + } + + if (SkeletonRendererSeparatorCount == 0) { + EditorGUILayout.HelpBox("Separators are empty. Change the size to 1 and choose a slot if you want the render to be separated.", MessageType.Info); + } + } + + if (EditorGUI.EndChangeCheck()) { + skeletonRendererSerializedObject.ApplyModifiedProperties(); + + if (!Application.isPlaying) + slotsReapplyRequired = true; + } + + + totalParts = separatorCount + 1; + var counterStyle = skeletonRendererExpanded ? EditorStyles.label : EditorStyles.miniLabel; + EditorGUILayout.LabelField(string.Format("{0}: separates into {1}.", SpineInspectorUtility.Pluralize(separatorCount, "separator", "separators"), SpineInspectorUtility.Pluralize(totalParts, "part", "parts") ), counterStyle); + } + + // Parts renderers + using (new SpineInspectorUtility.BoxScope(false)) { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(this.partsRenderers_, true); + EditorGUI.indentLevel--; + + // Null items warning + bool nullItemsFound = componentRenderers.Contains(null); + if (nullItemsFound) + EditorGUILayout.HelpBox("Some items in the parts renderers list are null and may cause problems.\n\nYou can right-click on that element and choose 'Delete Array Element' to remove it.", MessageType.Warning); + + // (Button) Match Separators count + if (separatorNamesProp != null) { + int currentRenderers = 0; + foreach (var r in componentRenderers) { + if (r != null) + currentRenderers++; + } + int extraRenderersNeeded = totalParts - currentRenderers; + + if (component.enabled && component.SkeletonRenderer != null && extraRenderersNeeded > 0) { + EditorGUILayout.HelpBox(string.Format("Insufficient parts renderers. Some parts will not be rendered."), MessageType.Warning); + string addMissingLabel = string.Format("Add the missing renderer{1} ({0}) ", extraRenderersNeeded, SpineInspectorUtility.PluralThenS(extraRenderersNeeded)); + if (GUILayout.Button(addMissingLabel, GUILayout.Height(40f))) { + AddPartsRenderer(extraRenderersNeeded); + DetectOrphanedPartsRenderers(component); + } + } + } + + if (partsRenderers_.isExpanded != partsRenderersExpanded) partsRenderersExpanded = partsRenderers_.isExpanded; + if (partsRenderers_.isExpanded) { + using (new EditorGUILayout.HorizontalScope()) { + // (Button) Destroy Renderers button + if (componentRenderers.Count > 0) { + if (GUILayout.Button("Clear Parts Renderers")) { + // Do you really want to destroy all? + Undo.RegisterCompleteObjectUndo(component, "Clear Parts Renderers"); + if (EditorUtility.DisplayDialog("Destroy Renderers", "Do you really want to destroy all the Parts Renderer GameObjects in the list?", "Destroy", "Cancel")) { + foreach (var r in componentRenderers) { + if (r != null) + Undo.DestroyObjectImmediate(r.gameObject); + } + componentRenderers.Clear(); + // Do you also want to destroy orphans? (You monster.) + DetectOrphanedPartsRenderers(component); + } + } + } + + // (Button) Add Part Renderer button + if (GUILayout.Button("Add Parts Renderer")) + AddPartsRenderer(1); + } + } + } + + serializedObject.ApplyModifiedProperties(); + + if (slotsReapplyRequired && UnityEngine.Event.current.type == EventType.Repaint) { + SkeletonRendererInspector.ReapplySeparatorSlotNames(component.SkeletonRenderer); + component.SkeletonRenderer.LateUpdate(); + SceneView.RepaintAll(); + slotsReapplyRequired = false; + } + } + + public void AddPartsRenderer (int count) { + var componentRenderers = component.partsRenderers; + bool emptyFound = componentRenderers.Contains(null); + if (emptyFound) { + bool userClearEntries = EditorUtility.DisplayDialog("Empty entries found", "Null entries found. Do you want to remove null entries before adding the new renderer? ", "Clear Empty Entries", "Don't Clear"); + if (userClearEntries) componentRenderers.RemoveAll(x => x == null); + } + + Undo.RegisterCompleteObjectUndo(component, "Add Parts Renderers"); + for (int i = 0; i < count; i++) { + int index = componentRenderers.Count; + var smr = SkeletonPartsRenderer.NewPartsRendererGameObject(component.transform, index.ToString()); + Undo.RegisterCreatedObjectUndo(smr.gameObject, "New Parts Renderer GameObject."); + componentRenderers.Add(smr); + + // increment renderer sorting order. + if (index == 0) continue; + var prev = componentRenderers[index - 1]; if (prev == null) continue; + + var prevMeshRenderer = prev.GetComponent(); + var currentMeshRenderer = smr.GetComponent(); + if (prevMeshRenderer == null || currentMeshRenderer == null) continue; + + int prevSortingLayer = prevMeshRenderer.sortingLayerID; + int prevSortingOrder = prevMeshRenderer.sortingOrder; + currentMeshRenderer.sortingLayerID = prevSortingLayer; + currentMeshRenderer.sortingOrder = prevSortingOrder + SkeletonRenderSeparator.DefaultSortingOrderIncrement; + } + + } + + /// Detects orphaned parts renderers and offers to delete them. + public void DetectOrphanedPartsRenderers (SkeletonRenderSeparator component) { + var children = component.GetComponentsInChildren(); + + var orphans = new System.Collections.Generic.List(); + foreach (var r in children) { + if (!component.partsRenderers.Contains(r)) + orphans.Add(r); + } + + if (orphans.Count > 0) { + if (EditorUtility.DisplayDialog("Destroy Submesh Renderers", "Unassigned renderers were found. Do you want to delete them? (These may belong to another Render Separator in the same hierarchy. If you don't have another Render Separator component in the children of this GameObject, it's likely safe to delete. Warning: This operation cannot be undone.)", "Delete", "Cancel")) { + foreach (var o in orphans) { + Undo.DestroyObjectImmediate(o.gameObject); + } + } + } + } + + #region SkeletonRenderer Context Menu Item + [MenuItem ("CONTEXT/SkeletonRenderer/Add Skeleton Render Separator")] + static void AddRenderSeparatorComponent (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + var newComponent = skeletonRenderer.gameObject.AddComponent(); + + Undo.RegisterCreatedObjectUndo(newComponent, "Add SkeletonRenderSeparator"); + } + + // Validate + [MenuItem ("CONTEXT/SkeletonRenderer/Add Skeleton Render Separator", true)] + static bool ValidateAddRenderSeparatorComponent (MenuCommand cmd) { + var skeletonRenderer = cmd.context as SkeletonRenderer; + var separator = skeletonRenderer.GetComponent(); + bool separatorNotOnObject = separator == null; + return separatorNotOnObject; + } + #endregion + + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs.meta new file mode 100644 index 0000000..7e8e658 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d2a5062cfe5dd4344831cda4723128af +timeCreated: 1458067064 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs new file mode 100644 index 0000000..df61f15 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs @@ -0,0 +1,139 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; + +namespace Spine.Unity.Modules { + [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))] + public class SkeletonPartsRenderer : MonoBehaviour { + + #region Properties + MeshGenerator meshGenerator; + public MeshGenerator MeshGenerator { + get { + LazyIntialize(); + return meshGenerator; + } + } + + MeshRenderer meshRenderer; + public MeshRenderer MeshRenderer { + get { + LazyIntialize(); + return meshRenderer; + } + } + + MeshFilter meshFilter; + public MeshFilter MeshFilter { + get { + LazyIntialize(); + return meshFilter; + } + } + #endregion + + MeshRendererBuffers buffers; + SkeletonRendererInstruction currentInstructions = new SkeletonRendererInstruction(); + + + void LazyIntialize () { + if (buffers == null) { + buffers = new MeshRendererBuffers(); + buffers.Initialize(); + + if (meshGenerator != null) return; + meshGenerator = new MeshGenerator(); + meshFilter = GetComponent(); + meshRenderer = GetComponent(); + currentInstructions.Clear(); + } + } + + public void ClearMesh () { + LazyIntialize(); + meshFilter.sharedMesh = null; + } + + public void RenderParts (ExposedList instructions, int startSubmesh, int endSubmesh) { + LazyIntialize(); + + // STEP 1: Create instruction + var smartMesh = buffers.GetNextMesh(); + currentInstructions.SetWithSubset(instructions, startSubmesh, endSubmesh); + bool updateTriangles = SkeletonRendererInstruction.GeometryNotEqual(currentInstructions, smartMesh.instructionUsed); + + // STEP 2: Generate mesh buffers. + var currentInstructionsSubmeshesItems = currentInstructions.submeshInstructions.Items; + meshGenerator.Begin(); + if (currentInstructions.hasActiveClipping) { + for (int i = 0; i < currentInstructions.submeshInstructions.Count; i++) + meshGenerator.AddSubmesh(currentInstructionsSubmeshesItems[i], updateTriangles); + } else { + meshGenerator.BuildMeshWithArrays(currentInstructions, updateTriangles); + } + + buffers.UpdateSharedMaterials(currentInstructions.submeshInstructions); + + // STEP 3: modify mesh. + var mesh = smartMesh.mesh; + + if (meshGenerator.VertexCount <= 0) { // Clear an empty mesh + updateTriangles = false; + mesh.Clear(); + } else { + meshGenerator.FillVertexData(mesh); + if (updateTriangles) { + meshGenerator.FillTriangles(mesh); + meshRenderer.sharedMaterials = buffers.GetUpdatedSharedMaterialsArray(); + } else if (buffers.MaterialsChangedInLastUpdate()) { + meshRenderer.sharedMaterials = buffers.GetUpdatedSharedMaterialsArray(); + } + } + meshGenerator.FillLateVertexData(mesh); + + meshFilter.sharedMesh = mesh; + smartMesh.instructionUsed.Set(currentInstructions); + } + + public void SetPropertyBlock (MaterialPropertyBlock block) { + LazyIntialize(); + meshRenderer.SetPropertyBlock(block); + } + + public static SkeletonPartsRenderer NewPartsRendererGameObject (Transform parent, string name) { + var go = new GameObject(name, typeof(MeshFilter), typeof(MeshRenderer)); + go.transform.SetParent(parent, false); + var returnComponent = go.AddComponent(); + + return returnComponent; + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs.meta new file mode 100644 index 0000000..9359388 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1c0b968d1e7333b499e347acb644f1c1 +timeCreated: 1458045480 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs new file mode 100644 index 0000000..c23e256 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs @@ -0,0 +1,235 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#define SPINE_OPTIONAL_RENDEROVERRIDE + +using UnityEngine; +using System.Collections.Generic; +using Spine.Unity; + +namespace Spine.Unity.Modules { + + [ExecuteInEditMode] + [UnityEngine.HelpURL("https://github.com/pharan/spine-unity-docs/blob/master/SkeletonRenderSeparator.md")] + public class SkeletonRenderSeparator : MonoBehaviour { + public const int DefaultSortingOrderIncrement = 5; + + #region Inspector + [SerializeField] + protected SkeletonRenderer skeletonRenderer; + public SkeletonRenderer SkeletonRenderer { + get { return skeletonRenderer; } + set { + #if SPINE_OPTIONAL_RENDEROVERRIDE + if (skeletonRenderer != null) + skeletonRenderer.GenerateMeshOverride -= HandleRender; + #endif + + skeletonRenderer = value; + this.enabled = false; // Disable if nulled. + } + } + + MeshRenderer mainMeshRenderer; + public bool copyPropertyBlock = true; + [Tooltip("Copies MeshRenderer flags into each parts renderer")] + public bool copyMeshRendererFlags = true; + public List partsRenderers = new List(); + + #if UNITY_EDITOR + void Reset () { + if (skeletonRenderer == null) + skeletonRenderer = GetComponent(); + } + #endif + #endregion + + #region Runtime Instantiation + /// Adds a SkeletonRenderSeparator and child SkeletonPartsRenderer GameObjects to a given SkeletonRenderer. + /// The to skeleton renderer. + /// The target SkeletonRenderer or SkeletonAnimation. + /// Sorting layer to be used for the parts renderers. + /// Number of additional SkeletonPartsRenderers on top of the ones determined by counting the number of separator slots. + /// The integer to increment the sorting order per SkeletonPartsRenderer to separate them. + /// The sorting order value of the first SkeletonPartsRenderer. + /// If set to true, a minimum number of SkeletonPartsRenderer GameObjects (determined by separatorSlots.Count + 1) will be added. + public static SkeletonRenderSeparator AddToSkeletonRenderer (SkeletonRenderer skeletonRenderer, int sortingLayerID = 0, int extraPartsRenderers = 0, int sortingOrderIncrement = DefaultSortingOrderIncrement, int baseSortingOrder = 0, bool addMinimumPartsRenderers = true) { + if (skeletonRenderer == null) { + Debug.Log("Tried to add SkeletonRenderSeparator to a null SkeletonRenderer reference."); + return null; + } + + var srs = skeletonRenderer.gameObject.AddComponent(); + srs.skeletonRenderer = skeletonRenderer; + + skeletonRenderer.Initialize(false); + int count = extraPartsRenderers; + if (addMinimumPartsRenderers) + count = extraPartsRenderers + skeletonRenderer.separatorSlots.Count + 1; + + var skeletonRendererTransform = skeletonRenderer.transform; + var componentRenderers = srs.partsRenderers; + + for (int i = 0; i < count; i++) { + var spr = SkeletonPartsRenderer.NewPartsRendererGameObject(skeletonRendererTransform, i.ToString()); + var mr = spr.MeshRenderer; + mr.sortingLayerID = sortingLayerID; + mr.sortingOrder = baseSortingOrder + (i * sortingOrderIncrement); + componentRenderers.Add(spr); + } + + return srs; + } + + /// Add a child SkeletonPartsRenderer GameObject to this SkeletonRenderSeparator. + public void AddPartsRenderer (int sortingOrderIncrement = DefaultSortingOrderIncrement) { + int sortingLayerID = 0; + int sortingOrder = 0; + if (partsRenderers.Count > 0) { + var previous = partsRenderers[partsRenderers.Count - 1]; + var previousMeshRenderer = previous.MeshRenderer; + sortingLayerID = previousMeshRenderer.sortingLayerID; + sortingOrder = previousMeshRenderer.sortingOrder + sortingOrderIncrement; + } + + var spr = SkeletonPartsRenderer.NewPartsRendererGameObject(skeletonRenderer.transform, partsRenderers.Count.ToString()); + partsRenderers.Add(spr); + + var mr = spr.MeshRenderer; + mr.sortingLayerID = sortingLayerID; + mr.sortingOrder = sortingOrder; + } + #endregion + + void OnEnable () { + if (skeletonRenderer == null) return; + if (copiedBlock == null) copiedBlock = new MaterialPropertyBlock(); + mainMeshRenderer = skeletonRenderer.GetComponent(); + + #if SPINE_OPTIONAL_RENDEROVERRIDE + skeletonRenderer.GenerateMeshOverride -= HandleRender; + skeletonRenderer.GenerateMeshOverride += HandleRender; + #endif + + if (copyMeshRendererFlags) { + var lightProbeUsage = mainMeshRenderer.lightProbeUsage; + bool receiveShadows = mainMeshRenderer.receiveShadows; + var reflectionProbeUsage = mainMeshRenderer.reflectionProbeUsage; + var shadowCastingMode = mainMeshRenderer.shadowCastingMode; + var motionVectorGenerationMode = mainMeshRenderer.motionVectorGenerationMode; + var probeAnchor = mainMeshRenderer.probeAnchor; + + for (int i = 0; i < partsRenderers.Count; i++) { + var currentRenderer = partsRenderers[i]; + if (currentRenderer == null) continue; // skip null items. + + var mr = currentRenderer.MeshRenderer; + mr.lightProbeUsage = lightProbeUsage; + mr.receiveShadows = receiveShadows; + mr.reflectionProbeUsage = reflectionProbeUsage; + mr.shadowCastingMode = shadowCastingMode; + mr.motionVectorGenerationMode = motionVectorGenerationMode; + mr.probeAnchor = probeAnchor; + } + } + } + + void OnDisable () { + if (skeletonRenderer == null) return; + #if SPINE_OPTIONAL_RENDEROVERRIDE + skeletonRenderer.GenerateMeshOverride -= HandleRender; + #endif + + #if UNITY_EDITOR + skeletonRenderer.LateUpdate(); + #endif + + foreach (var s in partsRenderers) + s.ClearMesh(); + } + + MaterialPropertyBlock copiedBlock; + + void HandleRender (SkeletonRendererInstruction instruction) { + int rendererCount = partsRenderers.Count; + if (rendererCount <= 0) return; + + if (copyPropertyBlock) + mainMeshRenderer.GetPropertyBlock(copiedBlock); + + var settings = new MeshGenerator.Settings { + addNormals = skeletonRenderer.addNormals, + calculateTangents = skeletonRenderer.calculateTangents, + immutableTriangles = false, // parts cannot do immutable triangles. + pmaVertexColors = skeletonRenderer.pmaVertexColors, + //renderMeshes = skeletonRenderer.renderMeshes, + tintBlack = skeletonRenderer.tintBlack, + useClipping = true, + zSpacing = skeletonRenderer.zSpacing + }; + + var submeshInstructions = instruction.submeshInstructions; + var submeshInstructionsItems = submeshInstructions.Items; + int lastSubmeshInstruction = submeshInstructions.Count - 1; + + int rendererIndex = 0; + var currentRenderer = partsRenderers[rendererIndex]; + for (int si = 0, start = 0; si <= lastSubmeshInstruction; si++) { + if (submeshInstructionsItems[si].forceSeparate || si == lastSubmeshInstruction) { + // Apply properties + var meshGenerator = currentRenderer.MeshGenerator; + meshGenerator.settings = settings; + + if (copyPropertyBlock) + currentRenderer.SetPropertyBlock(copiedBlock); + + // Render + currentRenderer.RenderParts(instruction.submeshInstructions, start, si + 1); + + start = si + 1; + rendererIndex++; + if (rendererIndex < rendererCount) { + currentRenderer = partsRenderers[rendererIndex]; + } else { + // Not enough renderers. Skip the rest of the instructions. + break; + } + } + } + + // Clear extra renderers if they exist. + for (; rendererIndex < rendererCount; rendererIndex++) { + partsRenderers[rendererIndex].ClearMesh(); + } + + } + + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs.meta new file mode 100644 index 0000000..0c344f7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5c70a5b35f6ff2541aed8e8346b7e4d5 +timeCreated: 1457405791 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.txt b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.txt new file mode 100644 index 0000000..c42f929 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.txt @@ -0,0 +1,6 @@ +SkeletonRenderSeparator +======================= + +Dependencies: +- SkeletonPartsRenderer uses the `ArraysMeshGenerator` class in `Spine.Unity.MeshGeneration` +- It requires `SPINE_OPTIONAL_RENDEROVERRIDE` to be #defined in `SkeletonRenderer.cs`. diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.txt.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.txt.meta new file mode 100644 index 0000000..5dd3c99 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonRenderSeparator.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f0e413eeb00eabc46bde6dbd7aaaa76c +timeCreated: 1469110129 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules.meta new file mode 100644 index 0000000..4f84211 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d81fbd54cb5cab844900eaa11c48a907 +folderAsset: yes +timeCreated: 1455489575 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityEyeConstraint.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityEyeConstraint.cs new file mode 100644 index 0000000..9b2effb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityEyeConstraint.cs @@ -0,0 +1,87 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections; + +namespace Spine.Unity.Modules { + public class SkeletonUtilityEyeConstraint : SkeletonUtilityConstraint { + public Transform[] eyes; + public float radius = 0.5f; + public Transform target; + public Vector3 targetPosition; + public float speed = 10; + Vector3[] origins; + Vector3 centerPoint; + + protected override void OnEnable () { + if (!Application.isPlaying) + return; + + base.OnEnable(); + + Bounds centerBounds = new Bounds(eyes[0].localPosition, Vector3.zero); + origins = new Vector3[eyes.Length]; + for (int i = 0; i < eyes.Length; i++) { + origins[i] = eyes[i].localPosition; + centerBounds.Encapsulate(origins[i]); + } + + centerPoint = centerBounds.center; + } + + protected override void OnDisable () { + if (!Application.isPlaying) + return; + + base.OnDisable(); + } + + public override void DoUpdate () { + + if (target != null) + targetPosition = target.position; + + Vector3 goal = targetPosition; + + Vector3 center = transform.TransformPoint(centerPoint); + Vector3 dir = goal - center; + + if (dir.magnitude > 1) + dir.Normalize(); + + for (int i = 0; i < eyes.Length; i++) { + center = transform.TransformPoint(origins[i]); + eyes[i].position = Vector3.MoveTowards(eyes[i].position, center + (dir * radius), speed * Time.deltaTime); + } + + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityEyeConstraint.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityEyeConstraint.cs.meta new file mode 100644 index 0000000..18e153c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityEyeConstraint.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0d994c65b6daec64f80ae2ae04e9d999 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityGroundConstraint.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityGroundConstraint.cs new file mode 100644 index 0000000..d8ab190 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityGroundConstraint.cs @@ -0,0 +1,129 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; + +namespace Spine.Unity.Modules { + [RequireComponent(typeof(SkeletonUtilityBone)), ExecuteInEditMode] + public class SkeletonUtilityGroundConstraint : SkeletonUtilityConstraint { + + [Tooltip("LayerMask for what objects to raycast against")] + public LayerMask groundMask; + [Tooltip("Use 2D")] + public bool use2D = false; + [Tooltip("Uses SphereCast for 3D mode and CircleCast for 2D mode")] + public bool useRadius = false; + [Tooltip("The Radius")] + public float castRadius = 0.1f; + [Tooltip("How high above the target bone to begin casting from")] + public float castDistance = 5f; + [Tooltip("X-Axis adjustment")] + public float castOffset = 0; + [Tooltip("Y-Axis adjustment")] + public float groundOffset = 0; + [Tooltip("How fast the target IK position adjusts to the ground. Use smaller values to prevent snapping")] + public float adjustSpeed = 5; + + Vector3 rayOrigin; + Vector3 rayDir = new Vector3(0, -1, 0); + float hitY; + float lastHitY; + + protected override void OnEnable () { + base.OnEnable(); + lastHitY = transform.position.y; + } + + public override void DoUpdate () { + rayOrigin = transform.position + new Vector3(castOffset, castDistance, 0); + + hitY = float.MinValue; + if (use2D) { + RaycastHit2D hit; + + if (useRadius) + hit = Physics2D.CircleCast(rayOrigin, castRadius, rayDir, castDistance + groundOffset, groundMask); + else + hit = Physics2D.Raycast(rayOrigin, rayDir, castDistance + groundOffset, groundMask); + + if (hit.collider != null) { + hitY = hit.point.y + groundOffset; + if (Application.isPlaying) + hitY = Mathf.MoveTowards(lastHitY, hitY, adjustSpeed * Time.deltaTime); + } else { + if (Application.isPlaying) + hitY = Mathf.MoveTowards(lastHitY, transform.position.y, adjustSpeed * Time.deltaTime); + } + } else { + RaycastHit hit; + bool validHit = false; + + if (useRadius) + validHit = Physics.SphereCast(rayOrigin, castRadius, rayDir, out hit, castDistance + groundOffset, groundMask); + else + validHit = Physics.Raycast(rayOrigin, rayDir, out hit, castDistance + groundOffset, groundMask); + + if (validHit) { + hitY = hit.point.y + groundOffset; + if (Application.isPlaying) + hitY = Mathf.MoveTowards(lastHitY, hitY, adjustSpeed * Time.deltaTime); + + } else { + if (Application.isPlaying) + hitY = Mathf.MoveTowards(lastHitY, transform.position.y, adjustSpeed * Time.deltaTime); + } + } + + Vector3 v = transform.position; + v.y = Mathf.Clamp(v.y, Mathf.Min(lastHitY, hitY), float.MaxValue); + transform.position = v; + + utilBone.bone.X = transform.localPosition.x; + utilBone.bone.Y = transform.localPosition.y; + + lastHitY = hitY; + } + + void OnDrawGizmos () { + Vector3 hitEnd = rayOrigin + (rayDir * Mathf.Min(castDistance, rayOrigin.y - hitY)); + Vector3 clearEnd = rayOrigin + (rayDir * castDistance); + Gizmos.DrawLine(rayOrigin, hitEnd); + + if (useRadius) { + Gizmos.DrawLine(new Vector3(hitEnd.x - castRadius, hitEnd.y - groundOffset, hitEnd.z), new Vector3(hitEnd.x + castRadius, hitEnd.y - groundOffset, hitEnd.z)); + Gizmos.DrawLine(new Vector3(clearEnd.x - castRadius, clearEnd.y, clearEnd.z), new Vector3(clearEnd.x + castRadius, clearEnd.y, clearEnd.z)); + } + + Gizmos.color = Color.red; + Gizmos.DrawLine(hitEnd, clearEnd); + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityGroundConstraint.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityGroundConstraint.cs.meta new file mode 100644 index 0000000..e5474ed --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityGroundConstraint.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3662334b99de5fe4396ab24e30c4fd12 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityKinematicShadow.cs b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityKinematicShadow.cs new file mode 100644 index 0000000..37ba9bc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityKinematicShadow.cs @@ -0,0 +1,138 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections.Generic; + +namespace Spine.Unity.Modules { + + // SkeletonUtilityKinematicShadow allows hinge chains to inherit a velocity interpreted from changes in parent transform position or from unrelated rigidbodies. + // Note: Uncheck "useRootTransformIfNull + public class SkeletonUtilityKinematicShadow : MonoBehaviour { + #region Inspector + [Tooltip("If checked, the hinge chain can inherit your root transform's velocity or position/rotation changes.")] + public bool detachedShadow = false; + public Transform parent; + public bool hideShadow = true; + public PhysicsSystem physicsSystem = PhysicsSystem.Physics3D; + #endregion + + GameObject shadowRoot; + readonly List shadowTable = new List(); + struct TransformPair { + public Transform dest, src; + } + + public enum PhysicsSystem { + Physics2D, + Physics3D + }; + + void Start () { + // Duplicate this gameObject as the "shadow" with a different parent. + shadowRoot = Instantiate(this.gameObject); + Destroy(shadowRoot.GetComponent()); + + // Prepare shadow gameObject's properties. + var shadowRootTransform = shadowRoot.transform; + shadowRootTransform.position = transform.position; + shadowRootTransform.rotation = transform.rotation; + + Vector3 scaleRef = transform.TransformPoint(Vector3.right); + float scale = Vector3.Distance(transform.position, scaleRef); + shadowRootTransform.localScale = Vector3.one; + + if (!detachedShadow) { + // Do not change to null coalescing operator (??). Unity overloads null checks for UnityEngine.Objects but not the ?? operator. + if (parent == null) + shadowRootTransform.parent = transform.root; + else + shadowRootTransform.parent = parent; + } + + if (hideShadow) + shadowRoot.hideFlags = HideFlags.HideInHierarchy; + + var shadowJoints = shadowRoot.GetComponentsInChildren(); + foreach (Joint j in shadowJoints) + j.connectedAnchor *= scale; + + // Build list of bone pairs (matches shadow transforms with bone transforms) + var bones = GetComponentsInChildren(); + var shadowBones = shadowRoot.GetComponentsInChildren(); + foreach (var b in bones) { + if (b.gameObject == this.gameObject) + continue; + + System.Type checkType = (physicsSystem == PhysicsSystem.Physics2D) ? typeof(Rigidbody2D) : typeof(Rigidbody); + foreach (var sb in shadowBones) { + if (sb.GetComponent(checkType) != null && sb.boneName == b.boneName) { + shadowTable.Add(new TransformPair { + dest = b.transform, + src = sb.transform + }); + break; + } + } + + } + + // Destroy conflicting and unneeded components + DestroyComponents(shadowBones); + + DestroyComponents(GetComponentsInChildren()); + DestroyComponents(GetComponentsInChildren()); + DestroyComponents(GetComponentsInChildren()); + } + + static void DestroyComponents (Component[] components) { + for (int i = 0, n = components.Length; i < n; i++) + Destroy(components[i]); + } + + void FixedUpdate () { + if (physicsSystem == PhysicsSystem.Physics2D) { + var shadowRootRigidbody = shadowRoot.GetComponent(); + shadowRootRigidbody.MovePosition(transform.position); + shadowRootRigidbody.MoveRotation(transform.rotation.eulerAngles.z); + } else { + var shadowRootRigidbody = shadowRoot.GetComponent(); + shadowRootRigidbody.MovePosition(transform.position); + shadowRootRigidbody.MoveRotation(transform.rotation); + } + + for (int i = 0, n = shadowTable.Count; i < n; i++) { + var pair = shadowTable[i]; + pair.dest.localPosition = pair.src.localPosition; + pair.dest.localRotation = pair.src.localRotation; + } + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityKinematicShadow.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityKinematicShadow.cs.meta new file mode 100644 index 0000000..2b071f3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SkeletonUtility Modules/SkeletonUtilityKinematicShadow.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: cfeac06b8a6aa1645813700e3e4c0863 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes.meta new file mode 100644 index 0000000..c3ef039 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dfdd78a071ca1a04bb64c6cc41e14aa0 +folderAsset: yes +timeCreated: 1496447038 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor.meta new file mode 100644 index 0000000..80a6cfc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1ad4318c20ec5674a9f4d7f786afd681 +folderAsset: yes +timeCreated: 1496449217 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor/SlotBlendModesEditor.cs b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor/SlotBlendModesEditor.cs new file mode 100644 index 0000000..199ca48 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor/SlotBlendModesEditor.cs @@ -0,0 +1,47 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using UnityEditor; +using Spine.Unity.Modules; + +namespace Spine.Unity.Editor { + using Editor = UnityEditor.Editor; + + public class SlotBlendModesEditor : Editor { + + [MenuItem("CONTEXT/SkeletonRenderer/Add Slot Blend Modes Component")] + static void AddSlotBlendModesComponent (MenuCommand command) { + var skeletonRenderer = (SkeletonRenderer)command.context; + skeletonRenderer.gameObject.AddComponent(); + } + } +} + diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor/SlotBlendModesEditor.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor/SlotBlendModesEditor.cs.meta new file mode 100644 index 0000000..21d0e26 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Editor/SlotBlendModesEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cbec7dc66dca80a419477536c23b7a0d +timeCreated: 1496449255 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAMultiply.mat b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAMultiply.mat new file mode 100644 index 0000000..28c90c1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAMultiply.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: SkeletonPMAMultiply + m_Shader: {fileID: 4800000, guid: 8bdcdc7ee298e594a9c20c61d25c33b6, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _Cutoff + second: 0.1 + m_Colors: + - first: + name: + second: {r: 0, g: 2.018574, b: 1e-45, a: 0.000007110106} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAMultiply.mat.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAMultiply.mat.meta new file mode 100644 index 0000000..c8c8038 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAMultiply.mat.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 53bf0ab317d032d418cf1252d68f51df +timeCreated: 1496447909 +licenseType: Free +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAScreen.mat b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAScreen.mat new file mode 100644 index 0000000..601f987 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAScreen.mat @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: SkeletonPMAScreen + m_Shader: {fileID: 4800000, guid: 4e8caa36c07aacf4ab270da00784e4d9, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: + second: 0 + - first: + name: _Cutoff + second: 0.1 + m_Colors: + - first: + name: + second: {r: 0, g: 2.018574, b: 1e-45, a: 0.000007121922} + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAScreen.mat.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAScreen.mat.meta new file mode 100644 index 0000000..6a1a749 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SkeletonPMAScreen.mat.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 73f0f46d3177c614baf0fa48d646a9be +timeCreated: 1496447909 +licenseType: Free +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SlotBlendModes.cs b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SlotBlendModes.cs new file mode 100644 index 0000000..44177f0 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SlotBlendModes.cs @@ -0,0 +1,152 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System.Collections.Generic; +using UnityEngine; + +namespace Spine.Unity.Modules { + + [DisallowMultipleComponent] + public class SlotBlendModes : MonoBehaviour { + + #region Internal Material Dictionary + public struct MaterialTexturePair { + public Texture2D texture2D; + public Material material; + } + + static Dictionary materialTable; + internal static Dictionary MaterialTable { + get { + if (materialTable == null) materialTable = new Dictionary(); + return materialTable; + } + } + + internal static Material GetMaterialFor (Material materialSource, Texture2D texture) { + if (materialSource == null || texture == null) return null; + + var mt = SlotBlendModes.MaterialTable; + Material m; + var key = new MaterialTexturePair { material = materialSource, texture2D = texture }; + if (!mt.TryGetValue(key, out m)) { + m = new Material(materialSource); + m.name = "(Clone)" + texture.name + "-" + materialSource.name; + m.mainTexture = texture; + mt[key] = m; + } + + return m; + } + #endregion + + #region Inspector + public Material multiplyMaterialSource; + public Material screenMaterialSource; + + Texture2D texture; + #endregion + + public bool Applied { get; private set; } + + void Start () { + if (!Applied) Apply(); + } + + void OnDestroy () { + if (Applied) Remove(); + } + + public void Apply () { + GetTexture(); + if (texture == null) return; + + var skeletonRenderer = GetComponent(); + if (skeletonRenderer == null) return; + + var slotMaterials = skeletonRenderer.CustomSlotMaterials; + + foreach (var s in skeletonRenderer.Skeleton.Slots) { + switch (s.data.blendMode) { + case BlendMode.Multiply: + if (multiplyMaterialSource != null) slotMaterials[s] = GetMaterialFor(multiplyMaterialSource, texture); + break; + case BlendMode.Screen: + if (screenMaterialSource != null) slotMaterials[s] = GetMaterialFor(screenMaterialSource, texture); + break; + } + } + + Applied = true; + skeletonRenderer.LateUpdate(); + } + + public void Remove () { + GetTexture(); + if (texture == null) return; + + var skeletonRenderer = GetComponent(); + if (skeletonRenderer == null) return; + + var slotMaterials = skeletonRenderer.CustomSlotMaterials; + + foreach (var s in skeletonRenderer.Skeleton.Slots) { + Material m = null; + + switch (s.data.blendMode) { + case BlendMode.Multiply: + if (slotMaterials.TryGetValue(s, out m) && Material.ReferenceEquals(m, GetMaterialFor(multiplyMaterialSource, texture))) + slotMaterials.Remove(s); + break; + case BlendMode.Screen: + if (slotMaterials.TryGetValue(s, out m) && Material.ReferenceEquals(m, GetMaterialFor(screenMaterialSource, texture))) + slotMaterials.Remove(s); + break; + } + } + + Applied = false; + if (skeletonRenderer.valid) skeletonRenderer.LateUpdate(); + } + + public void GetTexture () { + if (texture == null) { + var sr = GetComponent(); if (sr == null) return; + var sda = sr.skeletonDataAsset; if (sda == null) return; + var aa = sda.atlasAssets[0]; if (aa == null) return; + var am = aa.materials[0]; if (am == null) return; + texture = am.mainTexture as Texture2D; + } + } + + + } +} + diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SlotBlendModes.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SlotBlendModes.cs.meta new file mode 100644 index 0000000..6750f11 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/SlotBlendModes.cs.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: f1f8243645ba2e74aa3564bd956eed89 +timeCreated: 1496794038 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: + - multiplyMaterialSource: {fileID: 2100000, guid: 53bf0ab317d032d418cf1252d68f51df, + type: 2} + - screenMaterialSource: {fileID: 2100000, guid: 73f0f46d3177c614baf0fa48d646a9be, + type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Multiply.shader b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Multiply.shader new file mode 100644 index 0000000..26126be --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Multiply.shader @@ -0,0 +1,101 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// Spine/Skeleton PMA Multiply +// - single color multiply tint +// - unlit +// - Premultiplied alpha Multiply blending +// - No depth, no backface culling, no fog. +// - ShadowCaster pass + +Shader "Spine/Skeleton PMA Multiply" { + Properties { + _Color ("Tint Color", Color) = (1,1,1,1) + [NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {} + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + LOD 100 + + Fog { Mode Off } + Cull Off + ZWrite Off + Blend DstColor OneMinusSrcAlpha + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + uniform sampler2D _MainTex; + uniform float4 _Color; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 texColor = tex2D(_MainTex, i.uv); + return (texColor * i.vertexColor); + } + ENDCG + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + + ZWrite On + ZTest LEqual + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + struct v2f { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + uniform float4 _MainTex_ST; + + v2f vert (appdata_base v) { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + uniform sampler2D _MainTex; + uniform fixed _Cutoff; + + float4 frag (v2f i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Multiply.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Multiply.shader.meta new file mode 100644 index 0000000..f311988 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Multiply.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8bdcdc7ee298e594a9c20c61d25c33b6 +timeCreated: 1496446742 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Screen.shader b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Screen.shader new file mode 100644 index 0000000..d973970 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Screen.shader @@ -0,0 +1,99 @@ +// Spine/Skeleton PMA Multiply +// - single color multiply tint +// - unlit +// - Premultiplied alpha Multiply blending +// - No depth, no backface culling, no fog. +// - ShadowCaster pass + +Shader "Spine/Skeleton PMA Screen" { + Properties { + _Color ("Tint Color", Color) = (1,1,1,1) + [NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {} + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + LOD 100 + + Fog { Mode Off } + Cull Off + ZWrite Off + Blend One OneMinusSrcColor + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + uniform sampler2D _MainTex; + uniform float4 _Color; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 texColor = tex2D(_MainTex, i.uv); + return (texColor * i.vertexColor); + } + ENDCG + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + + ZWrite On + ZTest LEqual + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + struct v2f { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + uniform float4 _MainTex_ST; + + v2f vert (appdata_base v) { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + uniform sampler2D _MainTex; + uniform fixed _Cutoff; + + float4 frag (v2f i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Screen.shader.meta b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Screen.shader.meta new file mode 100644 index 0000000..173ff6a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/SlotBlendModes/Spine-Skeleton-PMA-Screen.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4e8caa36c07aacf4ab270da00784e4d9 +timeCreated: 1496448787 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/TK2D.meta b/Assets/Spine/Assets/spine-unity/Modules/TK2D.meta new file mode 100644 index 0000000..bd32abb --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/TK2D.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e70d3026a0242e5418232b2015be29f7 +folderAsset: yes +timeCreated: 1456509301 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/TK2D/SpriteCollectionAttachmentLoader.cs b/Assets/Spine/Assets/spine-unity/Modules/TK2D/SpriteCollectionAttachmentLoader.cs new file mode 100644 index 0000000..842c438 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/TK2D/SpriteCollectionAttachmentLoader.cs @@ -0,0 +1,157 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if SPINE_TK2D +using System; +using UnityEngine; +using Spine; + +// MITCH: handle TPackerCW flip mode (probably not swap uv horizontaly) +namespace Spine.Unity.TK2D { + public class SpriteCollectionAttachmentLoader : AttachmentLoader { + private tk2dSpriteCollectionData sprites; + private float u, v, u2, v2; + private bool regionRotated; + private float regionOriginalWidth, regionOriginalHeight; + private float regionWidth, regionHeight; + private float regionOffsetX, regionOffsetY; + private Material material; + + public SpriteCollectionAttachmentLoader (tk2dSpriteCollectionData sprites) { + if (sprites == null) + throw new ArgumentNullException("sprites cannot be null."); + this.sprites = sprites; + } + + private void ProcessSpriteDefinition (String name) { + // Strip folder names. + int index = name.LastIndexOfAny(new char[] {'/', '\\'}); + if (index != -1) + name = name.Substring(index + 1); + + tk2dSpriteDefinition def = sprites.inst.GetSpriteDefinition(name); + + if (def == null) { + Debug.Log("Sprite not found in atlas: " + name, sprites); + throw new Exception("Sprite not found in atlas: " + name); + } + if (def.complexGeometry) + throw new NotImplementedException("Complex geometry is not supported: " + name); + if (def.flipped == tk2dSpriteDefinition.FlipMode.TPackerCW) + throw new NotImplementedException("Only 2D Toolkit atlases are supported: " + name); + + Vector2 minTexCoords = Vector2.one, maxTexCoords = Vector2.zero; + for (int i = 0; i < def.uvs.Length; ++i) { + Vector2 uv = def.uvs[i]; + minTexCoords = Vector2.Min(minTexCoords, uv); + maxTexCoords = Vector2.Max(maxTexCoords, uv); + } + regionRotated = def.flipped == tk2dSpriteDefinition.FlipMode.Tk2d; + if (regionRotated) { + float temp = minTexCoords.x; + minTexCoords.x = maxTexCoords.x; + maxTexCoords.x = temp; + } + u = minTexCoords.x; + v = maxTexCoords.y; + u2 = maxTexCoords.x; + v2 = minTexCoords.y; + + regionOriginalWidth = (int)(def.untrimmedBoundsData[1].x / def.texelSize.x); + regionOriginalHeight = (int)(def.untrimmedBoundsData[1].y / def.texelSize.y); + + regionWidth = (int)(def.boundsData[1].x / def.texelSize.x); + regionHeight = (int)(def.boundsData[1].y / def.texelSize.y); + + float x0 = def.untrimmedBoundsData[0].x - def.untrimmedBoundsData[1].x / 2; + float x1 = def.boundsData[0].x - def.boundsData[1].x / 2; + regionOffsetX = (int)((x1 - x0) / def.texelSize.x); + + float y0 = def.untrimmedBoundsData[0].y - def.untrimmedBoundsData[1].y / 2; + float y1 = def.boundsData[0].y - def.boundsData[1].y / 2; + regionOffsetY = (int)((y1 - y0) / def.texelSize.y); + + material = def.materialInst; + } + + public RegionAttachment NewRegionAttachment (Skin skin, String name, String path) { + ProcessSpriteDefinition(path); + + RegionAttachment region = new RegionAttachment(name); + region.Path = path; + region.RendererObject = material; + region.SetUVs(u, v, u2, v2, regionRotated); + region.RegionOriginalWidth = regionOriginalWidth; + region.RegionOriginalHeight = regionOriginalHeight; + region.RegionWidth = regionWidth; + region.RegionHeight = regionHeight; + region.RegionOffsetX = regionOffsetX; + region.RegionOffsetY = regionOffsetY; + return region; + } + + public MeshAttachment NewMeshAttachment (Skin skin, String name, String path) { + ProcessSpriteDefinition(path); + + MeshAttachment mesh = new MeshAttachment(name); + mesh.Path = path; + mesh.RendererObject = material; + mesh.RegionU = u; + mesh.RegionV = v; + mesh.RegionU2 = u2; + mesh.RegionV2 = v2; + mesh.RegionRotate = regionRotated; + mesh.RegionOriginalWidth = regionOriginalWidth; + mesh.RegionOriginalHeight = regionOriginalHeight; + mesh.RegionWidth = regionWidth; + mesh.RegionHeight = regionHeight; + mesh.RegionOffsetX = regionOffsetX; + mesh.RegionOffsetY = regionOffsetY; + return mesh; + } + + public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, String name) { + return new BoundingBoxAttachment(name); + } + + public PathAttachment NewPathAttachment (Skin skin, string name) { + return new PathAttachment(name); + } + + public PointAttachment NewPointAttachment (Skin skin, string name) { + return new PointAttachment(name); + } + + public ClippingAttachment NewClippingAttachment (Skin skin, string name) { + return new ClippingAttachment(name); + } + } +} +#endif diff --git a/Assets/Spine/Assets/spine-unity/Modules/TK2D/SpriteCollectionAttachmentLoader.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/TK2D/SpriteCollectionAttachmentLoader.cs.meta new file mode 100644 index 0000000..671d5c7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/TK2D/SpriteCollectionAttachmentLoader.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03238e4a73953c045a6cb289162532f3 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline.meta new file mode 100644 index 0000000..9dd425c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9192f99585e00e2468a2e2592cfce807 +folderAsset: yes +timeCreated: 1505434717 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation.meta new file mode 100644 index 0000000..d6cf5f6 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a363511f60be37a4199a1a4ad0188b40 +folderAsset: yes +timeCreated: 1511505394 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/README.md b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/README.md new file mode 100644 index 0000000..94d4c61 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/README.md @@ -0,0 +1,80 @@ +This Documentation is for the Spine Timeline features. +If this documentation contains mistakes or doesn't cover some questions, please feel to comment below, open an issue or post in the official [Spine-Unity forums](http://esotericsoftware.com/forum/viewforum.php?f=3). + +# Spine-Unity Timeline Playables + +![](add-menu.png) + +## Spine Animation Track +Controls the skeleton pose a given Spine component with animations. + +**Status:** +- Currently only SkeletonAnimation (via SkeletonAnimationPlayableHandle) +- Mixing has some significant bugs. It should work fine if you don't include mixing, or if all your animations have perfectly matching dopesheet properties. + +**To use:** +1. Add `SkeletonAnimationPlayableHandle` component to your SkeletonAnimation GameObject. +2. With an existing Unity Playable Direction, and in the Unity Timeline window, right-click on an empty space on the left and choose **Spine.Unity.Playables** > **Spine Animation Track**. +3. Drag the SkeletonAnimation GameObject onto the empty reference property of the new Spine Skeleton Flip Track. +4. Right-click on the row in an empty space in the Timeline dopesheet and choose **Add Spine Animation Clip Clip**. +5. Adjust the start and end times of the new clip, name it appropriately at the top of the Inspector. +6. Click on the clip inspector's SkeletonDataAsset field and choose your target skeleton's SkeletonDataAsset. This will enable the animation name dropdown to appear. +7. Choose the appropriate animation name, loop, and mix settings. +8. For easier readability, rename your clip to the animation name or something descriptive. + +**Track Behavior** +- Currently buggy +- + + +## Spine Skeleton Flip Track +![](skeleton-flip-clip-inspector.png) +Controls skeleton flip a given Spine component. + +**Status:** +- Currently only SkeletonAnimation (via SkeletonAnimationPlayableHandle) + +**To use:** +1. Add `SkeletonAnimationPlayableHandle` component to your SkeletonAnimation GameObject. +2. With an existing Unity Playable Director, and in the Unity Timeline window, right-click on an empty space on the left and choose **Spine.Unity.Playables** > **Spine Skeleton Flip Track**. +3. Drag the SkeletonAnimation GameObject onto the empty reference property of the new Spine Skeleton Flip Track. +4. Right-click on the row in an empty space in the Timeline dopesheet and choose **Add Spine Skeleton Flip Clip Clip**. +5. Adjust the start and end times of the new clip, name it appropriately at the top of the Inspector, and choose the desired FlipX and FlipY values. + +**Track Behavior** +- The specified skeleton flip values will be applied for every frame within the duration of each track. +- At the end of the timeline, the track will revert the skeleton flip to the flip values it captures when it starts playing that timeline. + +## Spine AnimationState Track +![](animationstate-clip-inspector.png) +Sets Animations on the target SkeletonAnimation's AnimationState (via SetAnimation). + +**Status:** +- Currently only SkeletonAnimation (directly) + +**To use:** +1. With an existing Unity Playable Director, and in the Unity Timeline window, right-click on an empty space on the left and choose **Spine.Unity.Playables** > **Spine Animation State Track**. +2. Drag the SkeletonAnimation GameObject onto the empty reference property of the new Spine AnimationState Track. +3. Right-click on the row in an empty space in the Timeline dopesheet and choose **Add Spine Animation State Clip Clip**. +4. Adjust the start and end times of the new clip, name it appropriately at the top of the Inspector. +5. Click on the clip inspector's SkeletonDataAsset field and choose your target skeleton's SkeletonDataAsset. This will enable the animation name dropdown to appear. +6. Choose the appropriate animation name, loop, and mix settings. +- For easier readability, rename your clip to the animation name or something descriptive. +- To avoid having to do steps 4-6 repeatedly, use the Duplicate function (`CTRL`/`CMD` + `D`) + +**Track Behavior** +- `AnimationState.SetAnimation` will be called at the beginning of every clip based on the animationName. +- Clip durations don't matter. Animations won't be cleared where there is no active clip at certain slices of time. +- **EMPTY ANIMATION**: If a clip has no name specified, it will call SetEmptyAnimation instead. +- **ERROR HANDLING**: If the animation with the provided animationName is not found, it will do nothing (the previous animation will continue playing normally). +- Animations playing before the timeline starts playing will not be interrupted until the first clip starts playing. +- At the end of the last clip and at the end of the timeline, nothing happens. This means the effect of the last clip's SetAnimation call will persist until you give other commands to that AnimationState. +- If "custom duration" is unchecked, it will do a normal lookup of the AnimationState data's specified transition-pair mix setting, or the default mix. +- Edit mode preview mixing may look different from Play Mode mixing. Please check in actual Play Mode to see the real results. + +## Known Issues +Spine Timeline support is currently experimental and has some known issues and inconveniences. +- The Console logs an incorrect/harmless error `DrivenPropertyManager has failed to register property "m_Script" of object "Spine GameObject (spineboy-pro)" with driver "" because the property doesn't exist.`. This is a known issue on Unity's end. See more here: https://forum.unity.com/threads/default-playables-text-switcher-track-error.502903/ +- These Spine Tracks (like other custom Unity Timeline Playable types) do not have labels on them. Unity currently doesn't have API to specify their labels yet. +- Each track clip currently requires you to specify a reference to SkeletonData so its inspector can show you a convenient list of animation names. This is because track clips are agnostic of its track and target component/track binding, and provides no way of automatically finding it while in the editor. The clips will still function correctly without the SkeletonDataAsset references; you just won't get the dropdown of animation names in the editor. +- Each track clip cannot be automatically named based on the chosen animationName. The Timeline object editors currently doesn't provide access to the clip names to do this automatically. \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/README.md.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/README.md.meta new file mode 100644 index 0000000..d0bfc37 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/README.md.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 970f0962a0a79bf42bdedfc9ed439f56 +timeCreated: 1511505255 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/add-menu.png b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/add-menu.png new file mode 100644 index 0000000..b8e383f Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/add-menu.png differ diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/add-menu.png.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/add-menu.png.meta new file mode 100644 index 0000000..b5247a7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/add-menu.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: ab296920a52d8204ea35ed4385481be3 +timeCreated: 1511505440 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/animationstate-clip-inspector.png b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/animationstate-clip-inspector.png new file mode 100644 index 0000000..f5b5702 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/animationstate-clip-inspector.png differ diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/animationstate-clip-inspector.png.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/animationstate-clip-inspector.png.meta new file mode 100644 index 0000000..d43a3b7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/animationstate-clip-inspector.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: ca162358b7b05034cae4e25bfb8b98f8 +timeCreated: 1511508127 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/skeleton-flip-clip-inspector.png b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/skeleton-flip-clip-inspector.png new file mode 100644 index 0000000..d13e746 Binary files /dev/null and b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/skeleton-flip-clip-inspector.png differ diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/skeleton-flip-clip-inspector.png.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/skeleton-flip-clip-inspector.png.meta new file mode 100644 index 0000000..599bc95 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/Documentation/skeleton-flip-clip-inspector.png.meta @@ -0,0 +1,112 @@ +fileFormatVersion: 2 +guid: 80e301d4353d83640bb50224021a8379 +timeCreated: 1511506555 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component.meta new file mode 100644 index 0000000..083282b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ff79ab0c89530f24d8f60162bd4c1009 +folderAsset: yes +timeCreated: 1507311562 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SkeletonAnimationPlayableHandle.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SkeletonAnimationPlayableHandle.cs new file mode 100644 index 0000000..e1c1fd5 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SkeletonAnimationPlayableHandle.cs @@ -0,0 +1,114 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +//using UnityEngine.Playables; + +using Spine; +using Spine.Unity; +using Spine.Unity.Playables; + +namespace Spine.Unity.Playables { + + [AddComponentMenu("Spine/Playables/SkeletonAnimation Playable Handle (Playables)")] + public class SkeletonAnimationPlayableHandle : SpinePlayableHandleBase { + #region Inspector + public SkeletonAnimation skeletonAnimation; + //public float fadeOutDuration = 0.5f; + + #if UNITY_EDITOR + void OnValidate () { + if (this.skeletonAnimation == null) + skeletonAnimation = GetComponent(); + } + #endif + + #endregion + + //readonly HashSet frameAppliedProperties = new HashSet(); + + public override Skeleton Skeleton { get { return skeletonAnimation.Skeleton; } } + public override SkeletonData SkeletonData { get { return skeletonAnimation.Skeleton.data; } } + + #if UNITY_2017 || UNITY_2018 + void Awake () { + if (skeletonAnimation == null) + skeletonAnimation = GetComponent(); + + //frameAppliedProperties.Clear(); + } + + //Skeleton skeleton; + //int frameTrackCount = 0; + //int frameCurrentInputs = 0; + //bool firstCleared = false; + //int lastApplyFrame = 0; + //public override void ProcessFrame (Playable playable, FrameData info, SpineAnimationMixerBehaviour mixer) { + // if (skeletonAnimation == null) return; + // if (skeleton == null) skeleton = skeletonAnimation.Skeleton; + + // // New frame. + // if (lastApplyFrame != Time.frameCount) { + // if (frameTrackCount > 0) + // frameAppliedProperties.Clear(); + + // frameCurrentInputs = 0; + // frameTrackCount = 0; + // } + // lastApplyFrame = Time.frameCount; + + // int currentInputs = mixer.ApplyPlayableFrame(playable, skeleton, frameAppliedProperties, frameTrackCount); + // frameCurrentInputs += currentInputs; + + // // EXPERIMENTAL: Handle overriding SkeletonAnimation.AnimationState. + // if (frameCurrentInputs > 0) { + // var state = skeletonAnimation.AnimationState; + + // if (!firstCleared) { + // firstCleared = true; + // for (int i = 0; i < 4; i++) { + // if (state.GetCurrent(i) != null) state.SetEmptyAnimation(i, fadeOutDuration); + // } + // } + + // // Update again whenever an animation is playing in the AnimationState. Quite wasteful. + // //if (state.GetCurrent(0) != null) { + // skeleton.UpdateWorldTransform(); + // //} + // } + + // frameTrackCount++; + //} +#endif + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SkeletonAnimationPlayableHandle.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SkeletonAnimationPlayableHandle.cs.meta new file mode 100644 index 0000000..8075d1e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SkeletonAnimationPlayableHandle.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bd5f4cbc0a51cc24b86e5f70151bc0c3 +timeCreated: 1507311603 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SpinePlayableHandleBase.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SpinePlayableHandleBase.cs new file mode 100644 index 0000000..bea55c3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SpinePlayableHandleBase.cs @@ -0,0 +1,64 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +//using UnityEngine.Playables; + +namespace Spine.Unity.Playables { + + public delegate void SpineEventDelegate (Spine.Event e); + + /// Base class for Spine Playable Handle components, commonly for integrating with UnityEngine Timeline. + public abstract class SpinePlayableHandleBase : MonoBehaviour { + + /// Gets the SkeletonData of the targeted Spine component. + public abstract SkeletonData SkeletonData { get; } + + public abstract Skeleton Skeleton { get; } + + /// MixerBehaviour ProcessFrame method handler. + /// Returns true if a playable was applied previously + //public abstract void ProcessFrame (Playable playable, FrameData info, SpineAnimationMixerBehaviour mixer); + + /// Subscribe to this to handle user events played by the Unity playable + public event SpineEventDelegate AnimationEvents; + + public virtual void HandleEvents (ExposedList eventBuffer) { + if (eventBuffer == null || AnimationEvents == null) return; + for (int i = 0, n = eventBuffer.Count; i < n; i++) + AnimationEvents.Invoke(eventBuffer.Items[i]); + } + + } +} + diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SpinePlayableHandleBase.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SpinePlayableHandleBase.cs.meta new file mode 100644 index 0000000..cb575e7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/PlayableHandle Component/SpinePlayableHandleBase.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2dfbb56974b17984ca2534bc8185f665 +timeCreated: 1507311422 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState.meta new file mode 100644 index 0000000..a5b1d9d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 47adfa0aa094be548be25e178c1435d2 +folderAsset: yes +timeCreated: 1510816616 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor.meta new file mode 100644 index 0000000..198f690 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 54bc1978049774f4aa13bfd014a5773a +folderAsset: yes +timeCreated: 1510816616 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor/SpineAnimationStateDrawer.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor/SpineAnimationStateDrawer.cs new file mode 100644 index 0000000..3ea81ae --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor/SpineAnimationStateDrawer.cs @@ -0,0 +1,49 @@ +using UnityEditor; +using UnityEngine; +using Spine; +using Spine.Unity; +using Spine.Unity.Playables; + +//[CustomPropertyDrawer(typeof(SpineAnimationStateBehaviour))] +public class SpineAnimationStateDrawer : PropertyDrawer { + /* + public override float GetPropertyHeight (SerializedProperty property, GUIContent label) { + const int fieldCount = 8; + return fieldCount * EditorGUIUtility.singleLineHeight; + } + + public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) { + SerializedProperty skeletonDataAssetProp = property.FindPropertyRelative("skeletonDataAsset"); + SerializedProperty animationNameProp = property.FindPropertyRelative("animationName"); + SerializedProperty loopProp = property.FindPropertyRelative("loop"); + SerializedProperty eventProp = property.FindPropertyRelative("eventThreshold"); + SerializedProperty attachmentProp = property.FindPropertyRelative("attachmentThreshold"); + SerializedProperty drawOrderProp = property.FindPropertyRelative("drawOrderThreshold"); + + Rect singleFieldRect = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight); + EditorGUI.PropertyField(singleFieldRect, skeletonDataAssetProp); + + float lineHeightWithSpacing = EditorGUIUtility.singleLineHeight + 2f; + + singleFieldRect.y += lineHeightWithSpacing; + EditorGUI.PropertyField(singleFieldRect, animationNameProp); + + singleFieldRect.y += lineHeightWithSpacing; + EditorGUI.PropertyField(singleFieldRect, loopProp); + + singleFieldRect.y += lineHeightWithSpacing * 0.5f; + + singleFieldRect.y += lineHeightWithSpacing; + EditorGUI.LabelField(singleFieldRect, "Mixing Settings", EditorStyles.boldLabel); + + singleFieldRect.y += lineHeightWithSpacing; + EditorGUI.PropertyField(singleFieldRect, eventProp); + + singleFieldRect.y += lineHeightWithSpacing; + EditorGUI.PropertyField(singleFieldRect, attachmentProp); + + singleFieldRect.y += lineHeightWithSpacing; + EditorGUI.PropertyField(singleFieldRect, drawOrderProp); + } + */ +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor/SpineAnimationStateDrawer.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor/SpineAnimationStateDrawer.cs.meta new file mode 100644 index 0000000..fddb862 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/Editor/SpineAnimationStateDrawer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: cba97e3d11d6d4d428fcfe1a7be16db0 +timeCreated: 1510816616 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateBehaviour.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateBehaviour.cs new file mode 100644 index 0000000..86c0ee1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateBehaviour.cs @@ -0,0 +1,64 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if UNITY_2017 || UNITY_2018 +using System; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; +using Spine; +using Spine.Unity; +using System.Collections.Generic; + +namespace Spine.Unity.Playables { + + using Animation = Spine.Animation; + + [Serializable] + public class SpineAnimationStateBehaviour : PlayableBehaviour { + public AnimationReferenceAsset animationReference; + public bool loop; + + [Header("Mix Properties")] + public bool customDuration = false; + public float mixDuration = 0.1f; + + [Range(0, 1f)] + public float attachmentThreshold = 0.5f; + + [Range(0, 1f)] + public float eventThreshold = 0.5f; + + [Range(0, 1f)] + public float drawOrderThreshold = 0.5f; + } + +} +#endif \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateBehaviour.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateBehaviour.cs.meta new file mode 100644 index 0000000..d468103 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateBehaviour.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 82bd6e7ec1121b5428c447b7bd16b042 +timeCreated: 1510816616 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateClip.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateClip.cs new file mode 100644 index 0000000..0feea80 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateClip.cs @@ -0,0 +1,52 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if UNITY_2017 || UNITY_2018 +using System; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; + +namespace Spine.Unity.Playables { + [Serializable] + public class SpineAnimationStateClip : PlayableAsset, ITimelineClipAsset { + public SpineAnimationStateBehaviour template = new SpineAnimationStateBehaviour(); + + public ClipCaps clipCaps { get { return ClipCaps.None; } } + + public override Playable CreatePlayable (PlayableGraph graph, GameObject owner) { + var playable = ScriptPlayable.Create(graph, template); + playable.GetBehaviour(); //SpineAnimationStateBehaviour clone = playable.GetBehaviour(); + return playable; + } + } + +} +#endif \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateClip.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateClip.cs.meta new file mode 100644 index 0000000..d9a7bf4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateClip.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 585e20c924ba86a44926c850aa8e1d84 +timeCreated: 1510816616 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs new file mode 100644 index 0000000..05371ac --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs @@ -0,0 +1,171 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + + #define SPINE_EDITMODEPOSE + +#if UNITY_2017 || UNITY_2018 +using System; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; + +namespace Spine.Unity.Playables { + public class SpineAnimationStateMixerBehaviour : PlayableBehaviour { + + float[] lastInputWeights; + + // NOTE: This function is called at runtime and edit time. Keep that in mind when setting the values of properties. + public override void ProcessFrame (Playable playable, FrameData info, object playerData) { + var spineComponent = playerData as SkeletonAnimation; + if (spineComponent == null) return; + + var skeleton = spineComponent.Skeleton; + var state = spineComponent.AnimationState; + + if (!Application.isPlaying) { + #if SPINE_EDITMODEPOSE + PreviewEditModePose(playable, spineComponent); + #endif + return; + } + + int inputCount = playable.GetInputCount(); + + // Ensure correct buffer size. + if (this.lastInputWeights == null || this.lastInputWeights.Length < inputCount) { + this.lastInputWeights = new float[inputCount]; + + for (int i = 0; i < inputCount; i++) + this.lastInputWeights[i] = default(float); + } + var lastInputWeights = this.lastInputWeights; + + // Check all clips. If a clip that was weight 0 turned into weight 1, call SetAnimation. + for (int i = 0; i < inputCount; i++) { + float lastInputWeight = lastInputWeights[i]; + float inputWeight = playable.GetInputWeight(i); + bool trackStarted = inputWeight > lastInputWeight; + lastInputWeights[i] = inputWeight; + + if (trackStarted) { + ScriptPlayable inputPlayable = (ScriptPlayable)playable.GetInput(i); + SpineAnimationStateBehaviour clipData = inputPlayable.GetBehaviour(); + + if (clipData.animationReference == null) { + float mixDuration = clipData.customDuration ? clipData.mixDuration : state.Data.DefaultMix; + state.SetEmptyAnimation(0, mixDuration); + } else { + if (clipData.animationReference.Animation != null) { + Spine.TrackEntry trackEntry = state.SetAnimation(0, clipData.animationReference.Animation, clipData.loop); + + //trackEntry.TrackTime = (float)inputPlayable.GetTime(); // More accurate time-start? + trackEntry.EventThreshold = clipData.eventThreshold; + trackEntry.DrawOrderThreshold = clipData.drawOrderThreshold; + trackEntry.AttachmentThreshold = clipData.attachmentThreshold; + + if (clipData.customDuration) + trackEntry.MixDuration = clipData.mixDuration; + } + //else Debug.LogWarningFormat("Animation named '{0}' not found", clipData.animationName); + } + + // Ensure that the first frame ends with an updated mesh. + spineComponent.Update(0); + spineComponent.LateUpdate(); + } + } + } + + #if SPINE_EDITMODEPOSE + public void PreviewEditModePose (Playable playable, SkeletonAnimation spineComponent) { + if (Application.isPlaying) return; + if (spineComponent == null) return; + + int inputCount = playable.GetInputCount(); + int lastOneWeight = -1; + + for (int i = 0; i < inputCount; i++) { + float inputWeight = playable.GetInputWeight(i); + if (inputWeight >= 1) lastOneWeight = i; + } + + if (lastOneWeight != -1) { + ScriptPlayable inputPlayableClip = (ScriptPlayable)playable.GetInput(lastOneWeight); + SpineAnimationStateBehaviour clipData = inputPlayableClip.GetBehaviour(); + + var skeleton = spineComponent.Skeleton; + + bool skeletonDataMismatch = clipData.animationReference != null && spineComponent.SkeletonDataAsset.GetSkeletonData(true) != clipData.animationReference.SkeletonDataAsset.GetSkeletonData(true); + if (skeletonDataMismatch) { + Debug.LogWarningFormat("SpineAnimationStateMixerBehaviour tried to apply an animation for the wrong skeleton. Expected {0}. Was {1}", spineComponent.SkeletonDataAsset, clipData.animationReference.SkeletonDataAsset); + } + + // Getting the from-animation here because it's required to get the mix information from AnimationStateData. + Animation fromAnimation = null; + float fromClipTime = 0; + bool fromClipLoop = false; + if (lastOneWeight != 0 && inputCount > 1) { + var fromClip = (ScriptPlayable)playable.GetInput(lastOneWeight - 1); + var fromClipData = fromClip.GetBehaviour(); + fromAnimation = fromClipData.animationReference.Animation; + fromClipTime = (float)fromClip.GetTime(); + fromClipLoop = fromClipData.loop; + } + + Animation toAnimation = clipData.animationReference.Animation; + float toClipTime = (float)inputPlayableClip.GetTime(); + float mixDuration = clipData.mixDuration; + + if (!clipData.customDuration && fromAnimation != null) { + mixDuration = spineComponent.AnimationState.Data.GetMix(fromAnimation, toAnimation); + } + + // Approximate what AnimationState might do at runtime. + if (fromAnimation != null && mixDuration > 0 && toClipTime < mixDuration) { + skeleton.SetToSetupPose(); + float fauxFromAlpha = (1f - toClipTime/mixDuration); + fauxFromAlpha = fauxFromAlpha > 0.5f ? 1f : fauxFromAlpha * 2f; // fake value, but reduce dip. + fromAnimation.Apply(skeleton, 0, fromClipTime, fromClipLoop, null, fauxFromAlpha, MixPose.Setup, MixDirection.Out); //fromAnimation.PoseSkeleton(skeleton, fromClipTime, fromClipLoop); + toAnimation.Apply(skeleton, 0, toClipTime, clipData.loop, null, toClipTime/mixDuration, MixPose.Current, MixDirection.In); + } else { + skeleton.SetToSetupPose(); + toAnimation.PoseSkeleton(skeleton, toClipTime, clipData.loop); + } + + } + // Do nothing outside of the first clip and the last clip. + + } + #endif + + } + +} +#endif diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs.meta new file mode 100644 index 0000000..ad4f2ea --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: f61d2f4ac1c4ad044bf4ae6e63b0eca8 +timeCreated: 1510816616 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateTrack.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateTrack.cs new file mode 100644 index 0000000..3bce9be --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateTrack.cs @@ -0,0 +1,46 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if UNITY_2017 || UNITY_2018 +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; + +namespace Spine.Unity.Playables { + [TrackColor(0.9960785f, 0.2509804f, 0.003921569f)] + [TrackClipType(typeof(SpineAnimationStateClip))] + [TrackBindingType(typeof(SkeletonAnimation))] + public class SpineAnimationStateTrack : TrackAsset { + public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) { + return ScriptPlayable.Create (graph, inputCount); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateTrack.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateTrack.cs.meta new file mode 100644 index 0000000..379c2a2 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateTrack.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: dfabb056a779ae34b9ebd7de425c868b +timeCreated: 1510816616 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip.meta new file mode 100644 index 0000000..39ab9b4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3099d730dd2a9e349b3d918960cb42fa +folderAsset: yes +timeCreated: 1500876410 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor.meta new file mode 100644 index 0000000..b27c726 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fc5fac7eface2ba4fbb6146017e41192 +folderAsset: yes +timeCreated: 1500876410 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor/SpineSkeletonFlipDrawer.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor/SpineSkeletonFlipDrawer.cs new file mode 100644 index 0000000..7af9f30 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor/SpineSkeletonFlipDrawer.cs @@ -0,0 +1,27 @@ +#if UNITY_2017 || UNITY_2018 +using UnityEditor; +using UnityEngine; +using UnityEngine.Playables; + +[CustomPropertyDrawer(typeof(SpineSkeletonFlipBehaviour))] +public class SpineSkeletonFlipDrawer : PropertyDrawer +{ + public override float GetPropertyHeight (SerializedProperty property, GUIContent label) + { + int fieldCount = 1; + return fieldCount * EditorGUIUtility.singleLineHeight; + } + + public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) + { + SerializedProperty flipXProp = property.FindPropertyRelative("flipX"); + SerializedProperty flipYProp = property.FindPropertyRelative("flipY"); + + Rect singleFieldRect = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight); + EditorGUI.PropertyField(singleFieldRect, flipXProp); + + singleFieldRect.y += EditorGUIUtility.singleLineHeight; + EditorGUI.PropertyField(singleFieldRect, flipYProp); + } +} +#endif \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor/SpineSkeletonFlipDrawer.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor/SpineSkeletonFlipDrawer.cs.meta new file mode 100644 index 0000000..d7949d2 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/Editor/SpineSkeletonFlipDrawer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b8a0a5d3de45a5e48ae96aa414860d3c +timeCreated: 1500876411 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipBehaviour.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipBehaviour.cs new file mode 100644 index 0000000..b4dcb89 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipBehaviour.cs @@ -0,0 +1,11 @@ +#if UNITY_2017 || UNITY_2018 +using System; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; + +[Serializable] +public class SpineSkeletonFlipBehaviour : PlayableBehaviour { + public bool flipX, flipY; +} +#endif \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipBehaviour.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipBehaviour.cs.meta new file mode 100644 index 0000000..efa92e5 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipBehaviour.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3740378c8a8da8042991fbbe4b4a2094 +timeCreated: 1500876411 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipClip.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipClip.cs new file mode 100644 index 0000000..43ec42c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipClip.cs @@ -0,0 +1,50 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if UNITY_2017 || UNITY_2018 +using System; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; + +[Serializable] +public class SpineSkeletonFlipClip : PlayableAsset, ITimelineClipAsset { + public SpineSkeletonFlipBehaviour template = new SpineSkeletonFlipBehaviour(); + + public ClipCaps clipCaps { + get { return ClipCaps.None; } + } + + public override Playable CreatePlayable (PlayableGraph graph, GameObject owner) { + var playable = ScriptPlayable.Create(graph, template); + return playable; + } +} +#endif \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipClip.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipClip.cs.meta new file mode 100644 index 0000000..cfc9eee --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipClip.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0a29ac408b701f84c93882fb506759d1 +timeCreated: 1500876411 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipMixerBehaviour.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipMixerBehaviour.cs new file mode 100644 index 0000000..2330aae --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipMixerBehaviour.cs @@ -0,0 +1,102 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if UNITY_2017 || UNITY_2018 + using System; +using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; + +using Spine.Unity; + +namespace Spine.Unity.Playables { + public class SpineSkeletonFlipMixerBehaviour : PlayableBehaviour { + bool defaultFlipX, defaultFlipY; + + SpinePlayableHandleBase playableHandle; + bool m_FirstFrameHappened; + + public override void ProcessFrame (Playable playable, FrameData info, object playerData) { + playableHandle = playerData as SpinePlayableHandleBase; + + if (playableHandle == null) + return; + + var skeleton = playableHandle.Skeleton; + + if (!m_FirstFrameHappened) { + defaultFlipX = skeleton.flipX; + defaultFlipY = skeleton.flipY; + m_FirstFrameHappened = true; + } + + int inputCount = playable.GetInputCount(); + + float totalWeight = 0f; + float greatestWeight = 0f; + int currentInputs = 0; + + for (int i = 0; i < inputCount; i++) { + float inputWeight = playable.GetInputWeight(i); + ScriptPlayable inputPlayable = (ScriptPlayable)playable.GetInput(i); + SpineSkeletonFlipBehaviour input = inputPlayable.GetBehaviour(); + + totalWeight += inputWeight; + + if (inputWeight > greatestWeight) { + skeleton.flipX = input.flipX; + skeleton.flipY = input.flipY; + greatestWeight = inputWeight; + } + + if (!Mathf.Approximately(inputWeight, 0f)) + currentInputs++; + } + + if (currentInputs != 1 && 1f - totalWeight > greatestWeight) { + skeleton.flipX = defaultFlipX; + skeleton.flipY = defaultFlipY; + } + } + + public override void OnGraphStop (Playable playable) { + m_FirstFrameHappened = false; + + if (playableHandle == null) + return; + + var skeleton = playableHandle.Skeleton; + skeleton.flipX = defaultFlipX; + skeleton.flipY = defaultFlipY; + } + } + +} +#endif diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipMixerBehaviour.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipMixerBehaviour.cs.meta new file mode 100644 index 0000000..737c386 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipMixerBehaviour.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f25dcf1fb34ab8643ac8734e57a9540f +timeCreated: 1500876411 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipTrack.cs b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipTrack.cs new file mode 100644 index 0000000..86d24d9 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipTrack.cs @@ -0,0 +1,68 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if UNITY_2017 || UNITY_2018 + using UnityEngine; +using UnityEngine.Playables; +using UnityEngine.Timeline; +using System.Collections.Generic; + +using Spine.Unity; + +namespace Spine.Unity.Playables { + + [TrackColor(0.855f, 0.8623f, 0.87f)] + [TrackClipType(typeof(SpineSkeletonFlipClip))] + [TrackBindingType(typeof(SpinePlayableHandleBase))] + public class SpineSkeletonFlipTrack : TrackAsset { + public override Playable CreateTrackMixer (PlayableGraph graph, GameObject go, int inputCount) { + return ScriptPlayable.Create(graph, inputCount); + } + + public override void GatherProperties (PlayableDirector director, IPropertyCollector driver) { +#if UNITY_EDITOR + SpinePlayableHandleBase trackBinding = director.GetGenericBinding(this) as SpinePlayableHandleBase; + if (trackBinding == null) + return; + + var serializedObject = new UnityEditor.SerializedObject(trackBinding); + var iterator = serializedObject.GetIterator(); + while (iterator.NextVisible(true)) { + if (iterator.hasVisibleChildren) + continue; + + driver.AddFromName(trackBinding.gameObject, iterator.propertyPath); + } +#endif + base.GatherProperties(director, driver); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipTrack.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipTrack.cs.meta new file mode 100644 index 0000000..b819b34 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/Timeline/SpineSkeletonFlip/SpineSkeletonFlipTrack.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 82ac803eb1878814bba380a18b6b5d9d +timeCreated: 1500876411 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions.meta b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions.meta new file mode 100644 index 0000000..903af3e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 15ac4befbee15d845ac289de3ab6d3d4 +folderAsset: yes +timeCreated: 1455486167 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs new file mode 100644 index 0000000..13f219c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs @@ -0,0 +1,86 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections; +using Spine; + +namespace Spine.Unity { + /// + /// Use this as a condition-blocking yield instruction for Unity Coroutines. + /// The routine will pause until the AnimationState.TrackEntry fires its Complete event. + public class WaitForSpineAnimationComplete : IEnumerator { + + bool m_WasFired = false; + + public WaitForSpineAnimationComplete (Spine.TrackEntry trackEntry) { + SafeSubscribe(trackEntry); + } + + void HandleComplete (TrackEntry trackEntry) { + m_WasFired = true; + } + + void SafeSubscribe (Spine.TrackEntry trackEntry) { + if (trackEntry == null) { + // Break immediately if trackEntry is null. + Debug.LogWarning("TrackEntry was null. Coroutine will continue immediately."); + m_WasFired = true; + } else { + trackEntry.Complete += HandleComplete; + } + } + + #region Reuse + /// + /// One optimization high-frequency YieldInstruction returns is to cache instances to minimize GC pressure. + /// Use NowWaitFor to reuse the same instance of WaitForSpineAnimationComplete. + public WaitForSpineAnimationComplete NowWaitFor (Spine.TrackEntry trackEntry) { + SafeSubscribe(trackEntry); + return this; + } + #endregion + + #region IEnumerator + bool IEnumerator.MoveNext () { + if (m_WasFired) { + ((IEnumerator)this).Reset(); // auto-reset for YieldInstruction reuse + return false; + } + + return true; + } + void IEnumerator.Reset () { m_WasFired = false; } + object IEnumerator.Current { get { return null; } } + #endregion + + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs.meta new file mode 100644 index 0000000..0aabc3b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineAnimationComplete.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a807dd9fb79db3545b6c2859a2bbfc0b +timeCreated: 1449704018 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineEvent.cs b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineEvent.cs new file mode 100644 index 0000000..38a9e65 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineEvent.cs @@ -0,0 +1,160 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections; +using Spine; + +namespace Spine.Unity { + /// + /// Use this as a condition-blocking yield instruction for Unity Coroutines. + /// The routine will pause until the AnimationState fires an event matching the given event name or EventData reference. + public class WaitForSpineEvent : IEnumerator { + + Spine.EventData m_TargetEvent; + string m_EventName; + Spine.AnimationState m_AnimationState; + + bool m_WasFired = false; + bool m_unsubscribeAfterFiring = false; + + #region Constructors + void Subscribe (Spine.AnimationState state, Spine.EventData eventDataReference, bool unsubscribe) { + if (state == null) { + Debug.LogWarning("AnimationState argument was null. Coroutine will continue immediately."); + m_WasFired = true; + return; + } else if (eventDataReference == null) { + Debug.LogWarning("eventDataReference argument was null. Coroutine will continue immediately."); + m_WasFired = true; + return; + } + + m_AnimationState = state; + m_TargetEvent = eventDataReference; + state.Event += HandleAnimationStateEvent; + + m_unsubscribeAfterFiring = unsubscribe; + + } + + void SubscribeByName (Spine.AnimationState state, string eventName, bool unsubscribe) { + if (state == null) { + Debug.LogWarning("AnimationState argument was null. Coroutine will continue immediately."); + m_WasFired = true; + return; + } else if (string.IsNullOrEmpty(eventName)) { + Debug.LogWarning("eventName argument was null. Coroutine will continue immediately."); + m_WasFired = true; + return; + } + + m_AnimationState = state; + m_EventName = eventName; + state.Event += HandleAnimationStateEventByName; + + m_unsubscribeAfterFiring = unsubscribe; + } + + public WaitForSpineEvent (Spine.AnimationState state, Spine.EventData eventDataReference, bool unsubscribeAfterFiring = true) { + Subscribe(state, eventDataReference, unsubscribeAfterFiring); + } + + public WaitForSpineEvent (SkeletonAnimation skeletonAnimation, Spine.EventData eventDataReference, bool unsubscribeAfterFiring = true) { + // If skeletonAnimation is invalid, its state will be null. Subscribe handles null states just fine. + Subscribe(skeletonAnimation.state, eventDataReference, unsubscribeAfterFiring); + } + + public WaitForSpineEvent (Spine.AnimationState state, string eventName, bool unsubscribeAfterFiring = true) { + SubscribeByName(state, eventName, unsubscribeAfterFiring); + } + + public WaitForSpineEvent (SkeletonAnimation skeletonAnimation, string eventName, bool unsubscribeAfterFiring = true) { + // If skeletonAnimation is invalid, its state will be null. Subscribe handles null states just fine. + SubscribeByName(skeletonAnimation.state, eventName, unsubscribeAfterFiring); + } + #endregion + + #region Event Handlers + void HandleAnimationStateEventByName (Spine.TrackEntry trackEntry, Spine.Event e) { + m_WasFired |= (e.Data.Name == m_EventName); // Check event name string match. + if (m_WasFired && m_unsubscribeAfterFiring) + m_AnimationState.Event -= HandleAnimationStateEventByName; // Unsubscribe after correct event fires. + } + + void HandleAnimationStateEvent (Spine.TrackEntry trackEntry, Spine.Event e) { + m_WasFired |= (e.Data == m_TargetEvent); // Check event data reference match. + if (m_WasFired && m_unsubscribeAfterFiring) + m_AnimationState.Event -= HandleAnimationStateEvent; // Usubscribe after correct event fires. + } + #endregion + + #region Reuse + /// + /// By default, WaitForSpineEvent will unsubscribe from the event immediately after it fires a correct matching event. + /// If you want to reuse this WaitForSpineEvent instance on the same event, you can set this to false. + public bool WillUnsubscribeAfterFiring { get { return m_unsubscribeAfterFiring; } set { m_unsubscribeAfterFiring = value; } } + + public WaitForSpineEvent NowWaitFor (Spine.AnimationState state, Spine.EventData eventDataReference, bool unsubscribeAfterFiring = true) { + ((IEnumerator)this).Reset(); + Clear(state); + Subscribe(state, eventDataReference, unsubscribeAfterFiring); + + return this; + } + + public WaitForSpineEvent NowWaitFor (Spine.AnimationState state, string eventName, bool unsubscribeAfterFiring = true) { + ((IEnumerator)this).Reset(); + Clear(state); + SubscribeByName(state, eventName, unsubscribeAfterFiring); + + return this; + } + + void Clear (Spine.AnimationState state) { + state.Event -= HandleAnimationStateEvent; + state.Event -= HandleAnimationStateEventByName; + } + #endregion + + #region IEnumerator + bool IEnumerator.MoveNext () { + if (m_WasFired) { + ((IEnumerator)this).Reset(); // auto-reset for YieldInstruction reuse + return false; + } + + return true; + } + void IEnumerator.Reset () { m_WasFired = false; } + object IEnumerator.Current { get { return null; } } + #endregion + } +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineEvent.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineEvent.cs.meta new file mode 100644 index 0000000..72bbef7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineEvent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fc166d883db083e469872998172f2d38 +timeCreated: 1449701857 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs new file mode 100644 index 0000000..7c5ef94 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs @@ -0,0 +1,86 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; +using System.Collections; +using Spine; + +namespace Spine.Unity { + /// + /// Use this as a condition-blocking yield instruction for Unity Coroutines. + /// The routine will pause until the AnimationState.TrackEntry fires its End event. + public class WaitForSpineTrackEntryEnd : IEnumerator { + + bool m_WasFired = false; + + public WaitForSpineTrackEntryEnd (Spine.TrackEntry trackEntry) { + SafeSubscribe(trackEntry); + } + + void HandleEnd (TrackEntry trackEntry) { + m_WasFired = true; + } + + void SafeSubscribe (Spine.TrackEntry trackEntry) { + if (trackEntry == null) { + // Break immediately if trackEntry is null. + Debug.LogWarning("TrackEntry was null. Coroutine will continue immediately."); + m_WasFired = true; + } else { + trackEntry.End += HandleEnd; + } + } + + #region Reuse + /// + /// One optimization high-frequency YieldInstruction returns is to cache instances to minimize GC pressure. + /// Use NowWaitFor to reuse the same instance of WaitForSpineAnimationEnd. + public WaitForSpineTrackEntryEnd NowWaitFor (Spine.TrackEntry trackEntry) { + SafeSubscribe(trackEntry); + return this; + } + #endregion + + #region IEnumerator + bool IEnumerator.MoveNext () { + if (m_WasFired) { + ((IEnumerator)this).Reset(); // auto-reset for YieldInstruction reuse + return false; + } + + return true; + } + void IEnumerator.Reset () { m_WasFired = false; } + object IEnumerator.Current { get { return null; } } + #endregion + + } + +} diff --git a/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs.meta b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs.meta new file mode 100644 index 0000000..afd6031 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Modules/YieldInstructions/WaitForSpineTrackEntryEnd.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8036c6c2897d2764db92f632d2aef568 +timeCreated: 1480672707 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Shaders.meta b/Assets/Spine/Assets/spine-unity/Shaders.meta new file mode 100644 index 0000000..96c6a80 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: ef8189a68a74bec4eba582e65fb98dbd +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader new file mode 100644 index 0000000..7eeca1e --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader @@ -0,0 +1,106 @@ +// Spine/Skeleton Tint Black +// - Two color tint +// - UV2 and UV3 as Black Tint color. +// - Final black tint is (UV black data and _Black/"Black Point") +// - unlit +// - Premultiplied alpha blending +// - No depth, no backface culling, no fog. + +Shader "Spine/Skeleton Tint Black" { + Properties { + _Color ("Tint Color", Color) = (1,1,1,1) + _Black ("Black Point", Color) = (0,0,0,0) + [NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {} + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + LOD 100 + + Fog { Mode Off } + Cull Off + ZWrite Off + Blend One OneMinusSrcAlpha + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float4 _Color; + float4 _Black; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + o.uv = v.uv; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + o.uv1 = v.uv1; + o.uv2 = v.uv2; + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 texColor = tex2D(_MainTex, i.uv); + return (texColor * i.vertexColor) + float4(((1-texColor.rgb) * (_Black.rgb + float3(i.uv1.r, i.uv1.g, i.uv2.r)) * texColor.a*_Color.a*i.vertexColor.a), 0); + } + ENDCG + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + + ZWrite On + ZTest LEqual + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + sampler2D _MainTex; + fixed _Cutoff; + + struct v2f { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + v2f vert (appdata_base v) { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uv = v.texcoord; + return o; + } + + float4 frag (v2f i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader.meta b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader.meta new file mode 100644 index 0000000..2801fe0 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: deee23ab4aa38564ead2ac05e112c169 +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton.shader b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton.shader new file mode 100644 index 0000000..7b5c00d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton.shader @@ -0,0 +1,80 @@ +Shader "Spine/Skeleton" { + Properties { + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + [NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {} + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane"} + + Fog { Mode Off } + Cull Off + ZWrite Off + Blend One OneMinusSrcAlpha + Lighting Off + + Pass { + Fog { Mode Off } + ColorMaterial AmbientAndDiffuse + SetTexture [_MainTex] { + Combine texture * primary + } + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + ZWrite On + ZTest LEqual + + Fog { Mode Off } + Cull Off + Lighting Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + sampler2D _MainTex; + fixed _Cutoff; + + struct v2f { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + v2f vert (appdata_base v) { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uv = v.texcoord; + return o; + } + + float4 frag (v2f i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + + Cull Off + ZWrite Off + Blend One OneMinusSrcAlpha + Lighting Off + + Pass { + ColorMaterial AmbientAndDiffuse + SetTexture [_MainTex] { + Combine texture * primary DOUBLE, texture * primary + } + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton.shader.meta b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton.shader.meta new file mode 100644 index 0000000..06c4b0c --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Spine-Skeleton.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1e8a610c9e01c3648bac42585e5fc676 +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Spine-SkeletonLit.shader b/Assets/Spine/Assets/spine-unity/Shaders/Spine-SkeletonLit.shader new file mode 100644 index 0000000..8b193c2 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Spine-SkeletonLit.shader @@ -0,0 +1,189 @@ +// - Vertex Lit + ShadowCaster +// - Premultiplied Alpha Blending (One OneMinusSrcAlpha) +// - Double-sided, no depth + +Shader "Spine/Skeleton Lit" { + Properties { + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + [NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {} + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + LOD 100 + + Cull Off + ZWrite Off + Blend One OneMinusSrcAlpha + +// Pass { +// Tags { "LightMode"="Vertex" } +// ColorMaterial AmbientAndDiffuse +// Lighting On +// SetTexture [_MainTex] { +// Combine texture * primary DOUBLE, texture * primary +// } +// } + + Pass { + Tags { + "LIGHTMODE"="Vertex" + "QUEUE"="Transparent" + "IGNOREPROJECTOR"="true" + "RenderType"="Transparent" + } + + ZWrite Off + Cull Off + Blend One OneMinusSrcAlpha + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + #include "UnityCG.cginc" + + // ES2.0/WebGL/3DS can not do loops with non-constant-expression iteration counts :( + #if defined(SHADER_API_GLES) + #define LIGHT_LOOP_LIMIT 8 + #elif defined(SHADER_API_N3DS) + #define LIGHT_LOOP_LIMIT 4 + #else + #define LIGHT_LOOP_LIMIT unity_VertexLightParams.x + #endif + + #pragma multi_compile __ POINT SPOT + + half3 computeLighting (int idx, half3 dirToLight, half3 eyeNormal, half3 viewDir, half4 diffuseColor, half atten) { + half NdotL = max(dot(eyeNormal, dirToLight), 0.0); + // diffuse + half3 color = NdotL * diffuseColor.rgb * unity_LightColor[idx].rgb; + return color * atten; + } + + half3 computeOneLight (int idx, float3 eyePosition, half3 eyeNormal, half3 viewDir, half4 diffuseColor) { + float3 dirToLight = unity_LightPosition[idx].xyz; + half att = 1.0; + + #if defined(POINT) || defined(SPOT) + dirToLight -= eyePosition * unity_LightPosition[idx].w; + + // distance attenuation + float distSqr = dot(dirToLight, dirToLight); + att /= (1.0 + unity_LightAtten[idx].z * distSqr); + if (unity_LightPosition[idx].w != 0 && distSqr > unity_LightAtten[idx].w) att = 0.0; // set to 0 if outside of range + distSqr = max(distSqr, 0.000001); // don't produce NaNs if some vertex position overlaps with the light + dirToLight *= rsqrt(distSqr); + #if defined(SPOT) + + // spot angle attenuation + half rho = max(dot(dirToLight, unity_SpotDirection[idx].xyz), 0.0); + half spotAtt = (rho - unity_LightAtten[idx].x) * unity_LightAtten[idx].y; + att *= saturate(spotAtt); + #endif + #endif + + att *= 0.5; // passed in light colors are 2x brighter than what used to be in FFP + return min (computeLighting (idx, dirToLight, eyeNormal, viewDir, diffuseColor, att), 1.0); + } + + int4 unity_VertexLightParams; // x: light count, y: zero, z: one (y/z needed by d3d9 vs loop instruction) + + struct appdata { + float3 pos : POSITION; + float3 normal : NORMAL; + half4 color : COLOR; + float3 uv0 : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput { + fixed4 color : COLOR0; + float2 uv0 : TEXCOORD0; + float4 pos : SV_POSITION; + UNITY_VERTEX_OUTPUT_STEREO + }; + + VertexOutput vert (appdata v) { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + half4 color = v.color; + float3 eyePos = UnityObjectToViewPos(float4(v.pos, 1)).xyz; //mul(UNITY_MATRIX_MV, float4(v.pos,1)).xyz; + half3 fixedNormal = half3(0,0,-1); + half3 eyeNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, fixedNormal)); + //half3 eyeNormal = half3(0,0,1); + half3 viewDir = 0.0; + + // Lights + half3 lcolor = half4(0,0,0,1).rgb + color.rgb * glstate_lightmodel_ambient.rgb; + for (int il = 0; il < LIGHT_LOOP_LIMIT; ++il) { + lcolor += computeOneLight(il, eyePos, eyeNormal, viewDir, color); + } + + color.rgb = lcolor.rgb; + o.color = saturate(color); + o.uv0 = v.uv0; + o.pos = UnityObjectToClipPos(v.pos); + return o; + } + + sampler2D _MainTex; + + fixed4 frag (VertexOutput i) : SV_Target { + fixed4 tex = tex2D(_MainTex, i.uv0); + + fixed4 col; + col.rgb = tex * i.color; + col *= 2; + col.a = tex.a * i.color.a; + return col; + } + ENDCG + + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + + Fog { Mode Off } + ZWrite On + ZTest LEqual + Cull Off + Lighting Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + struct v2f { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + uniform float4 _MainTex_ST; + + v2f vert (appdata_base v) { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + uniform sampler2D _MainTex; + uniform fixed _Cutoff; + + float4 frag (v2f i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Spine-SkeletonLit.shader.meta b/Assets/Spine/Assets/spine-unity/Shaders/Spine-SkeletonLit.shader.meta new file mode 100644 index 0000000..1d0a386 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Spine-SkeletonLit.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bd83c75f51f5e23498ae22ffcdfe92c3 +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Utility.meta b/Assets/Spine/Assets/spine-unity/Shaders/Utility.meta new file mode 100644 index 0000000..188c117 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Utility.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bc59776133d26dc469c8ba66bdc647e4 +folderAsset: yes +timeCreated: 1492387122 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Utility/Hidden-Spine-Bones.shader b/Assets/Spine/Assets/spine-unity/Shaders/Utility/Hidden-Spine-Bones.shader new file mode 100644 index 0000000..ee2045d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Utility/Hidden-Spine-Bones.shader @@ -0,0 +1,66 @@ +Shader "Hidden/Spine/Bones" { +Properties { + _Color ("Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex ("Particle Texture", 2D) = "white" {} +} + +Category { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend SrcAlpha OneMinusSrcAlpha + AlphaTest Greater .01 + ColorMask RGB + + Lighting Off Cull Off ZTest Always ZWrite Off Fog { Mode Off } + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag +// #pragma multi_compile_particles + + #include "UnityCG.cginc" + + sampler2D _MainTex; + fixed4 _Color; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; +// #ifdef SOFTPARTICLES_ON +// float4 projPos : TEXCOORD1; +// #endif + }; + + float4 _MainTex_ST; + + v2f vert (appdata_t v) { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); +// #ifdef SOFTPARTICLES_ON +// o.projPos = ComputeScreenPos (o.vertex); +// COMPUTE_EYEDEPTH(o.projPos.z); +// #endif + o.color = v.color; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + return o; + } + + sampler2D_float _CameraDepthTexture; + + fixed4 frag (v2f i) : SV_Target { + return i.color * _Color * tex2D(_MainTex, i.texcoord); + } + ENDCG + } + } +} +} diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Utility/Hidden-Spine-Bones.shader.meta b/Assets/Spine/Assets/spine-unity/Shaders/Utility/Hidden-Spine-Bones.shader.meta new file mode 100644 index 0000000..17117f3 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Utility/Hidden-Spine-Bones.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 66988de88a15abd4e8846c6805485f57 +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.mat b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.mat new file mode 100644 index 0000000..c7bc5ad --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.mat @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: HiddenPass + m_Shader: {fileID: 4800000, guid: 913475501bf19374c84390868a9d6d3d, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _Cutoff + second: 0.1 + - first: + name: _InvFade + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _TintColor + second: {r: 0.5, g: 0.5, b: 0.5, a: 0} diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.mat.meta b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.mat.meta new file mode 100644 index 0000000..f9a2a31 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.mat.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 43227e5adadc6f24bb4bf74b92a56fb4 +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.shader b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.shader new file mode 100644 index 0000000..c06650a --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.shader @@ -0,0 +1,12 @@ +Shader "Spine/Special/HiddenPass" { + SubShader + { + Tags {"Queue" = "Geometry-1" } + Lighting Off + Pass + { + ZWrite Off + ColorMask 0 + } + } +} diff --git a/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.shader.meta b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.shader.meta new file mode 100644 index 0000000..01ca4ed --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/Shaders/Utility/HiddenPass.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 913475501bf19374c84390868a9d6d3d +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonExtensions.cs b/Assets/Spine/Assets/spine-unity/SkeletonExtensions.cs new file mode 100644 index 0000000..8412098 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonExtensions.cs @@ -0,0 +1,617 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using UnityEngine; + +namespace Spine.Unity { + public static class SkeletonExtensions { + + #region Colors + const float ByteToFloat = 1f / 255f; + public static Color GetColor (this Skeleton s) { return new Color(s.r, s.g, s.b, s.a); } + public static Color GetColor (this RegionAttachment a) { return new Color(a.r, a.g, a.b, a.a); } + public static Color GetColor (this MeshAttachment a) { return new Color(a.r, a.g, a.b, a.a); } + public static Color GetColor (this Slot s) { return new Color(s.r, s.g, s.b, s.a); } + public static Color GetColorTintBlack (this Slot s) { return new Color(s.r2, s.g2, s.b2, 1f); } + + public static void SetColor (this Skeleton skeleton, Color color) { + skeleton.A = color.a; + skeleton.R = color.r; + skeleton.G = color.g; + skeleton.B = color.b; + } + + public static void SetColor (this Skeleton skeleton, Color32 color) { + skeleton.A = color.a * ByteToFloat; + skeleton.R = color.r * ByteToFloat; + skeleton.G = color.g * ByteToFloat; + skeleton.B = color.b * ByteToFloat; + } + + public static void SetColor (this Slot slot, Color color) { + slot.A = color.a; + slot.R = color.r; + slot.G = color.g; + slot.B = color.b; + } + + public static void SetColor (this Slot slot, Color32 color) { + slot.A = color.a * ByteToFloat; + slot.R = color.r * ByteToFloat; + slot.G = color.g * ByteToFloat; + slot.B = color.b * ByteToFloat; + } + + public static void SetColor (this RegionAttachment attachment, Color color) { + attachment.A = color.a; + attachment.R = color.r; + attachment.G = color.g; + attachment.B = color.b; + } + + public static void SetColor (this RegionAttachment attachment, Color32 color) { + attachment.A = color.a * ByteToFloat; + attachment.R = color.r * ByteToFloat; + attachment.G = color.g * ByteToFloat; + attachment.B = color.b * ByteToFloat; + } + + public static void SetColor (this MeshAttachment attachment, Color color) { + attachment.A = color.a; + attachment.R = color.r; + attachment.G = color.g; + attachment.B = color.b; + } + + public static void SetColor (this MeshAttachment attachment, Color32 color) { + attachment.A = color.a * ByteToFloat; + attachment.R = color.r * ByteToFloat; + attachment.G = color.g * ByteToFloat; + attachment.B = color.b * ByteToFloat; + } + #endregion + + #region Bone + /// Sets the bone's (local) X and Y according to a Vector2 + public static void SetPosition (this Bone bone, Vector2 position) { + bone.X = position.x; + bone.Y = position.y; + } + + /// Sets the bone's (local) X and Y according to a Vector3. The z component is ignored. + public static void SetPosition (this Bone bone, Vector3 position) { + bone.X = position.x; + bone.Y = position.y; + } + + /// Gets the bone's local X and Y as a Vector2. + public static Vector2 GetLocalPosition (this Bone bone) { + return new Vector2(bone.x, bone.y); + } + + /// Gets the position of the bone in Skeleton-space. + public static Vector2 GetSkeletonSpacePosition (this Bone bone) { + return new Vector2(bone.worldX, bone.worldY); + } + + /// Gets a local offset from the bone and converts it into Skeleton-space. + public static Vector2 GetSkeletonSpacePosition (this Bone bone, Vector2 boneLocal) { + Vector2 o; + bone.LocalToWorld(boneLocal.x, boneLocal.y, out o.x, out o.y); + return o; + } + + /// Gets the bone's Unity World position using its Spine GameObject Transform. UpdateWorldTransform needs to have been called for this to return the correct, updated value. + public static Vector3 GetWorldPosition (this Bone bone, UnityEngine.Transform spineGameObjectTransform) { + return spineGameObjectTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY)); + } + + public static Vector3 GetWorldPosition (this Bone bone, UnityEngine.Transform spineGameObjectTransform, float positionScale) { + return spineGameObjectTransform.TransformPoint(new Vector3(bone.worldX * positionScale, bone.worldY * positionScale)); + } + + /// Gets a skeleton space UnityEngine.Quaternion representation of bone.WorldRotationX. + public static Quaternion GetQuaternion (this Bone bone) { + var halfRotation = Mathf.Atan2(bone.c, bone.a) * 0.5f; + return new Quaternion(0, 0, Mathf.Sin(halfRotation), Mathf.Cos(halfRotation)); + } + + /// Gets a bone-local space UnityEngine.Quaternion representation of bone.rotation. + public static Quaternion GetLocalQuaternion (this Bone bone) { + var halfRotation = bone.rotation * Mathf.Deg2Rad * 0.5f; + return new Quaternion(0, 0, Mathf.Sin(halfRotation), Mathf.Cos(halfRotation)); + } + + /// Gets the internal bone matrix as a Unity bonespace-to-skeletonspace transformation matrix. + public static Matrix4x4 GetMatrix4x4 (this Bone bone) { + return new Matrix4x4 { + m00 = bone.a, m01 = bone.b, m03 = bone.worldX, + m10 = bone.c, m11 = bone.d, m13 = bone.worldY, + m33 = 1 + }; + } + + /// Calculates a 2x2 Transformation Matrix that can convert a skeleton-space position to a bone-local position. + public static void GetWorldToLocalMatrix (this Bone bone, out float ia, out float ib, out float ic, out float id) { + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; + float invDet = 1 / (a * d - b * c); + ia = invDet * d; + ib = invDet * -b; + ic = invDet * -c; + id = invDet * a; + } + + /// UnityEngine.Vector2 override of Bone.WorldToLocal. This converts a skeleton-space position into a bone local position. + public static Vector2 WorldToLocal (this Bone bone, Vector2 worldPosition) { + Vector2 o; + bone.WorldToLocal(worldPosition.x, worldPosition.y, out o.x, out o.y); + return o; + } + + /// Sets the skeleton-space position of a bone. + /// The local position in its parent bone space, or in skeleton space if it is the root bone. + public static Vector2 SetPositionSkeletonSpace (this Bone bone, Vector2 skeletonSpacePosition) { + if (bone.parent == null) { // root bone + bone.SetPosition(skeletonSpacePosition); + return skeletonSpacePosition; + } else { + var parent = bone.parent; + Vector2 parentLocal = parent.WorldToLocal(skeletonSpacePosition); + bone.SetPosition(parentLocal); + return parentLocal; + } + } + #endregion + + #region Attachments + public static Material GetMaterial (this Attachment a) { + object rendererObject = null; + var renderableAttachment = a as IHasRendererObject; + if (renderableAttachment != null) { + rendererObject = renderableAttachment.RendererObject; + } + + if (rendererObject == null) + return null; + + #if SPINE_TK2D + return (rendererObject.GetType() == typeof(Material)) ? (Material)rendererObject : (Material)((AtlasRegion)rendererObject).page.rendererObject; + #else + return (Material)((AtlasRegion)rendererObject).page.rendererObject; + #endif + } + + /// Fills a Vector2 buffer with local vertices. + /// The VertexAttachment + /// Slot where the attachment belongs. + /// Correctly-sized buffer. Use attachment's .WorldVerticesLength to get the correct size. If null, a new Vector2[] of the correct size will be allocated. + public static Vector2[] GetLocalVertices (this VertexAttachment va, Slot slot, Vector2[] buffer) { + int floatsCount = va.worldVerticesLength; + int bufferTargetSize = floatsCount >> 1; + buffer = buffer ?? new Vector2[bufferTargetSize]; + if (buffer.Length < bufferTargetSize) throw new System.ArgumentException(string.Format("Vector2 buffer too small. {0} requires an array of size {1}. Use the attachment's .WorldVerticesLength to get the correct size.", va.Name, floatsCount), "buffer"); + + if (va.bones == null) { + var localVerts = va.vertices; + for (int i = 0; i < bufferTargetSize; i++) { + int j = i * 2; + buffer[i] = new Vector2(localVerts[j], localVerts[j+1]); + } + } else { + var floats = new float[floatsCount]; + va.ComputeWorldVertices(slot, floats); + + Bone sb = slot.bone; + float ia, ib, ic, id, bwx = sb.worldX, bwy = sb.worldY; + sb.GetWorldToLocalMatrix(out ia, out ib, out ic, out id); + + for (int i = 0; i < bufferTargetSize; i++) { + int j = i * 2; + float x = floats[j] - bwx, y = floats[j+1] - bwy; + buffer[i] = new Vector2(x * ia + y * ib, x * ic + y * id); + } + } + + return buffer; + } + + /// Calculates world vertices and fills a Vector2 buffer. + /// The VertexAttachment + /// Slot where the attachment belongs. + /// Correctly-sized buffer. Use attachment's .WorldVerticesLength to get the correct size. If null, a new Vector2[] of the correct size will be allocated. + public static Vector2[] GetWorldVertices (this VertexAttachment a, Slot slot, Vector2[] buffer) { + int worldVertsLength = a.worldVerticesLength; + int bufferTargetSize = worldVertsLength >> 1; + buffer = buffer ?? new Vector2[bufferTargetSize]; + if (buffer.Length < bufferTargetSize) throw new System.ArgumentException(string.Format("Vector2 buffer too small. {0} requires an array of size {1}. Use the attachment's .WorldVerticesLength to get the correct size.", a.Name, worldVertsLength), "buffer"); + + var floats = new float[worldVertsLength]; + a.ComputeWorldVertices(slot, floats); + + for (int i = 0, n = worldVertsLength >> 1; i < n; i++) { + int j = i * 2; + buffer[i] = new Vector2(floats[j], floats[j + 1]); + } + + return buffer; + } + + /// Gets the PointAttachment's Unity World position using its Spine GameObject Transform. + public static Vector3 GetWorldPosition (this PointAttachment attachment, Slot slot, Transform spineGameObjectTransform) { + Vector3 skeletonSpacePosition; + skeletonSpacePosition.z = 0; + attachment.ComputeWorldPosition(slot.bone, out skeletonSpacePosition.x, out skeletonSpacePosition.y); + return spineGameObjectTransform.TransformPoint(skeletonSpacePosition); + } + + /// Gets the PointAttachment's Unity World position using its Spine GameObject Transform. + public static Vector3 GetWorldPosition (this PointAttachment attachment, Bone bone, Transform spineGameObjectTransform) { + Vector3 skeletonSpacePosition; + skeletonSpacePosition.z = 0; + attachment.ComputeWorldPosition(bone, out skeletonSpacePosition.x, out skeletonSpacePosition.y); + return spineGameObjectTransform.TransformPoint(skeletonSpacePosition); + } + #endregion + } +} + +namespace Spine { + using System; + using System.Collections.Generic; + + public struct BoneMatrix { + public float a, b, c, d, x, y; + + /// Recursively calculates a worldspace bone matrix based on BoneData. + public static BoneMatrix CalculateSetupWorld (BoneData boneData) { + if (boneData == null) + return default(BoneMatrix); + + // End condition: isRootBone + if (boneData.parent == null) + return GetInheritedInternal(boneData, default(BoneMatrix)); + + BoneMatrix result = CalculateSetupWorld(boneData.parent); + return GetInheritedInternal(boneData, result); + } + + static BoneMatrix GetInheritedInternal (BoneData boneData, BoneMatrix parentMatrix) { + var parent = boneData.parent; + if (parent == null) return new BoneMatrix(boneData); // isRootBone + + float pa = parentMatrix.a, pb = parentMatrix.b, pc = parentMatrix.c, pd = parentMatrix.d; + BoneMatrix result = default(BoneMatrix); + result.x = pa * boneData.x + pb * boneData.y + parentMatrix.x; + result.y = pc * boneData.x + pd * boneData.y + parentMatrix.y; + + switch (boneData.transformMode) { + case TransformMode.Normal: { + float rotationY = boneData.rotation + 90 + boneData.shearY; + float la = MathUtils.CosDeg(boneData.rotation + boneData.shearX) * boneData.scaleX; + float lb = MathUtils.CosDeg(rotationY) * boneData.scaleY; + float lc = MathUtils.SinDeg(boneData.rotation + boneData.shearX) * boneData.scaleX; + float ld = MathUtils.SinDeg(rotationY) * boneData.scaleY; + result.a = pa * la + pb * lc; + result.b = pa * lb + pb * ld; + result.c = pc * la + pd * lc; + result.d = pc * lb + pd * ld; + break; + } + case TransformMode.OnlyTranslation: { + float rotationY = boneData.rotation + 90 + boneData.shearY; + result.a = MathUtils.CosDeg(boneData.rotation + boneData.shearX) * boneData.scaleX; + result.b = MathUtils.CosDeg(rotationY) * boneData.scaleY; + result.c = MathUtils.SinDeg(boneData.rotation + boneData.shearX) * boneData.scaleX; + result.d = MathUtils.SinDeg(rotationY) * boneData.scaleY; + break; + } + case TransformMode.NoRotationOrReflection: { + float s = pa * pa + pc * pc, prx; + if (s > 0.0001f) { + s = Math.Abs(pa * pd - pb * pc) / s; + pb = pc * s; + pd = pa * s; + prx = MathUtils.Atan2(pc, pa) * MathUtils.RadDeg; + } else { + pa = 0; + pc = 0; + prx = 90 - MathUtils.Atan2(pd, pb) * MathUtils.RadDeg; + } + float rx = boneData.rotation + boneData.shearX - prx; + float ry = boneData.rotation + boneData.shearY - prx + 90; + float la = MathUtils.CosDeg(rx) * boneData.scaleX; + float lb = MathUtils.CosDeg(ry) * boneData.scaleY; + float lc = MathUtils.SinDeg(rx) * boneData.scaleX; + float ld = MathUtils.SinDeg(ry) * boneData.scaleY; + result.a = pa * la - pb * lc; + result.b = pa * lb - pb * ld; + result.c = pc * la + pd * lc; + result.d = pc * lb + pd * ld; + break; + } + case TransformMode.NoScale: + case TransformMode.NoScaleOrReflection: { + float cos = MathUtils.CosDeg(boneData.rotation), sin = MathUtils.SinDeg(boneData.rotation); + float za = pa * cos + pb * sin; + float zc = pc * cos + pd * sin; + float s = (float)Math.Sqrt(za * za + zc * zc); + if (s > 0.00001f) + s = 1 / s; + za *= s; + zc *= s; + s = (float)Math.Sqrt(za * za + zc * zc); + float r = MathUtils.PI / 2 + MathUtils.Atan2(zc, za); + float zb = MathUtils.Cos(r) * s; + float zd = MathUtils.Sin(r) * s; + float la = MathUtils.CosDeg(boneData.shearX) * boneData.scaleX; + float lb = MathUtils.CosDeg(90 + boneData.shearY) * boneData.scaleY; + float lc = MathUtils.SinDeg(boneData.shearX) * boneData.scaleX; + float ld = MathUtils.SinDeg(90 + boneData.shearY) * boneData.scaleY; + if (boneData.transformMode != TransformMode.NoScaleOrReflection ? pa * pd - pb * pc < 0 : false) { + zb = -zb; + zd = -zd; + } + result.a = za * la + zb * lc; + result.b = za * lb + zb * ld; + result.c = zc * la + zd * lc; + result.d = zc * lb + zd * ld; + break; + } + } + + return result; + } + + /// Constructor for a local bone matrix based on Setup Pose BoneData. + public BoneMatrix (BoneData boneData) { + float rotationY = boneData.rotation + 90 + boneData.shearY; + float rotationX = boneData.rotation + boneData.shearX; + + a = MathUtils.CosDeg(rotationX) * boneData.scaleX; + c = MathUtils.SinDeg(rotationX) * boneData.scaleX; + b = MathUtils.CosDeg(rotationY) * boneData.scaleY; + d = MathUtils.SinDeg(rotationY) * boneData.scaleY; + x = boneData.x; + y = boneData.y; + } + + /// Constructor for a local bone matrix based on a bone instance's current pose. + public BoneMatrix (Bone bone) { + float rotationY = bone.rotation + 90 + bone.shearY; + float rotationX = bone.rotation + bone.shearX; + + a = MathUtils.CosDeg(rotationX) * bone.scaleX; + c = MathUtils.SinDeg(rotationX) * bone.scaleX; + b = MathUtils.CosDeg(rotationY) * bone.scaleY; + d = MathUtils.SinDeg(rotationY) * bone.scaleY; + x = bone.x; + y = bone.y; + } + + public BoneMatrix TransformMatrix (BoneMatrix local) { + return new BoneMatrix { + a = this.a * local.a + this.b * local.c, + b = this.a * local.b + this.b * local.d, + c = this.c * local.a + this.d * local.c, + d = this.c * local.b + this.d * local.d, + x = this.a * local.x + this.b * local.y + this.x, + y = this.c * local.x + this.d * local.y + this.y + }; + } + } + + public static class SkeletonExtensions { + public static bool IsWeighted (this VertexAttachment va) { + return va.bones != null && va.bones.Length > 0; + } + + public static bool IsRenderable (this Attachment a) { + return a is IHasRendererObject; + } + + #region Transform Modes + public static bool InheritsRotation (this TransformMode mode) { + const int RotationBit = 0; + return ((int)mode & (1U << RotationBit)) == 0; + } + + public static bool InheritsScale (this TransformMode mode) { + const int ScaleBit = 1; + return ((int)mode & (1U << ScaleBit)) == 0; + } + #endregion + + #region Posing + internal static void SetPropertyToSetupPose (this Skeleton skeleton, int propertyID) { + int tt = propertyID >> 24; + var timelineType = (TimelineType)tt; + int i = propertyID - (tt << 24); + + Bone bone; + IkConstraint ikc; + PathConstraint pc; + + switch (timelineType) { + // Bone + case TimelineType.Rotate: + bone = skeleton.bones.Items[i]; + bone.rotation = bone.data.rotation; + break; + case TimelineType.Translate: + bone = skeleton.bones.Items[i]; + bone.x = bone.data.x; + bone.y = bone.data.y; + break; + case TimelineType.Scale: + bone = skeleton.bones.Items[i]; + bone.scaleX = bone.data.scaleX; + bone.scaleY = bone.data.scaleY; + break; + case TimelineType.Shear: + bone = skeleton.bones.Items[i]; + bone.shearX = bone.data.shearX; + bone.shearY = bone.data.shearY; + break; + + // Slot + case TimelineType.Attachment: + skeleton.SetSlotAttachmentToSetupPose(i); + break; + case TimelineType.Color: + skeleton.slots.Items[i].SetColorToSetupPose(); + break; + case TimelineType.TwoColor: + skeleton.slots.Items[i].SetColorToSetupPose(); + break; + case TimelineType.Deform: + skeleton.slots.Items[i].attachmentVertices.Clear(); + break; + + // Skeleton + case TimelineType.DrawOrder: + skeleton.SetDrawOrderToSetupPose(); + break; + + // IK Constraint + case TimelineType.IkConstraint: + ikc = skeleton.ikConstraints.Items[i]; + ikc.mix = ikc.data.mix; + ikc.bendDirection = ikc.data.bendDirection; + break; + + // TransformConstraint + case TimelineType.TransformConstraint: + var tc = skeleton.transformConstraints.Items[i]; + var tcData = tc.data; + tc.rotateMix = tcData.rotateMix; + tc.translateMix = tcData.translateMix; + tc.scaleMix = tcData.scaleMix; + tc.shearMix = tcData.shearMix; + break; + + // Path Constraint + case TimelineType.PathConstraintPosition: + pc = skeleton.pathConstraints.Items[i]; + pc.position = pc.data.position; + break; + case TimelineType.PathConstraintSpacing: + pc = skeleton.pathConstraints.Items[i]; + pc.spacing = pc.data.spacing; + break; + case TimelineType.PathConstraintMix: + pc = skeleton.pathConstraints.Items[i]; + pc.rotateMix = pc.data.rotateMix; + pc.translateMix = pc.data.translateMix; + break; + } + } + + /// Resets the DrawOrder to the Setup Pose's draw order + public static void SetDrawOrderToSetupPose (this Skeleton skeleton) { + var slotsItems = skeleton.slots.Items; + int n = skeleton.slots.Count; + + var drawOrder = skeleton.drawOrder; + drawOrder.Clear(false); + drawOrder.GrowIfNeeded(n); + System.Array.Copy(slotsItems, drawOrder.Items, n); + } + + /// Resets the color of a slot to Setup Pose value. + public static void SetColorToSetupPose (this Slot slot) { + slot.r = slot.data.r; + slot.g = slot.data.g; + slot.b = slot.data.b; + slot.a = slot.data.a; + slot.r2 = slot.data.r2; + slot.g2 = slot.data.g2; + slot.b2 = slot.data.b2; + } + + /// Sets a slot's attachment to setup pose. If you have the slotIndex, Skeleton.SetSlotAttachmentToSetupPose is faster. + public static void SetAttachmentToSetupPose (this Slot slot) { + var slotData = slot.data; + slot.Attachment = slot.bone.skeleton.GetAttachment(slotData.name, slotData.attachmentName); + } + + /// Resets the attachment of slot at a given slotIndex to setup pose. This is faster than Slot.SetAttachmentToSetupPose. + public static void SetSlotAttachmentToSetupPose (this Skeleton skeleton, int slotIndex) { + var slot = skeleton.slots.Items[slotIndex]; + var attachmentName = slot.data.attachmentName; + if (string.IsNullOrEmpty(attachmentName)) { + slot.Attachment = null; + } else { + var attachment = skeleton.GetAttachment(slotIndex, attachmentName); + slot.Attachment = attachment; + } + } + + /// + /// Shortcut for posing a skeleton at a specific time. Time is in seconds. (frameNumber / 30f) will give you seconds. + /// If you need to do this often, you should get the Animation object yourself using skeleton.data.FindAnimation. and call Apply on that. + /// The skeleton to pose. + /// The name of the animation to use. + /// The time of the pose within the animation. + /// Wraps the time around if it is longer than the duration of the animation. + public static void PoseWithAnimation (this Skeleton skeleton, string animationName, float time, bool loop = false) { + // Fail loud when skeleton.data is null. + Spine.Animation animation = skeleton.data.FindAnimation(animationName); + if (animation == null) return; + animation.Apply(skeleton, 0, time, loop, null, 1f, MixPose.Setup, MixDirection.In); + } + + /// Pose a skeleton according to a given time in an animation. + public static void PoseSkeleton (this Animation animation, Skeleton skeleton, float time, bool loop = false) { + animation.Apply(skeleton, 0, time, loop, null, 1f, MixPose.Setup, MixDirection.In); + } + + /// Resets Skeleton parts to Setup Pose according to a Spine.Animation's keyed items. + public static void SetKeyedItemsToSetupPose (this Animation animation, Skeleton skeleton) { + animation.Apply(skeleton, 0, 0, false, null, 0, MixPose.Setup, MixDirection.Out); + } + + + #endregion + + #region Skins + /// + public static void FindNamesForSlot (this Skin skin, string slotName, SkeletonData skeletonData, List results) { + int slotIndex = skeletonData.FindSlotIndex(slotName); + skin.FindNamesForSlot(slotIndex, results); + } + + /// + public static void FindAttachmentsForSlot (this Skin skin, string slotName, SkeletonData skeletonData, List results) { + int slotIndex = skeletonData.FindSlotIndex(slotName); + skin.FindAttachmentsForSlot(slotIndex, results); + } + #endregion + } +} diff --git a/Assets/Spine/Assets/spine-unity/SkeletonExtensions.cs.meta b/Assets/Spine/Assets/spine-unity/SkeletonExtensions.cs.meta new file mode 100644 index 0000000..427cdd1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonExtensions.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea85c8f6a91a6ab45881b0dbdaabb7d0 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility.meta b/Assets/Spine/Assets/spine-unity/SkeletonUtility.meta new file mode 100644 index 0000000..d690c94 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: f6e0caaafe294de48af468a6a9321473 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor.meta b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor.meta new file mode 100644 index 0000000..386e1e9 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: a751a9d1e3e26d64d997b66a781df8e9 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs new file mode 100644 index 0000000..de58f12 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs @@ -0,0 +1,388 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +//#define HINGECHAIN2D +// Contributed by: Mitch Thompson + + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using Spine; + +namespace Spine.Unity.Editor { + using Icons = SpineEditorUtilities.Icons; + + [CustomEditor(typeof(SkeletonUtilityBone)), CanEditMultipleObjects] + public class SkeletonUtilityBoneInspector : UnityEditor.Editor { + SerializedProperty mode, boneName, zPosition, position, rotation, scale, overrideAlpha, parentReference; + + //multi selected flags + bool containsFollows, containsOverrides, multiObject; + + //single selected helpers + SkeletonUtilityBone utilityBone; + SkeletonUtility skeletonUtility; + bool canCreateHingeChain = false; + + Dictionary> boundingBoxTable = new Dictionary>(); + //string currentSkinName = ""; + + void OnEnable () { + mode = this.serializedObject.FindProperty("mode"); + boneName = this.serializedObject.FindProperty("boneName"); + zPosition = this.serializedObject.FindProperty("zPosition"); + position = this.serializedObject.FindProperty("position"); + rotation = this.serializedObject.FindProperty("rotation"); + scale = this.serializedObject.FindProperty("scale"); + overrideAlpha = this.serializedObject.FindProperty("overrideAlpha"); + parentReference = this.serializedObject.FindProperty("parentReference"); + EvaluateFlags(); + + if (!utilityBone.valid && skeletonUtility != null && skeletonUtility.skeletonRenderer != null) + skeletonUtility.skeletonRenderer.Initialize(false); + + canCreateHingeChain = CanCreateHingeChain(); + boundingBoxTable.Clear(); + + if (multiObject) return; + if (utilityBone.bone == null) return; + + var skeleton = utilityBone.bone.Skeleton; + int slotCount = skeleton.Slots.Count; + Skin skin = skeleton.Skin; + if (skeleton.Skin == null) + skin = skeleton.Data.DefaultSkin; + + //currentSkinName = skin.Name; + for(int i = 0; i < slotCount; i++){ + Slot slot = skeletonUtility.skeletonRenderer.skeleton.Slots.Items[i]; + if (slot.Bone == utilityBone.bone) { + var slotAttachments = new List(); + skin.FindAttachmentsForSlot(skeleton.FindSlotIndex(slot.Data.Name), slotAttachments); + var boundingBoxes = new List(); + foreach (var att in slotAttachments) { + var boundingBoxAttachment = att as BoundingBoxAttachment; + if (boundingBoxAttachment != null) + boundingBoxes.Add(boundingBoxAttachment); + } + + if (boundingBoxes.Count > 0) + boundingBoxTable.Add(slot, boundingBoxes); + } + } + + } + + void EvaluateFlags () { + utilityBone = (SkeletonUtilityBone)target; + skeletonUtility = utilityBone.skeletonUtility; + + if (Selection.objects.Length == 1) { + containsFollows = utilityBone.mode == SkeletonUtilityBone.Mode.Follow; + containsOverrides = utilityBone.mode == SkeletonUtilityBone.Mode.Override; + } else { + int boneCount = 0; + foreach (Object o in Selection.objects) { + var go = o as GameObject; + if (go != null) { + SkeletonUtilityBone sub = go.GetComponent(); + if (sub != null) { + boneCount++; + containsFollows |= (sub.mode == SkeletonUtilityBone.Mode.Follow); + containsOverrides |= (sub.mode == SkeletonUtilityBone.Mode.Override); + } + } + } + + multiObject |= (boneCount > 1); + } + } + + public override void OnInspectorGUI () { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(mode); + if (EditorGUI.EndChangeCheck()) { + containsOverrides = mode.enumValueIndex == 1; + containsFollows = mode.enumValueIndex == 0; + } + + using (new EditorGUI.DisabledGroupScope(multiObject)) { + string str = boneName.stringValue; + if (str == "") + str = ""; + if (multiObject) + str = ""; + + using (new GUILayout.HorizontalScope()) { + EditorGUILayout.PrefixLabel("Bone"); + if (GUILayout.Button(str, EditorStyles.popup)) { + BoneSelectorContextMenu(str, ((SkeletonUtilityBone)target).skeletonUtility.skeletonRenderer.skeleton.Bones, "", TargetBoneSelected); + } + } + } + + EditorGUILayout.PropertyField(zPosition); + EditorGUILayout.PropertyField(position); + EditorGUILayout.PropertyField(rotation); + EditorGUILayout.PropertyField(scale); + + using (new EditorGUI.DisabledGroupScope(containsFollows)) { + EditorGUILayout.PropertyField(overrideAlpha); + EditorGUILayout.PropertyField(parentReference); + } + + EditorGUILayout.Space(); + + using (new GUILayout.HorizontalScope()) { + EditorGUILayout.Space(); + using (new EditorGUI.DisabledGroupScope(multiObject || !utilityBone.valid || utilityBone.bone == null || utilityBone.bone.Children.Count == 0)) { + if (GUILayout.Button(SpineInspectorUtility.TempContent("Add Child", Icons.bone), GUILayout.MinWidth(120), GUILayout.Height(24))) + BoneSelectorContextMenu("", utilityBone.bone.Children, "", SpawnChildBoneSelected); + } + using (new EditorGUI.DisabledGroupScope(multiObject || !utilityBone.valid || utilityBone.bone == null || containsOverrides)) { + if (GUILayout.Button(SpineInspectorUtility.TempContent("Add Override", Icons.poseBones), GUILayout.MinWidth(120), GUILayout.Height(24))) + SpawnOverride(); + } + EditorGUILayout.Space(); + } + EditorGUILayout.Space(); + using (new GUILayout.HorizontalScope()) { + EditorGUILayout.Space(); + using (new EditorGUI.DisabledGroupScope(multiObject || !utilityBone.valid || !canCreateHingeChain)) { + if (GUILayout.Button(SpineInspectorUtility.TempContent("Create Hinge Chain", Icons.hingeChain), GUILayout.Width(150), GUILayout.Height(24))) + CreateHingeChain(); + } + EditorGUILayout.Space(); + } + + using (new EditorGUI.DisabledGroupScope(multiObject || boundingBoxTable.Count == 0)) { + EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Bounding Boxes", Icons.boundingBox), EditorStyles.boldLabel); + + foreach (var entry in boundingBoxTable){ + Slot slot = entry.Key; + var boundingBoxes = entry.Value; + + EditorGUI.indentLevel++; + EditorGUILayout.LabelField(slot.Data.Name); + EditorGUI.indentLevel++; + { + foreach (var box in boundingBoxes) { + using (new GUILayout.HorizontalScope()) { + GUILayout.Space(30); + string buttonLabel = box.IsWeighted() ? box.Name + " (!)" : box.Name; + if (GUILayout.Button(buttonLabel, GUILayout.Width(200))) { + utilityBone.bone.Skeleton.UpdateWorldTransform(); + var bbTransform = utilityBone.transform.Find("[BoundingBox]" + box.Name); // Use FindChild in older versions of Unity. + if (bbTransform != null) { + var originalCollider = bbTransform.GetComponent(); + if (originalCollider != null) + SkeletonUtility.SetColliderPointsLocal(originalCollider, slot, box); + else + SkeletonUtility.AddBoundingBoxAsComponent(box, slot, bbTransform.gameObject); + } else { + var newPolygonCollider = SkeletonUtility.AddBoundingBoxGameObject(null, box, slot, utilityBone.transform); + bbTransform = newPolygonCollider.transform; + } + EditorGUIUtility.PingObject(bbTransform); + } + } + + } + } + EditorGUI.indentLevel--; + EditorGUI.indentLevel--; + } + } + + BoneFollowerInspector.RecommendRigidbodyButton(utilityBone); + + serializedObject.ApplyModifiedProperties(); + } + + static void BoneSelectorContextMenu (string current, ExposedList bones, string topValue, GenericMenu.MenuFunction2 callback) { + var menu = new GenericMenu(); + + if (topValue != "") + menu.AddItem(new GUIContent(topValue), current == topValue, callback, null); + + for (int i = 0; i < bones.Count; i++) + menu.AddItem(new GUIContent(bones.Items[i].Data.Name), bones.Items[i].Data.Name == current, callback, bones.Items[i]); + + menu.ShowAsContext(); + } + + void TargetBoneSelected (object obj) { + if (obj == null) { + boneName.stringValue = ""; + serializedObject.ApplyModifiedProperties(); + } else { + var bone = (Bone)obj; + boneName.stringValue = bone.Data.Name; + serializedObject.ApplyModifiedProperties(); + utilityBone.Reset(); + } + } + + void SpawnChildBoneSelected (object obj) { + if (obj == null) { + // Add recursively + foreach (var bone in utilityBone.bone.Children) { + GameObject go = skeletonUtility.SpawnBoneRecursively(bone, utilityBone.transform, utilityBone.mode, utilityBone.position, utilityBone.rotation, utilityBone.scale); + SkeletonUtilityBone[] newUtilityBones = go.GetComponentsInChildren(); + foreach (SkeletonUtilityBone utilBone in newUtilityBones) + SkeletonUtilityInspector.AttachIcon(utilBone); + } + } else { + var bone = (Bone)obj; + GameObject go = skeletonUtility.SpawnBone(bone, utilityBone.transform, utilityBone.mode, utilityBone.position, utilityBone.rotation, utilityBone.scale); + SkeletonUtilityInspector.AttachIcon(go.GetComponent()); + Selection.activeGameObject = go; + EditorGUIUtility.PingObject(go); + } + } + + void SpawnOverride () { + GameObject go = skeletonUtility.SpawnBone(utilityBone.bone, utilityBone.transform.parent, SkeletonUtilityBone.Mode.Override, utilityBone.position, utilityBone.rotation, utilityBone.scale); + go.name = go.name + " [Override]"; + SkeletonUtilityInspector.AttachIcon(go.GetComponent()); + Selection.activeGameObject = go; + EditorGUIUtility.PingObject(go); + } + + +#if HINGECHAIN2D + bool CanCreateHingeChain () { + if (utilityBone == null) return false; + if (utilityBone.GetComponent() != null) return false; + if (utilityBone.bone != null && utilityBone.bone.Children.Count == 0) return false; + var rigidbodies = utilityBone.GetComponentsInChildren(); + return rigidbodies.Length <= 0; + } + + void CreateHingeChain () { + var utilBoneArr = utilityBone.GetComponentsInChildren(); + + foreach (var utilBone in utilBoneArr) { + if (utilBone.GetComponent() == null) { + if (utilBone.bone.Data.Length == 0) { + var sphere = utilBone.gameObject.AddComponent(); + sphere.radius = 0.1f; + } else { + float length = utilBone.bone.Data.Length; + var box = utilBone.gameObject.AddComponent(); + box.size = new Vector3(length, length / 3f, 0.2f); + box.offset = new Vector3(length / 2f, 0, 0); + } + } + + utilBone.gameObject.AddComponent(); + } + + utilityBone.GetComponent().isKinematic = true; + + foreach (var utilBone in utilBoneArr) { + if (utilBone == utilityBone) + continue; + + utilBone.mode = SkeletonUtilityBone.Mode.Override; + + var joint = utilBone.gameObject.AddComponent(); + joint.connectedBody = utilBone.transform.parent.GetComponent(); + joint.useLimits = true; + joint.limits = new JointAngleLimits2D { + min = -20, + max = 20 + }; + utilBone.GetComponent().mass = utilBone.transform.parent.GetComponent().mass * 0.75f; + } + } +#else + bool CanCreateHingeChain () { + if (utilityBone == null) + return false; + if (utilityBone.GetComponent() != null) + return false; + if (utilityBone.bone != null && utilityBone.bone.Children.Count == 0) + return false; + + var rigidbodies = utilityBone.GetComponentsInChildren(); + + return rigidbodies.Length <= 0; + } + + void CreateHingeChain () { + var utilBoneArr = utilityBone.GetComponentsInChildren(); + + foreach (var utilBone in utilBoneArr) { + AttachRigidbody(utilBone); + } + + utilityBone.GetComponent().isKinematic = true; + + foreach (var utilBone in utilBoneArr) { + if (utilBone == utilityBone) + continue; + + utilBone.mode = SkeletonUtilityBone.Mode.Override; + + HingeJoint joint = utilBone.gameObject.AddComponent(); + joint.axis = Vector3.forward; + joint.connectedBody = utilBone.transform.parent.GetComponent(); + joint.useLimits = true; + joint.limits = new JointLimits { + min = -20, + max = 20 + }; + utilBone.GetComponent().mass = utilBone.transform.parent.GetComponent().mass * 0.75f; + } + } + + static void AttachRigidbody (SkeletonUtilityBone utilBone) { + if (utilBone.GetComponent() == null) { + if (utilBone.bone.Data.Length == 0) { + SphereCollider sphere = utilBone.gameObject.AddComponent(); + sphere.radius = 0.1f; + } else { + float length = utilBone.bone.Data.Length; + BoxCollider box = utilBone.gameObject.AddComponent(); + box.size = new Vector3(length, length / 3f, 0.2f); + box.center = new Vector3(length / 2f, 0, 0); + } + } + + utilBone.gameObject.AddComponent(); + } +#endif + } + +} diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta new file mode 100644 index 0000000..81de4d6 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityBoneInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b3ae20b4bcc31f645afd6f5b64f82473 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs new file mode 100644 index 0000000..218c753 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs @@ -0,0 +1,154 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using UnityEditor; +using UnityEditor.AnimatedValues; +using System.Collections.Generic; +using Spine; +using System.Reflection; + +namespace Spine.Unity.Editor { + using Icons = SpineEditorUtilities.Icons; + + [CustomEditor(typeof(SkeletonUtility))] + public class SkeletonUtilityInspector : UnityEditor.Editor { + + SkeletonUtility skeletonUtility; + Skeleton skeleton; + SkeletonRenderer skeletonRenderer; + bool isPrefab; + + GUIContent SpawnHierarchyButtonLabel = new GUIContent("Spawn Hierarchy", Icons.skeleton); + + void OnEnable () { + skeletonUtility = (SkeletonUtility)target; + skeletonRenderer = skeletonUtility.GetComponent(); + skeleton = skeletonRenderer.Skeleton; + + if (skeleton == null) { + skeletonRenderer.Initialize(false); + skeletonRenderer.LateUpdate(); + skeleton = skeletonRenderer.skeleton; + } + + if (!skeletonRenderer.valid) return; + + isPrefab |= PrefabUtility.GetPrefabType(this.target) == PrefabType.Prefab; + } + + public override void OnInspectorGUI () { + if (isPrefab) { + GUILayout.Label(new GUIContent("Cannot edit Prefabs", Icons.warning)); + return; + } + + if (!skeletonRenderer.valid) { + GUILayout.Label(new GUIContent("Spine Component invalid. Check Skeleton Data Asset.", Icons.warning)); + return; + } + + skeletonUtility.boneRoot = (Transform)EditorGUILayout.ObjectField("Bone Root", skeletonUtility.boneRoot, typeof(Transform), true); + + bool hasRootBone = skeletonUtility.boneRoot != null; + using (new EditorGUI.DisabledGroupScope(hasRootBone)) { + if (SpineInspectorUtility.LargeCenteredButton(SpawnHierarchyButtonLabel)) + SpawnHierarchyContextMenu(); + } + + if (hasRootBone) { + if (SpineInspectorUtility.CenteredButton(new GUIContent("Remove Hierarchy"))) { + Undo.RegisterCompleteObjectUndo(skeletonUtility, "Remove Hierarchy"); + Undo.DestroyObjectImmediate(skeletonUtility.boneRoot.gameObject); + skeletonUtility.boneRoot = null; + } + } + } + + void SpawnHierarchyContextMenu () { + GenericMenu menu = new GenericMenu(); + + menu.AddItem(new GUIContent("Follow"), false, SpawnFollowHierarchy); + menu.AddItem(new GUIContent("Follow (Root Only)"), false, SpawnFollowHierarchyRootOnly); + menu.AddSeparator(""); + menu.AddItem(new GUIContent("Override"), false, SpawnOverrideHierarchy); + menu.AddItem(new GUIContent("Override (Root Only)"), false, SpawnOverrideHierarchyRootOnly); + + menu.ShowAsContext(); + } + + public static void AttachIcon (SkeletonUtilityBone utilityBone) { + Skeleton skeleton = utilityBone.skeletonUtility.skeletonRenderer.skeleton; + Texture2D icon = utilityBone.bone.Data.Length == 0 ? Icons.nullBone : Icons.boneNib; + + foreach (IkConstraint c in skeleton.IkConstraints) + if (c.Target == utilityBone.bone) { + icon = Icons.constraintNib; + break; + } + + typeof(EditorGUIUtility).InvokeMember("SetIconForObject", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic, null, null, new object[2] { + utilityBone.gameObject, + icon + }); + } + + static void AttachIconsToChildren (Transform root) { + if (root != null) { + var utilityBones = root.GetComponentsInChildren(); + foreach (var utilBone in utilityBones) + AttachIcon(utilBone); + } + } + + void SpawnFollowHierarchy () { + Selection.activeGameObject = skeletonUtility.SpawnHierarchy(SkeletonUtilityBone.Mode.Follow, true, true, true); + AttachIconsToChildren(skeletonUtility.boneRoot); + } + + void SpawnFollowHierarchyRootOnly () { + Selection.activeGameObject = skeletonUtility.SpawnRoot(SkeletonUtilityBone.Mode.Follow, true, true, true); + AttachIconsToChildren(skeletonUtility.boneRoot); + } + + void SpawnOverrideHierarchy () { + Selection.activeGameObject = skeletonUtility.SpawnHierarchy(SkeletonUtilityBone.Mode.Override, true, true, true); + AttachIconsToChildren(skeletonUtility.boneRoot); + } + + void SpawnOverrideHierarchyRootOnly () { + Selection.activeGameObject = skeletonUtility.SpawnRoot(SkeletonUtilityBone.Mode.Override, true, true, true); + AttachIconsToChildren(skeletonUtility.boneRoot); + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta new file mode 100644 index 0000000..44e13b1 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a5b90df955eb8c2429ac67c8b2de6c5c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs new file mode 100644 index 0000000..8280a05 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs @@ -0,0 +1,366 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using System.Collections.Generic; +using Spine; + +namespace Spine.Unity { + [RequireComponent(typeof(ISkeletonAnimation))] + [ExecuteInEditMode] + public class SkeletonUtility : MonoBehaviour { + + #region BoundingBoxAttachment + public static PolygonCollider2D AddBoundingBoxGameObject (Skeleton skeleton, string skinName, string slotName, string attachmentName, Transform parent, bool isTrigger = true) { + Skin skin = string.IsNullOrEmpty(skinName) ? skeleton.data.defaultSkin : skeleton.data.FindSkin(skinName); + if (skin == null) { + Debug.LogError("Skin " + skinName + " not found!"); + return null; + } + + var attachment = skin.GetAttachment(skeleton.FindSlotIndex(slotName), attachmentName); + if (attachment == null) { + Debug.LogFormat("Attachment in slot '{0}' named '{1}' not found in skin '{2}'.", slotName, attachmentName, skin.name); + return null; + } + + var box = attachment as BoundingBoxAttachment; + if (box != null) { + var slot = skeleton.FindSlot(slotName); + return AddBoundingBoxGameObject(box.Name, box, slot, parent, isTrigger); + } else { + Debug.LogFormat("Attachment '{0}' was not a Bounding Box.", attachmentName); + return null; + } + } + + public static PolygonCollider2D AddBoundingBoxGameObject (string name, BoundingBoxAttachment box, Slot slot, Transform parent, bool isTrigger = true) { + var go = new GameObject("[BoundingBox]" + (string.IsNullOrEmpty(name) ? box.Name : name)); + var got = go.transform; + got.parent = parent; + got.localPosition = Vector3.zero; + got.localRotation = Quaternion.identity; + got.localScale = Vector3.one; + return AddBoundingBoxAsComponent(box, slot, go, isTrigger); + } + + public static PolygonCollider2D AddBoundingBoxAsComponent (BoundingBoxAttachment box, Slot slot, GameObject gameObject, bool isTrigger = true, bool isKinematic = true, float gravityScale = 0f) { + if (box == null) return null; + + if (slot.bone != slot.Skeleton.RootBone) { + var rb = gameObject.GetComponent(); + if (rb == null) { + rb = gameObject.AddComponent(); + rb.isKinematic = isKinematic; + rb.gravityScale = gravityScale; + } + } + + var collider = gameObject.AddComponent(); + collider.isTrigger = isTrigger; + SetColliderPointsLocal(collider, slot, box); + return collider; + } + + public static void SetColliderPointsLocal (PolygonCollider2D collider, Slot slot, BoundingBoxAttachment box) { + if (box == null) return; + if (box.IsWeighted()) Debug.LogWarning("UnityEngine.PolygonCollider2D does not support weighted or animated points. Collider points will not be animated and may have incorrect orientation. If you want to use it as a collider, please remove weights and animations from the bounding box in Spine editor."); + var verts = box.GetLocalVertices(slot, null); + collider.SetPath(0, verts); + } + + public static Bounds GetBoundingBoxBounds (BoundingBoxAttachment boundingBox, float depth = 0) { + float[] floats = boundingBox.Vertices; + int floatCount = floats.Length; + + Bounds bounds = new Bounds(); + bounds.center = new Vector3(floats[0], floats[1], 0); + for (int i = 2; i < floatCount; i += 2) + bounds.Encapsulate(new Vector3(floats[i], floats[i + 1], 0)); + + Vector3 size = bounds.size; + size.z = depth; + bounds.size = size; + + return bounds; + } + #endregion + + public delegate void SkeletonUtilityDelegate (); + public event SkeletonUtilityDelegate OnReset; + public Transform boneRoot; + + void Update () { + var skeleton = skeletonRenderer.skeleton; + if (boneRoot != null && skeleton != null) { + Vector3 flipScale = Vector3.one; + if (skeleton.FlipX) + flipScale.x = -1; + + if (skeleton.FlipY) + flipScale.y = -1; + + boneRoot.localScale = flipScale; + } + } + + [HideInInspector] + public SkeletonRenderer skeletonRenderer; + [HideInInspector] + public ISkeletonAnimation skeletonAnimation; + [System.NonSerialized] + public List utilityBones = new List(); + [System.NonSerialized] + public List utilityConstraints = new List(); + + protected bool hasTransformBones; + protected bool hasUtilityConstraints; + protected bool needToReprocessBones; + + void OnEnable () { + if (skeletonRenderer == null) { + skeletonRenderer = GetComponent(); + } + + if (skeletonAnimation == null) { + skeletonAnimation = GetComponent(); + if (skeletonAnimation == null) + skeletonAnimation = GetComponent(); + } + + skeletonRenderer.OnRebuild -= HandleRendererReset; + skeletonRenderer.OnRebuild += HandleRendererReset; + + if (skeletonAnimation != null) { + skeletonAnimation.UpdateLocal -= UpdateLocal; + skeletonAnimation.UpdateLocal += UpdateLocal; + } + + CollectBones(); + } + + void Start () { + //recollect because order of operations failure when switching between game mode and edit mode... + CollectBones(); + } + + void OnDisable () { + skeletonRenderer.OnRebuild -= HandleRendererReset; + + if (skeletonAnimation != null) { + skeletonAnimation.UpdateLocal -= UpdateLocal; + skeletonAnimation.UpdateWorld -= UpdateWorld; + skeletonAnimation.UpdateComplete -= UpdateComplete; + } + } + + void HandleRendererReset (SkeletonRenderer r) { + if (OnReset != null) + OnReset(); + + CollectBones(); + } + + public void RegisterBone (SkeletonUtilityBone bone) { + if (utilityBones.Contains(bone)) + return; + else { + utilityBones.Add(bone); + needToReprocessBones = true; + } + } + + public void UnregisterBone (SkeletonUtilityBone bone) { + utilityBones.Remove(bone); + } + + public void RegisterConstraint (SkeletonUtilityConstraint constraint) { + if (utilityConstraints.Contains(constraint)) + return; + else { + utilityConstraints.Add(constraint); + needToReprocessBones = true; + } + } + + public void UnregisterConstraint (SkeletonUtilityConstraint constraint) { + utilityConstraints.Remove(constraint); + } + + public void CollectBones () { + var skeleton = skeletonRenderer.skeleton; + if (skeleton == null) return; + + if (boneRoot != null) { + var constraintTargets = new List(); + var ikConstraints = skeleton.IkConstraints; + for (int i = 0, n = ikConstraints.Count; i < n; i++) + constraintTargets.Add(ikConstraints.Items[i].target); + + var transformConstraints = skeleton.TransformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) + constraintTargets.Add(transformConstraints.Items[i].target); + + var utilityBones = this.utilityBones; + for (int i = 0, n = utilityBones.Count; i < n; i++) { + var b = utilityBones[i]; + if (b.bone == null) continue; + hasTransformBones |= (b.mode == SkeletonUtilityBone.Mode.Override); + hasUtilityConstraints |= constraintTargets.Contains(b.bone); + } + + hasUtilityConstraints |= utilityConstraints.Count > 0; + + if (skeletonAnimation != null) { + skeletonAnimation.UpdateWorld -= UpdateWorld; + skeletonAnimation.UpdateComplete -= UpdateComplete; + + if (hasTransformBones || hasUtilityConstraints) + skeletonAnimation.UpdateWorld += UpdateWorld; + + if (hasUtilityConstraints) + skeletonAnimation.UpdateComplete += UpdateComplete; + } + + needToReprocessBones = false; + } else { + utilityBones.Clear(); + utilityConstraints.Clear(); + } + } + + void UpdateLocal (ISkeletonAnimation anim) { + if (needToReprocessBones) + CollectBones(); + + var utilityBones = this.utilityBones; + if (utilityBones == null) return; + for (int i = 0, n = utilityBones.Count; i < n; i++) + utilityBones[i].transformLerpComplete = false; + + UpdateAllBones(SkeletonUtilityBone.UpdatePhase.Local); + } + + void UpdateWorld (ISkeletonAnimation anim) { + UpdateAllBones(SkeletonUtilityBone.UpdatePhase.World); + for (int i = 0, n = utilityConstraints.Count; i < n; i++) + utilityConstraints[i].DoUpdate(); + } + + void UpdateComplete (ISkeletonAnimation anim) { + UpdateAllBones(SkeletonUtilityBone.UpdatePhase.Complete); + } + + void UpdateAllBones (SkeletonUtilityBone.UpdatePhase phase) { + if (boneRoot == null) + CollectBones(); + + var utilityBones = this.utilityBones; + if (utilityBones == null) return; + for (int i = 0, n = utilityBones.Count; i < n; i++) + utilityBones[i].DoUpdate(phase); + } + + public Transform GetBoneRoot () { + if (boneRoot != null) + return boneRoot; + + boneRoot = new GameObject("SkeletonUtility-Root").transform; + boneRoot.parent = transform; + boneRoot.localPosition = Vector3.zero; + boneRoot.localRotation = Quaternion.identity; + boneRoot.localScale = Vector3.one; + + return boneRoot; + } + + public GameObject SpawnRoot (SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca) { + GetBoneRoot(); + Skeleton skeleton = this.skeletonRenderer.skeleton; + + GameObject go = SpawnBone(skeleton.RootBone, boneRoot, mode, pos, rot, sca); + CollectBones(); + return go; + } + + public GameObject SpawnHierarchy (SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca) { + GetBoneRoot(); + Skeleton skeleton = this.skeletonRenderer.skeleton; + GameObject go = SpawnBoneRecursively(skeleton.RootBone, boneRoot, mode, pos, rot, sca); + CollectBones(); + return go; + } + + public GameObject SpawnBoneRecursively (Bone bone, Transform parent, SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca) { + GameObject go = SpawnBone(bone, parent, mode, pos, rot, sca); + + ExposedList childrenBones = bone.Children; + for (int i = 0, n = childrenBones.Count; i < n; i++) { + Bone child = childrenBones.Items[i]; + SpawnBoneRecursively(child, go.transform, mode, pos, rot, sca); + } + + return go; + } + + public GameObject SpawnBone (Bone bone, Transform parent, SkeletonUtilityBone.Mode mode, bool pos, bool rot, bool sca) { + GameObject go = new GameObject(bone.Data.Name); + go.transform.parent = parent; + + SkeletonUtilityBone b = go.AddComponent(); + b.skeletonUtility = this; + b.position = pos; + b.rotation = rot; + b.scale = sca; + b.mode = mode; + b.zPosition = true; + b.Reset(); + b.bone = bone; + b.boneName = bone.Data.Name; + b.valid = true; + + if (mode == SkeletonUtilityBone.Mode.Override) { + if (rot) + go.transform.localRotation = Quaternion.Euler(0, 0, b.bone.AppliedRotation); + + if (pos) + go.transform.localPosition = new Vector3(b.bone.X, b.bone.Y, 0); + + go.transform.localScale = new Vector3(b.bone.scaleX, b.bone.scaleY, 0); + } + + return go; + } + + } + +} diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs.meta b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs.meta new file mode 100644 index 0000000..29f2fd7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtility.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7f726fb798ad621458c431cb9966d91d +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs new file mode 100644 index 0000000..42cee5b --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs @@ -0,0 +1,235 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using Spine; + +namespace Spine.Unity { + /// Sets a GameObject's transform to match a bone on a Spine skeleton. + [ExecuteInEditMode] + [AddComponentMenu("Spine/SkeletonUtilityBone")] + public class SkeletonUtilityBone : MonoBehaviour { + public enum Mode { + Follow, + Override + } + + public enum UpdatePhase { + Local, + World, + Complete + } + + #region Inspector + /// If a bone isn't set, boneName is used to find the bone. + public string boneName; + public Transform parentReference; + public Mode mode; + public bool position, rotation, scale, zPosition = true; + [Range(0f, 1f)] + public float overrideAlpha = 1; + #endregion + + [System.NonSerialized] public SkeletonUtility skeletonUtility; + [System.NonSerialized] public Bone bone; + [System.NonSerialized] public bool transformLerpComplete; + [System.NonSerialized] public bool valid; + Transform cachedTransform; + Transform skeletonTransform; + bool incompatibleTransformMode; + public bool IncompatibleTransformMode { get { return incompatibleTransformMode; } } + + public void Reset () { + bone = null; + cachedTransform = transform; + valid = skeletonUtility != null && skeletonUtility.skeletonRenderer != null && skeletonUtility.skeletonRenderer.valid; + if (!valid) + return; + skeletonTransform = skeletonUtility.transform; + skeletonUtility.OnReset -= HandleOnReset; + skeletonUtility.OnReset += HandleOnReset; + DoUpdate(UpdatePhase.Local); + } + + void OnEnable () { + skeletonUtility = transform.GetComponentInParent(); + + if (skeletonUtility == null) + return; + + skeletonUtility.RegisterBone(this); + skeletonUtility.OnReset += HandleOnReset; + } + + void HandleOnReset () { + Reset(); + } + + void OnDisable () { + if (skeletonUtility != null) { + skeletonUtility.OnReset -= HandleOnReset; + skeletonUtility.UnregisterBone(this); + } + } + + public void DoUpdate (UpdatePhase phase) { + if (!valid) { + Reset(); + return; + } + + var skeleton = skeletonUtility.skeletonRenderer.skeleton; + + if (bone == null) { + if (string.IsNullOrEmpty(boneName)) return; + bone = skeleton.FindBone(boneName); + if (bone == null) { + Debug.LogError("Bone not found: " + boneName, this); + return; + } + } + + var thisTransform = cachedTransform; + float skeletonFlipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f; + if (mode == Mode.Follow) { + switch (phase) { + case UpdatePhase.Local: + if (position) + thisTransform.localPosition = new Vector3(bone.x, bone.y, 0); + + if (rotation) { + if (bone.data.transformMode.InheritsRotation()) { + thisTransform.localRotation = Quaternion.Euler(0, 0, bone.rotation); + } else { + Vector3 euler = skeletonTransform.rotation.eulerAngles; + thisTransform.rotation = Quaternion.Euler(euler.x, euler.y, euler.z + (bone.WorldRotationX * skeletonFlipRotation)); + } + } + + if (scale) { + thisTransform.localScale = new Vector3(bone.scaleX, bone.scaleY, 1f); + incompatibleTransformMode = BoneTransformModeIncompatible(bone); + } + break; + case UpdatePhase.World: + case UpdatePhase.Complete: + // Use Applied transform values (ax, ay, AppliedRotation, ascale) if world values were modified by constraints. + if (!bone.appliedValid) + bone.UpdateAppliedTransform(); + + if (position) + thisTransform.localPosition = new Vector3(bone.ax, bone.ay, 0); + + if (rotation) { + if (bone.data.transformMode.InheritsRotation()) { + thisTransform.localRotation = Quaternion.Euler(0, 0, bone.AppliedRotation); + } else { + Vector3 euler = skeletonTransform.rotation.eulerAngles; + thisTransform.rotation = Quaternion.Euler(euler.x, euler.y, euler.z + (bone.WorldRotationX * skeletonFlipRotation)); + } + } + + if (scale) { + thisTransform.localScale = new Vector3(bone.ascaleX, bone.ascaleY, 1f); + incompatibleTransformMode = BoneTransformModeIncompatible(bone); + } + break; + } + + } else if (mode == Mode.Override) { + if (transformLerpComplete) + return; + + if (parentReference == null) { + if (position) { + Vector3 clp = thisTransform.localPosition; + bone.x = Mathf.Lerp(bone.x, clp.x, overrideAlpha); + bone.y = Mathf.Lerp(bone.y, clp.y, overrideAlpha); + } + + if (rotation) { + float angle = Mathf.LerpAngle(bone.Rotation, thisTransform.localRotation.eulerAngles.z, overrideAlpha); + bone.Rotation = angle; + bone.AppliedRotation = angle; + } + + if (scale) { + Vector3 cls = thisTransform.localScale; + bone.scaleX = Mathf.Lerp(bone.scaleX, cls.x, overrideAlpha); + bone.scaleY = Mathf.Lerp(bone.scaleY, cls.y, overrideAlpha); + } + + } else { + if (transformLerpComplete) + return; + + if (position) { + Vector3 pos = parentReference.InverseTransformPoint(thisTransform.position); + bone.x = Mathf.Lerp(bone.x, pos.x, overrideAlpha); + bone.y = Mathf.Lerp(bone.y, pos.y, overrideAlpha); + } + + if (rotation) { + float angle = Mathf.LerpAngle(bone.Rotation, Quaternion.LookRotation(Vector3.forward, parentReference.InverseTransformDirection(thisTransform.up)).eulerAngles.z, overrideAlpha); + bone.Rotation = angle; + bone.AppliedRotation = angle; + } + + if (scale) { + Vector3 cls = thisTransform.localScale; + bone.scaleX = Mathf.Lerp(bone.scaleX, cls.x, overrideAlpha); + bone.scaleY = Mathf.Lerp(bone.scaleY, cls.y, overrideAlpha); + } + + incompatibleTransformMode = BoneTransformModeIncompatible(bone); + } + + transformLerpComplete = true; + } + } + + public static bool BoneTransformModeIncompatible (Bone bone) { + return !bone.data.transformMode.InheritsScale(); + } + + public void AddBoundingBox (string skinName, string slotName, string attachmentName) { + SkeletonUtility.AddBoundingBoxGameObject(bone.skeleton, skinName, slotName, attachmentName, transform); + } + + #if UNITY_EDITOR + void OnDrawGizmos () { + if (IncompatibleTransformMode) + Gizmos.DrawIcon(transform.position + new Vector3(0, 0.128f, 0), "icon-warning"); + } + #endif + } +} diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs.meta b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs.meta new file mode 100644 index 0000000..51537b4 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityBone.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b238dfcde8209044b97d23f62bcaadf6 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs new file mode 100644 index 0000000..0caefad --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs @@ -0,0 +1,54 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; + +namespace Spine.Unity { + [RequireComponent(typeof(SkeletonUtilityBone)), ExecuteInEditMode] + public abstract class SkeletonUtilityConstraint : MonoBehaviour { + + protected SkeletonUtilityBone utilBone; + protected SkeletonUtility skeletonUtility; + + protected virtual void OnEnable () { + utilBone = GetComponent(); + skeletonUtility = transform.GetComponentInParent(); + skeletonUtility.RegisterConstraint(this); + } + + protected virtual void OnDisable () { + skeletonUtility.UnregisterConstraint(this); + } + + public abstract void DoUpdate (); + } +} diff --git a/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs.meta b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs.meta new file mode 100644 index 0000000..b78abdc --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SkeletonUtility/SkeletonUtilityConstraint.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 522dbfcc6c916df4396f14f35048d185 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/SpineAttributes.cs b/Assets/Spine/Assets/spine-unity/SpineAttributes.cs new file mode 100644 index 0000000..5f3d7ed --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SpineAttributes.cs @@ -0,0 +1,291 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +// Contributed by: Mitch Thompson + +using UnityEngine; +using System; +using System.Collections; + +namespace Spine.Unity { + + [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)] + public abstract class SpineAttributeBase : PropertyAttribute { + public string dataField = ""; + public string startsWith = ""; + public bool includeNone = true; + public bool fallbackToTextField = false; + } + + public class SpineSlot : SpineAttributeBase { + public bool containsBoundingBoxes = false; + + /// + /// Smart popup menu for Spine Slots + /// + /// Filters popup results to elements that begin with supplied string. + /// Disables popup results that don't contain bounding box attachments when true. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives). + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent() will be called as a fallback. + /// + public SpineSlot (string startsWith = "", string dataField = "", bool containsBoundingBoxes = false, bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.containsBoundingBoxes = containsBoundingBoxes; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + } + + public class SpineEvent : SpineAttributeBase { + /// + /// Smart popup menu for Spine Events (Spine.EventData) + /// + /// Filters popup results to elements that begin with supplied string. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives). + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent(SkeletonRenderer)() will be called as a fallback. + /// + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + public SpineEvent (string startsWith = "", string dataField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + } + + public class SpineIkConstraint : SpineAttributeBase { + /// + /// Smart popup menu for Spine IK Constraints (Spine.IkConstraint) + /// + /// Filters popup results to elements that begin with supplied string. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives). + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent(SkeletonRenderer)() will be called as a fallback. + /// + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + public SpineIkConstraint (string startsWith = "", string dataField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + } + + public class SpinePathConstraint : SpineAttributeBase { + /// + /// Smart popup menu for Spine Events (Spine.PathConstraint) + /// + /// Filters popup results to elements that begin with supplied string. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives). + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent(SkeletonRenderer)() will be called as a fallback. + /// + public SpinePathConstraint (string startsWith = "", string dataField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + } + + public class SpineTransformConstraint : SpineAttributeBase { + /// + /// Smart popup menu for Spine Transform Constraints (Spine.TransformConstraint) + /// + /// Filters popup results to elements that begin with supplied string. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives). + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent() will be called as a fallback. + /// + public SpineTransformConstraint (string startsWith = "", string dataField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + } + + public class SpineSkin : SpineAttributeBase { + /// + /// Smart popup menu for Spine Skins + /// + /// Filters popup results to elements that begin with supplied string. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives) + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent() will be called as a fallback. + /// + public SpineSkin (string startsWith = "", string dataField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + } + public class SpineAnimation : SpineAttributeBase { + /// + /// Smart popup menu for Spine Animations + /// + /// Filters popup results to elements that begin with supplied string. + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives) + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent() will be called as a fallback. + /// + public SpineAnimation (string startsWith = "", string dataField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + } + + public class SpineAttachment : SpineAttributeBase { + public bool returnAttachmentPath = false; + public bool currentSkinOnly = false; + public bool placeholdersOnly = false; + public string skinField = ""; + public string slotField = ""; + + /// + /// Smart popup menu for Spine Attachments + /// + /// Filters popup results to only include the current Skin. Only valid when a SkeletonRenderer is the data source. + /// Returns a fully qualified path for an Attachment in the format "Skin/Slot/AttachmentName". This path format is only used by the SpineAttachment helper methods like SpineAttachment.GetAttachment and .GetHierarchy. Do not use full path anywhere else in Spine's system. + /// Filters popup results to exclude attachments that are not children of Skin Placeholders + /// If specified, a locally scoped field with the name supplied by in slotField will be used to limit the popup results to children of a named slot + /// If specified, a locally scoped field with the name supplied by in skinField will be used to limit the popup results to entries of the named skin + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives) + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent() will be called as a fallback. + /// + public SpineAttachment (bool currentSkinOnly = true, bool returnAttachmentPath = false, bool placeholdersOnly = false, string slotField = "", string dataField = "", string skinField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.currentSkinOnly = currentSkinOnly; + this.returnAttachmentPath = returnAttachmentPath; + this.placeholdersOnly = placeholdersOnly; + this.slotField = slotField; + this.dataField = dataField; + this.skinField = skinField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + + public static SpineAttachment.Hierarchy GetHierarchy (string fullPath) { + return new SpineAttachment.Hierarchy(fullPath); + } + + public static Spine.Attachment GetAttachment (string attachmentPath, Spine.SkeletonData skeletonData) { + var hierarchy = SpineAttachment.GetHierarchy(attachmentPath); + return string.IsNullOrEmpty(hierarchy.name) ? null : skeletonData.FindSkin(hierarchy.skin).GetAttachment(skeletonData.FindSlotIndex(hierarchy.slot), hierarchy.name); + } + + public static Spine.Attachment GetAttachment (string attachmentPath, SkeletonDataAsset skeletonDataAsset) { + return GetAttachment(attachmentPath, skeletonDataAsset.GetSkeletonData(true)); + } + + /// + /// A struct that represents 3 strings that help identify and locate an attachment in a skeleton. + public struct Hierarchy { + public string skin; + public string slot; + public string name; + + public Hierarchy (string fullPath) { + string[] chunks = fullPath.Split(new char[]{'/'}, System.StringSplitOptions.RemoveEmptyEntries); + if (chunks.Length == 0) { + skin = ""; + slot = ""; + name = ""; + return; + } + else if (chunks.Length < 2) { + throw new System.Exception("Cannot generate Attachment Hierarchy from string! Not enough components! [" + fullPath + "]"); + } + skin = chunks[0]; + slot = chunks[1]; + name = ""; + for (int i = 2; i < chunks.Length; i++) { + name += chunks[i]; + } + } + } + } + + public class SpineBone : SpineAttributeBase { + /// + /// Smart popup menu for Spine Bones + /// + /// Filters popup results to elements that begin with supplied string. + /// If true, the dropdown list will include a "none" option which stored as an empty string. + /// If true, and an animation list source can't be found, the field will fall back to a normal text field. If false, it will show an error. + /// If specified, a locally scoped field with the name supplied by in dataField will be used to fill the popup results. + /// Valid types are SkeletonDataAsset and SkeletonRenderer (and derivatives) + /// If left empty and the script the attribute is applied to is derived from Component, GetComponent() will be called as a fallback. + /// + public SpineBone (string startsWith = "", string dataField = "", bool includeNone = true, bool fallbackToTextField = false) { + this.startsWith = startsWith; + this.dataField = dataField; + this.includeNone = includeNone; + this.fallbackToTextField = fallbackToTextField; + } + + public static Spine.Bone GetBone(string boneName, SkeletonRenderer renderer) { + return renderer.skeleton == null ? null : renderer.skeleton.FindBone(boneName); + } + + public static Spine.BoneData GetBoneData(string boneName, SkeletonDataAsset skeletonDataAsset) { + var data = skeletonDataAsset.GetSkeletonData(true); + return data.FindBone(boneName); + } + } + + public class SpineAtlasRegion : PropertyAttribute { + public string atlasAssetField; + + public SpineAtlasRegion (string atlasAssetField = "") { + this.atlasAssetField = atlasAssetField; + } + } + +} diff --git a/Assets/Spine/Assets/spine-unity/SpineAttributes.cs.meta b/Assets/Spine/Assets/spine-unity/SpineAttributes.cs.meta new file mode 100644 index 0000000..00a5090 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/SpineAttributes.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ce216f51ebc1d3f40929f4e58d1c65e5 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/Assets/spine-unity/version.txt b/Assets/Spine/Assets/spine-unity/version.txt new file mode 100644 index 0000000..2c1099d --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/version.txt @@ -0,0 +1 @@ +This Spine-Unity runtime works with data exported from Spine Editor version: 3.6.xx \ No newline at end of file diff --git a/Assets/Spine/Assets/spine-unity/version.txt.meta b/Assets/Spine/Assets/spine-unity/version.txt.meta new file mode 100644 index 0000000..d34c5b7 --- /dev/null +++ b/Assets/Spine/Assets/spine-unity/version.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80c06a67282e71043a4b1fad3e0c5654 +timeCreated: 1485965987 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Spine/LICENSE b/Assets/Spine/LICENSE new file mode 100644 index 0000000..daceab9 --- /dev/null +++ b/Assets/Spine/LICENSE @@ -0,0 +1,27 @@ +Spine Runtimes Software License v2.5 + +Copyright (c) 2013-2016, Esoteric Software +All rights reserved. + +You are granted a perpetual, non-exclusive, non-sublicensable, and +non-transferable license to use, install, execute, and perform the Spine +Runtimes software and derivative works solely for personal or internal +use. Without the written permission of Esoteric Software (see Section 2 of +the Spine Software License Agreement), you may not (a) modify, translate, +adapt, or develop new applications using the Spine Runtimes or otherwise +create derivative works or improvements of the Spine Runtimes or (b) remove, +delete, alter, or obscure any trademarks or any copyright, trademark, patent, +or other intellectual property or proprietary rights notices on or in the +Software, including any copy thereof. Redistributions in binary or source +form must include this license and terms. + +THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF +USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Assets/Spine/README.md b/Assets/Spine/README.md new file mode 100644 index 0000000..316c255 --- /dev/null +++ b/Assets/Spine/README.md @@ -0,0 +1,68 @@ +# spine-unity + +The **spine-unity** runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [Unity](http://unity3d.com/). spine-unity is based on [spine-csharp](../spine-csharp). + +For more documentation, see [spine-unity Documentation](http://esotericsoftware.com/spine-unity). + +While spine-unity can render directly with Unity, without the need for any other plugins, it also works with [2D Toolkit](http://www.2dtoolkit.com/) and can render skeletons using a TK2D texture atlas. + +## Licensing + +This Spine Runtime may only be used for personal or internal use, typically to evaluate Spine before purchasing. If you would like to incorporate a Spine Runtime into your applications, distribute software containing a Spine Runtime, or modify a Spine Runtime, then you will need a valid [Spine license](https://esotericsoftware.com/spine-purchase). Please see the [Spine Runtimes Software License](http://esotericsoftware.com/git/spine-runtimes/blob/LICENSE) for detailed information. + +The Spine Runtimes are developed with the intent to be used with data exported from Spine. By purchasing Spine, `Section 2` of the [Spine Software License](https://esotericsoftware.com/files/license.txt) grants the right to create and distribute derivative works of the Spine Runtimes. + +## Spine version + +spine-unity works with data exported from Spine 3.6.xx. + +spine-unity supports all Spine features. + +Unity's physics components do not support dynamically assigned vertices so they cannot be used to mirror bone-weighted and deformed BoundingBoxAttachments. However, BoundingBoxAttachment vertices at runtime will still deform correctly and can be used to perform manual hit detection. + +## Documentation + +A Spine skeleton GameObject (a GameObject with a SkeletonAnimation component on it) can be used throughout Unity like any other GameObject. It renders through `MeshRenderer`. + +`SkeletonUtility` allows other GameObjects to interact with the Spine skeleton, to control bones in the skeleton, be controlled by the skeleton, attach colliders, etc. + +For advanced uses and specific optimization cases, Spine skeletons can be "baked" into native Unity animation assets. Since Unity's animation feature-set does not overlap with Spine's perfectly, baked assets have many limitations and removed features. For most uses, baking is not necessary. + +The [Spine Unity Features Tutorial](http://esotericsoftware.com/forum/Unity-Feature-Tutorials-4839) forum thread has many videos on how to use spine-unity. + +For more documentation, see [spine-unity Documentation](http://esotericsoftware.com/spine-unity). + +## Quick installation + +Download the latest Spine-Unity unitypackage from the download page: http://esotericsoftware.com/spine-unity-download/ + +In the `Assets/Examples/Scenes` folder you will find many example scenes that demonstrate various spine-unity features. + +## Manual installation + +You can also choose to setup and run from the Git files: + +1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it as a zip via the download button above. +2. spine-unity requires both `spine-csharp` and `spine-unity`. + - Copy the contents of `spine-csharp/src` to `Assets/spine-csharp` in your Unity project directory. + - Copy the contents of `spine-unity/Assets` to `Assets` in your Unity project directory. Including `Gizmos` and `spine-unity` and `Examples` if you want them. + +> - `Gizmos` is a [special folder](http://docs.unity3d.com/Manual/SpecialFolders.html) in Unity. It needs to be at the root of your assets folder to function correctly. (ie. `Assets/Gizmos` +- `spine-csharp` and `spine-unity` can be placed in any subfolder you want. + +For more information on importing the runtime into your Unity project, see the documentation sections on [installing](http://esotericsoftware.com/spine-unity#Installing) and [updating](http://esotericsoftware.com/spine-unity#Updating-Your-Projects-SpineUnity-Runtime), + +---------- + +> More resources: +- [Spine-Unity Documentation](http://esotericsoftware.com/spine-unity) +- [Importing Spine Skeletons into Unity](http://esotericsoftware.com/spine-unity#Importing-into-Unity) + +---------- + +## Notes + +- This slightly outdated [spine-unity tutorial video](http://www.youtube.com/watch?v=x1umSQulghA) may still be useful. +- Atlas images should use **Premultiplied Alpha** when using the shaders that come with spine-unity (`Spine/Skeleton` or `Spine/SkeletonLit`). +- Texture sizes: Unity scales large images down by default if they exceed 1024x1024. This can cause atlas coordinates to be incorrect. To fix this, make sure to set import settings in the Inspector for any large atlas image you have so Unity does not scale it down. +- Texture artifacts from compression: Unity's 2D project defaults import new images added to the project with the Texture Type "Sprite". This can cause artifacts when using the `Spine/Skeleton` shader. To avoid these artifacts, make sure the Texture Type is set to "Texture". spine-unity's automatic import will attempt to apply these settings but in the process of updating your textures, these settings may be reverted. diff --git a/Assets/Spine/README.pdf b/Assets/Spine/README.pdf new file mode 100644 index 0000000..266629c Binary files /dev/null and b/Assets/Spine/README.pdf differ diff --git a/Assets/Spine/Spine.mdpolicy b/Assets/Spine/Spine.mdpolicy new file mode 100644 index 0000000..8af1049 --- /dev/null +++ b/Assets/Spine/Spine.mdpolicy @@ -0,0 +1,28 @@ + + + + 130 + 3 + 3 + + + False + False + False + EndOfLine + EndOfLine + EndOfLine + EndOfLine + EndOfLine + EndOfLine + EndOfLine + EndOfLine + SameLine + False + True + False + False + 1 + 1 + + \ No newline at end of file diff --git a/Assets/Spine/SpineCSharp/Animation.cs b/Assets/Spine/SpineCSharp/Animation.cs new file mode 100644 index 0000000..28a9a9a --- /dev/null +++ b/Assets/Spine/SpineCSharp/Animation.cs @@ -0,0 +1,1395 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + public class Animation { + internal ExposedList timelines; + internal float duration; + internal String name; + + public string Name { get { return name; } } + public ExposedList Timelines { get { return timelines; } set { timelines = value; } } + public float Duration { get { return duration; } set { duration = value; } } + + public Animation (string name, ExposedList timelines, float duration) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + if (timelines == null) throw new ArgumentNullException("timelines", "timelines cannot be null."); + this.name = name; + this.timelines = timelines; + this.duration = duration; + } + + /// Applies all the animation's timelines to the specified skeleton. + /// + public void Apply (Skeleton skeleton, float lastTime, float time, bool loop, ExposedList events, float alpha, MixPose pose, MixDirection direction) { + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); + + if (loop && duration != 0) { + time %= duration; + if (lastTime > 0) lastTime %= duration; + } + + ExposedList timelines = this.timelines; + for (int i = 0, n = timelines.Count; i < n; i++) + timelines.Items[i].Apply(skeleton, lastTime, time, events, alpha, pose, direction); + } + + /// After the first and before the last entry. + internal static int BinarySearch (float[] values, float target, int step) { + int low = 0; + int high = values.Length / step - 2; + if (high == 0) return step; + int current = (int)((uint)high >> 1); + while (true) { + if (values[(current + 1) * step] <= target) + low = current + 1; + else + high = current; + if (low == high) return (low + 1) * step; + current = (int)((uint)(low + high) >> 1); + } + } + + /// After the first and before the last entry. + internal static int BinarySearch (float[] values, float target) { + int low = 0; + int high = values.Length - 2; + if (high == 0) return 1; + int current = (int)((uint)high >> 1); + while (true) { + if (values[(current + 1)] <= target) + low = current + 1; + else + high = current; + if (low == high) return (low + 1); + current = (int)((uint)(low + high) >> 1); + } + } + + internal static int LinearSearch (float[] values, float target, int step) { + for (int i = 0, last = values.Length - step; i <= last; i += step) + if (values[i] > target) return i; + return -1; + } + } + + public interface Timeline { + /// Sets the value(s) for the specified time. + /// The skeleton the timeline is being applied to. This provides access to the bones, slots, and other skeleton components the timeline may change. + /// lastTime The time this timeline was last applied. Timelines such as EventTimeline trigger only at specific times rather than every frame. In that case, the timeline triggers everything between lastTime (exclusive) and time (inclusive). + /// The time within the animation. Most timelines find the key before and the key after this time so they can interpolate between the keys. + /// If any events are fired, they are added to this list. Can be null to ignore firing events or if the timeline does not fire events. May be null. + /// alpha 0 applies the current or setup pose value (depending on pose parameter). 1 applies the timeline + /// value. Between 0 and 1 applies a value between the current or setup pose and the timeline value. By adjusting + /// alpha over time, an animation can be mixed in or out. alpha can also be useful to + /// apply animations on top of each other (layered). + /// Controls how mixing is applied when alpha is than 1. + /// Indicates whether the timeline is mixing in or out. Used by timelines which perform instant transitions such as DrawOrderTimeline and AttachmentTimeline. + void Apply (Skeleton skeleton, float lastTime, float time, ExposedList events, float alpha, MixPose pose, MixDirection direction); + int PropertyId { get; } + } + + /// + /// Controls how a timeline is mixed with the setup or current pose. + /// + public enum MixPose { + /// The timeline value is mixed with the setup pose (the current pose is not used). + Setup, + /// The timeline value is mixed with the current pose. The setup pose is used as the timeline value before the first key, + /// except for timelines which perform instant transitions, such as DrawOrderTimeline or AttachmentTimeline. + Current, + /// The timeline value is mixed with the current pose. No change is made before the first key (the current pose is kept until the first key). + CurrentLayered + } + + /// + /// Indicates whether a timeline's alpha is mixing out over time toward 0 (the setup or current pose) or mixing in toward 1 (the timeline's pose). + /// + public enum MixDirection { + In, + Out + } + + internal enum TimelineType { + Rotate = 0, Translate, Scale, Shear, // + Attachment, Color, Deform, // + Event, DrawOrder, // + IkConstraint, TransformConstraint, // + PathConstraintPosition, PathConstraintSpacing, PathConstraintMix, // + TwoColor + } + + /// Base class for frames that use an interpolation bezier curve. + abstract public class CurveTimeline : Timeline { + protected const float LINEAR = 0, STEPPED = 1, BEZIER = 2; + protected const int BEZIER_SIZE = 10 * 2 - 1; + + internal float[] curves; // type, x, y, ... + public int FrameCount { get { return curves.Length / BEZIER_SIZE + 1; } } + + public CurveTimeline (int frameCount) { + if (frameCount <= 0) throw new ArgumentException("frameCount must be > 0: " + frameCount, "frameCount"); + curves = new float[(frameCount - 1) * BEZIER_SIZE]; + } + + abstract public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction); + + abstract public int PropertyId { get; } + + public void SetLinear (int frameIndex) { + curves[frameIndex * BEZIER_SIZE] = LINEAR; + } + + public void SetStepped (int frameIndex) { + curves[frameIndex * BEZIER_SIZE] = STEPPED; + } + + /// Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next. + /// cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of + /// the difference between the keyframe's values. + public void SetCurve (int frameIndex, float cx1, float cy1, float cx2, float cy2) { + float tmpx = (-cx1 * 2 + cx2) * 0.03f, tmpy = (-cy1 * 2 + cy2) * 0.03f; + float dddfx = ((cx1 - cx2) * 3 + 1) * 0.006f, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006f; + float ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy; + float dfx = cx1 * 0.3f + tmpx + dddfx * 0.16666667f, dfy = cy1 * 0.3f + tmpy + dddfy * 0.16666667f; + + int i = frameIndex * BEZIER_SIZE; + float[] curves = this.curves; + curves[i++] = BEZIER; + + float x = dfx, y = dfy; + for (int n = i + BEZIER_SIZE - 1; i < n; i += 2) { + curves[i] = x; + curves[i + 1] = y; + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + x += dfx; + y += dfy; + } + } + + public float GetCurvePercent (int frameIndex, float percent) { + percent = MathUtils.Clamp (percent, 0, 1); + float[] curves = this.curves; + int i = frameIndex * BEZIER_SIZE; + float type = curves[i]; + if (type == LINEAR) return percent; + if (type == STEPPED) return 0; + i++; + float x = 0; + for (int start = i, n = i + BEZIER_SIZE - 1; i < n; i += 2) { + x = curves[i]; + if (x >= percent) { + float prevX, prevY; + if (i == start) { + prevX = 0; + prevY = 0; + } else { + prevX = curves[i - 2]; + prevY = curves[i - 1]; + } + return prevY + (curves[i + 1] - prevY) * (percent - prevX) / (x - prevX); + } + } + float y = curves[i - 1]; + return y + (1 - y) * (percent - x) / (1 - x); // Last point is 1,1. + } + public float GetCurveType (int frameIndex) { + return curves[frameIndex * BEZIER_SIZE]; + } + } + + public class RotateTimeline : CurveTimeline { + public const int ENTRIES = 2; + internal const int PREV_TIME = -2, PREV_ROTATION = -1; + internal const int ROTATION = 1; + + internal int boneIndex; + internal float[] frames; + + public int BoneIndex { get { return boneIndex; } set { boneIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, angle, ... + + override public int PropertyId { + get { return ((int)TimelineType.Rotate << 24) + boneIndex; } + } + + public RotateTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount << 1]; + } + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, float degrees) { + frameIndex <<= 1; + frames[frameIndex] = time; + frames[frameIndex + ROTATION] = degrees; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + Bone bone = skeleton.bones.Items[boneIndex]; + + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + bone.rotation = bone.data.rotation; + return; + case MixPose.Current: + float rr = bone.data.rotation - bone.rotation; + rr -= (16384 - (int)(16384.499999999996 - rr / 360)) * 360; + bone.rotation += rr * alpha; + return; + } + return; + } + + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + if (pose == MixPose.Setup) { + bone.rotation = bone.data.rotation + frames[frames.Length + PREV_ROTATION] * alpha; + } else { + float rr = bone.data.rotation + frames[frames.Length + PREV_ROTATION] - bone.rotation; + rr -= (16384 - (int)(16384.499999999996 - rr / 360)) * 360; // Wrap within -180 and 180. + bone.rotation += rr * alpha; + } + return; + } + + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + float prevRotation = frames[frame + PREV_ROTATION]; + float frameTime = frames[frame]; + float percent = GetCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + float r = frames[frame + ROTATION] - prevRotation; + r -= (16384 - (int)(16384.499999999996 - r / 360)) * 360; + r = prevRotation + r * percent; + if (pose == MixPose.Setup) { + r -= (16384 - (int)(16384.499999999996 - r / 360)) * 360; + bone.rotation = bone.data.rotation + r * alpha; + } else { + r = bone.data.rotation + r - bone.rotation; + r -= (16384 - (int)(16384.499999999996 - r / 360)) * 360; + bone.rotation += r * alpha; + } + } + } + + public class TranslateTimeline : CurveTimeline { + public const int ENTRIES = 3; + protected const int PREV_TIME = -3, PREV_X = -2, PREV_Y = -1; + protected const int X = 1, Y = 2; + + internal int boneIndex; + internal float[] frames; + + public int BoneIndex { get { return boneIndex; } set { boneIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, value, value, ... + + override public int PropertyId { + get { return ((int)TimelineType.Translate << 24) + boneIndex; } + } + + public TranslateTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, float x, float y) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + X] = x; + frames[frameIndex + Y] = y; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + Bone bone = skeleton.bones.Items[boneIndex]; + + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + bone.x = bone.data.x; + bone.y = bone.data.y; + return; + case MixPose.Current: + bone.x += (bone.data.x - bone.x) * alpha; + bone.y += (bone.data.y - bone.y) * alpha; + return; + } + return; + } + + float x, y; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + x = frames[frames.Length + PREV_X]; + y = frames[frames.Length + PREV_Y]; + } else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + x = frames[frame + PREV_X]; + y = frames[frame + PREV_Y]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + x += (frames[frame + X] - x) * percent; + y += (frames[frame + Y] - y) * percent; + } + if (pose == MixPose.Setup) { + bone.x = bone.data.x + x * alpha; + bone.y = bone.data.y + y * alpha; + } else { + bone.x += (bone.data.x + x - bone.x) * alpha; + bone.y += (bone.data.y + y - bone.y) * alpha; + } + } + } + + public class ScaleTimeline : TranslateTimeline { + override public int PropertyId { + get { return ((int)TimelineType.Scale << 24) + boneIndex; } + } + + public ScaleTimeline (int frameCount) + : base(frameCount) { + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + Bone bone = skeleton.bones.Items[boneIndex]; + + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + bone.scaleX = bone.data.scaleX; + bone.scaleY = bone.data.scaleY; + return; + case MixPose.Current: + bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha; + return; + } + return; + } + + float x, y; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + x = frames[frames.Length + PREV_X] * bone.data.scaleX; + y = frames[frames.Length + PREV_Y] * bone.data.scaleY; + } else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + x = frames[frame + PREV_X]; + y = frames[frame + PREV_Y]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + x = (x + (frames[frame + X] - x) * percent) * bone.data.scaleX; + y = (y + (frames[frame + Y] - y) * percent) * bone.data.scaleY; + } + if (alpha == 1) { + bone.scaleX = x; + bone.scaleY = y; + } else { + float bx, by; + if (pose == MixPose.Setup) { + bx = bone.data.scaleX; + by = bone.data.scaleY; + } else { + bx = bone.scaleX; + by = bone.scaleY; + } + // Mixing out uses sign of setup or current pose, else use sign of key. + if (direction == MixDirection.Out) { + x = (x >= 0 ? x : -x) * (bx >= 0 ? 1 : -1); + y = (y >= 0 ? y : -y) * (by >= 0 ? 1 : -1); + } else { + bx = (bx >= 0 ? bx : -bx) * (x >= 0 ? 1 : -1); + by = (by >= 0 ? by : -by) * (y >= 0 ? 1 : -1); + } + bone.scaleX = bx + (x - bx) * alpha; + bone.scaleY = by + (y - by) * alpha; + } + } + } + + public class ShearTimeline : TranslateTimeline { + override public int PropertyId { + get { return ((int)TimelineType.Shear << 24) + boneIndex; } + } + + public ShearTimeline (int frameCount) + : base(frameCount) { + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + Bone bone = skeleton.bones.Items[boneIndex]; + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + bone.shearX = bone.data.shearX; + bone.shearY = bone.data.shearY; + return; + case MixPose.Current: + bone.shearX += (bone.data.shearX - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY - bone.shearY) * alpha; + return; + } + return; + } + + float x, y; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + x = frames[frames.Length + PREV_X]; + y = frames[frames.Length + PREV_Y]; + } else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + x = frames[frame + PREV_X]; + y = frames[frame + PREV_Y]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + x = x + (frames[frame + X] - x) * percent; + y = y + (frames[frame + Y] - y) * percent; + } + if (pose == MixPose.Setup) { + bone.shearX = bone.data.shearX + x * alpha; + bone.shearY = bone.data.shearY + y * alpha; + } else { + bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha; + } + } + } + + public class ColorTimeline : CurveTimeline { + public const int ENTRIES = 5; + protected const int PREV_TIME = -5, PREV_R = -4, PREV_G = -3, PREV_B = -2, PREV_A = -1; + protected const int R = 1, G = 2, B = 3, A = 4; + + internal int slotIndex; + internal float[] frames; + + public int SlotIndex { get { return slotIndex; } set { slotIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, r, g, b, a, ... + + override public int PropertyId { + get { return ((int)TimelineType.Color << 24) + slotIndex; } + } + + public ColorTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, float r, float g, float b, float a) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + R] = r; + frames[frameIndex + G] = g; + frames[frameIndex + B] = b; + frames[frameIndex + A] = a; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + Slot slot = skeleton.slots.Items[slotIndex]; + float[] frames = this.frames; + if (time < frames[0]) { + var slotData = slot.data; + switch (pose) { + case MixPose.Setup: + slot.r = slotData.r; + slot.g = slotData.g; + slot.b = slotData.b; + slot.a = slotData.a; + return; + case MixPose.Current: + slot.r += (slot.r - slotData.r) * alpha; + slot.g += (slot.g - slotData.g) * alpha; + slot.b += (slot.b - slotData.b) * alpha; + slot.a += (slot.a - slotData.a) * alpha; + return; + } + return; + } + + float r, g, b, a; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + r = frames[i + PREV_R]; + g = frames[i + PREV_G]; + b = frames[i + PREV_B]; + a = frames[i + PREV_A]; + } else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + r = frames[frame + PREV_R]; + g = frames[frame + PREV_G]; + b = frames[frame + PREV_B]; + a = frames[frame + PREV_A]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + r += (frames[frame + R] - r) * percent; + g += (frames[frame + G] - g) * percent; + b += (frames[frame + B] - b) * percent; + a += (frames[frame + A] - a) * percent; + } + if (alpha == 1) { + slot.r = r; + slot.g = g; + slot.b = b; + slot.a = a; + } else { + float br, bg, bb, ba; + if (pose == MixPose.Setup) { + br = slot.data.r; + bg = slot.data.g; + bb = slot.data.b; + ba = slot.data.a; + } else { + br = slot.r; + bg = slot.g; + bb = slot.b; + ba = slot.a; + } + slot.r = br + ((r - br) * alpha); + slot.g = bg + ((g - bg) * alpha); + slot.b = bb + ((b - bb) * alpha); + slot.a = ba + ((a - ba) * alpha); + } + } + } + + public class TwoColorTimeline : CurveTimeline { + public const int ENTRIES = 8; + protected const int PREV_TIME = -8, PREV_R = -7, PREV_G = -6, PREV_B = -5, PREV_A = -4; + protected const int PREV_R2 = -3, PREV_G2 = -2, PREV_B2 = -1; + protected const int R = 1, G = 2, B = 3, A = 4, R2 = 5, G2 = 6, B2 = 7; + + internal int slotIndex; + internal float[] frames; // time, r, g, b, a, r2, g2, b2, ... + + public int SlotIndex { + get { return slotIndex; } + set { + if (value < 0) + throw new ArgumentOutOfRangeException("index must be >= 0."); + slotIndex = value; + } + } + + public float[] Frames { get { return frames; } } + + override public int PropertyId { + get { return ((int)TimelineType.TwoColor << 24) + slotIndex; } + } + + public TwoColorTimeline (int frameCount) : + base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, float r, float g, float b, float a, float r2, float g2, float b2) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + R] = r; + frames[frameIndex + G] = g; + frames[frameIndex + B] = b; + frames[frameIndex + A] = a; + frames[frameIndex + R2] = r2; + frames[frameIndex + G2] = g2; + frames[frameIndex + B2] = b2; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + Slot slot = skeleton.slots.Items[slotIndex]; + float[] frames = this.frames; + if (time < frames[0]) { // Time is before first frame. + var slotData = slot.data; + switch (pose) { + case MixPose.Setup: + // slot.color.set(slot.data.color); + // slot.darkColor.set(slot.data.darkColor); + slot.r = slotData.r; + slot.g = slotData.g; + slot.b = slotData.b; + slot.a = slotData.a; + slot.r2 = slotData.r2; + slot.g2 = slotData.g2; + slot.b2 = slotData.b2; + return; + case MixPose.Current: + slot.r += (slot.r - slotData.r) * alpha; + slot.g += (slot.g - slotData.g) * alpha; + slot.b += (slot.b - slotData.b) * alpha; + slot.a += (slot.a - slotData.a) * alpha; + slot.r2 += (slot.r2 - slotData.r2) * alpha; + slot.g2 += (slot.g2 - slotData.g2) * alpha; + slot.b2 += (slot.b2 - slotData.b2) * alpha; + return; + } + return; + } + + float r, g, b, a, r2, g2, b2; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + r = frames[i + PREV_R]; + g = frames[i + PREV_G]; + b = frames[i + PREV_B]; + a = frames[i + PREV_A]; + r2 = frames[i + PREV_R2]; + g2 = frames[i + PREV_G2]; + b2 = frames[i + PREV_B2]; + } else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + r = frames[frame + PREV_R]; + g = frames[frame + PREV_G]; + b = frames[frame + PREV_B]; + a = frames[frame + PREV_A]; + r2 = frames[frame + PREV_R2]; + g2 = frames[frame + PREV_G2]; + b2 = frames[frame + PREV_B2]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + r += (frames[frame + R] - r) * percent; + g += (frames[frame + G] - g) * percent; + b += (frames[frame + B] - b) * percent; + a += (frames[frame + A] - a) * percent; + r2 += (frames[frame + R2] - r2) * percent; + g2 += (frames[frame + G2] - g2) * percent; + b2 += (frames[frame + B2] - b2) * percent; + } + if (alpha == 1) { + slot.r = r; + slot.g = g; + slot.b = b; + slot.a = a; + slot.r2 = r2; + slot.g2 = g2; + slot.b2 = b2; + } else { + float br, bg, bb, ba, br2, bg2, bb2; + if (pose == MixPose.Setup) { + br = slot.data.r; + bg = slot.data.g; + bb = slot.data.b; + ba = slot.data.a; + br2 = slot.data.r2; + bg2 = slot.data.g2; + bb2 = slot.data.b2; + } else { + br = slot.r; + bg = slot.g; + bb = slot.b; + ba = slot.a; + br2 = slot.r2; + bg2 = slot.g2; + bb2 = slot.b2; + } + slot.r = br + ((r - br) * alpha); + slot.g = bg + ((g - bg) * alpha); + slot.b = bb + ((b - bb) * alpha); + slot.a = ba + ((a - ba) * alpha); + slot.r2 = br2 + ((r2 - br2) * alpha); + slot.g2 = bg2 + ((g2 - bg2) * alpha); + slot.b2 = bb2 + ((b2 - bb2) * alpha); + } + } + + } + + public class AttachmentTimeline : Timeline { + internal int slotIndex; + internal float[] frames; + internal string[] attachmentNames; + + public int SlotIndex { get { return slotIndex; } set { slotIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, ... + public string[] AttachmentNames { get { return attachmentNames; } set { attachmentNames = value; } } + public int FrameCount { get { return frames.Length; } } + + public int PropertyId { + get { return ((int)TimelineType.Attachment << 24) + slotIndex; } + } + + public AttachmentTimeline (int frameCount) { + frames = new float[frameCount]; + attachmentNames = new String[frameCount]; + } + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, String attachmentName) { + frames[frameIndex] = time; + attachmentNames[frameIndex] = attachmentName; + } + + public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + string attachmentName; + Slot slot = skeleton.slots.Items[slotIndex]; + if (direction == MixDirection.Out && pose == MixPose.Setup) { + attachmentName = slot.data.attachmentName; + slot.Attachment = attachmentName == null ? null : skeleton.GetAttachment(slotIndex, attachmentName); + return; + } + + float[] frames = this.frames; + if (time < frames[0]) { // Time is before first frame. + if (pose == MixPose.Setup) { + attachmentName = slot.data.attachmentName; + slot.Attachment = attachmentName == null ? null : skeleton.GetAttachment(slotIndex, attachmentName); + } + return; + } + + int frameIndex; + if (time >= frames[frames.Length - 1]) // Time is after last frame. + frameIndex = frames.Length - 1; + else + frameIndex = Animation.BinarySearch(frames, time, 1) - 1; + + attachmentName = attachmentNames[frameIndex]; + slot.Attachment = attachmentName == null ? null : skeleton.GetAttachment(slotIndex, attachmentName); + } + } + + public class DeformTimeline : CurveTimeline { + internal int slotIndex; + internal float[] frames; + internal float[][] frameVertices; + internal VertexAttachment attachment; + + public int SlotIndex { get { return slotIndex; } set { slotIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, ... + public float[][] Vertices { get { return frameVertices; } set { frameVertices = value; } } + public VertexAttachment Attachment { get { return attachment; } set { attachment = value; } } + + override public int PropertyId { + get { return ((int)TimelineType.Deform << 24) + attachment.id + slotIndex; } + } + + public DeformTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount]; + frameVertices = new float[frameCount][]; + } + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, float[] vertices) { + frames[frameIndex] = time; + frameVertices[frameIndex] = vertices; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + Slot slot = skeleton.slots.Items[slotIndex]; + VertexAttachment vertexAttachment = slot.attachment as VertexAttachment; + if (vertexAttachment == null || !vertexAttachment.ApplyDeform(attachment)) return; + + var verticesArray = slot.attachmentVertices; + if (verticesArray.Count == 0) alpha = 1; + + float[][] frameVertices = this.frameVertices; + int vertexCount = frameVertices[0].Length; + float[] frames = this.frames; + float[] vertices; + + if (time < frames[0]) { + + switch (pose) { + case MixPose.Setup: + verticesArray.Clear(); + return; + case MixPose.Current: + if (alpha == 1) { + verticesArray.Clear(); + return; + } + + // verticesArray.SetSize(vertexCount) // Ensure size and preemptively set count. + if (verticesArray.Capacity < vertexCount) verticesArray.Capacity = vertexCount; + verticesArray.Count = vertexCount; + vertices = verticesArray.Items; + + if (vertexAttachment.bones == null) { + // Unweighted vertex positions. + float[] setupVertices = vertexAttachment.vertices; + for (int i = 0; i < vertexCount; i++) + vertices[i] += (setupVertices[i] - vertices[i]) * alpha; + } else { + // Weighted deform offsets. + alpha = 1 - alpha; + for (int i = 0; i < vertexCount; i++) + vertices[i] *= alpha; + } + return; + default: + return; + } + + } + + // verticesArray.SetSize(vertexCount) // Ensure size and preemptively set count. + if (verticesArray.Capacity < vertexCount) verticesArray.Capacity = vertexCount; + verticesArray.Count = vertexCount; + vertices = verticesArray.Items; + + if (time >= frames[frames.Length - 1]) { // Time is after last frame. + float[] lastVertices = frameVertices[frames.Length - 1]; + if (alpha == 1) { + // Vertex positions or deform offsets, no alpha. + Array.Copy(lastVertices, 0, vertices, 0, vertexCount); + } else if (pose == MixPose.Setup) { + if (vertexAttachment.bones == null) { + // Unweighted vertex positions, with alpha. + float[] setupVertices = vertexAttachment.vertices; + for (int i = 0; i < vertexCount; i++) { + float setup = setupVertices[i]; + vertices[i] = setup + (lastVertices[i] - setup) * alpha; + } + } else { + // Weighted deform offsets, with alpha. + for (int i = 0; i < vertexCount; i++) + vertices[i] = lastVertices[i] * alpha; + } + } else { + // Vertex positions or deform offsets, with alpha. + for (int i = 0; i < vertexCount; i++) + vertices[i] += (lastVertices[i] - vertices[i]) * alpha; + } + return; + } + + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time); + float[] prevVertices = frameVertices[frame - 1]; + float[] nextVertices = frameVertices[frame]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime)); + + if (alpha == 1) { + // Vertex positions or deform offsets, no alpha. + for (int i = 0; i < vertexCount; i++) { + float prev = prevVertices[i]; + vertices[i] = prev + (nextVertices[i] - prev) * percent; + } + } else if (pose == MixPose.Setup) { + if (vertexAttachment.bones == null) { + // Unweighted vertex positions, with alpha. + var setupVertices = vertexAttachment.vertices; + for (int i = 0; i < vertexCount; i++) { + float prev = prevVertices[i], setup = setupVertices[i]; + vertices[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha; + } + } else { + // Weighted deform offsets, with alpha. + for (int i = 0; i < vertexCount; i++) { + float prev = prevVertices[i]; + vertices[i] = (prev + (nextVertices[i] - prev) * percent) * alpha; + } + } + } else { + // Vertex positions or deform offsets, with alpha. + for (int i = 0; i < vertexCount; i++) { + float prev = prevVertices[i]; + vertices[i] += (prev + (nextVertices[i] - prev) * percent - vertices[i]) * alpha; + } + } + } + } + + public class EventTimeline : Timeline { + internal float[] frames; + private Event[] events; + + public float[] Frames { get { return frames; } set { frames = value; } } // time, ... + public Event[] Events { get { return events; } set { events = value; } } + public int FrameCount { get { return frames.Length; } } + + public int PropertyId { + get { return ((int)TimelineType.Event << 24); } + } + + public EventTimeline (int frameCount) { + frames = new float[frameCount]; + events = new Event[frameCount]; + } + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, Event e) { + frames[frameIndex] = e.Time; + events[frameIndex] = e; + } + + /// Fires events for frames > lastTime and <= time. + public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + if (firedEvents == null) return; + float[] frames = this.frames; + int frameCount = frames.Length; + + if (lastTime > time) { // Fire events after last time for looped animations. + Apply(skeleton, lastTime, int.MaxValue, firedEvents, alpha, pose, direction); + lastTime = -1f; + } else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame. + return; + if (time < frames[0]) return; // Time is before first frame. + + int frame; + if (lastTime < frames[0]) + frame = 0; + else { + frame = Animation.BinarySearch(frames, lastTime); + float frameTime = frames[frame]; + while (frame > 0) { // Fire multiple events with the same frame. + if (frames[frame - 1] != frameTime) break; + frame--; + } + } + for (; frame < frameCount && time >= frames[frame]; frame++) + firedEvents.Add(events[frame]); + } + } + + public class DrawOrderTimeline : Timeline { + internal float[] frames; + private int[][] drawOrders; + + public float[] Frames { get { return frames; } set { frames = value; } } // time, ... + public int[][] DrawOrders { get { return drawOrders; } set { drawOrders = value; } } + public int FrameCount { get { return frames.Length; } } + + public int PropertyId { + get { return ((int)TimelineType.DrawOrder << 24); } + } + + public DrawOrderTimeline (int frameCount) { + frames = new float[frameCount]; + drawOrders = new int[frameCount][]; + } + + /// Sets the time and value of the specified keyframe. + /// May be null to use bind pose draw order. + public void SetFrame (int frameIndex, float time, int[] drawOrder) { + frames[frameIndex] = time; + drawOrders[frameIndex] = drawOrder; + } + + public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + ExposedList drawOrder = skeleton.drawOrder; + ExposedList slots = skeleton.slots; + if (direction == MixDirection.Out && pose == MixPose.Setup) { + Array.Copy(slots.Items, 0, drawOrder.Items, 0, slots.Count); + return; + } + + float[] frames = this.frames; + if (time < frames[0]) { + if (pose == MixPose.Setup) Array.Copy(slots.Items, 0, drawOrder.Items, 0, slots.Count); + return; + } + + int frame; + if (time >= frames[frames.Length - 1]) // Time is after last frame. + frame = frames.Length - 1; + else + frame = Animation.BinarySearch(frames, time) - 1; + + int[] drawOrderToSetupIndex = drawOrders[frame]; + if (drawOrderToSetupIndex == null) { + drawOrder.Clear(); + for (int i = 0, n = slots.Count; i < n; i++) + drawOrder.Add(slots.Items[i]); + } else { + var drawOrderItems = drawOrder.Items; + var slotsItems = slots.Items; + for (int i = 0, n = drawOrderToSetupIndex.Length; i < n; i++) + drawOrderItems[i] = slotsItems[drawOrderToSetupIndex[i]]; + } + } + } + + public class IkConstraintTimeline : CurveTimeline { + public const int ENTRIES = 3; + private const int PREV_TIME = -3, PREV_MIX = -2, PREV_BEND_DIRECTION = -1; + private const int MIX = 1, BEND_DIRECTION = 2; + + internal int ikConstraintIndex; + internal float[] frames; + + public int IkConstraintIndex { get { return ikConstraintIndex; } set { ikConstraintIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, mix, bendDirection, ... + + override public int PropertyId { + get { return ((int)TimelineType.IkConstraint << 24) + ikConstraintIndex; } + } + + public IkConstraintTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + /// Sets the time, mix and bend direction of the specified keyframe. + public void SetFrame (int frameIndex, float time, float mix, int bendDirection) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + MIX] = mix; + frames[frameIndex + BEND_DIRECTION] = bendDirection; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + IkConstraint constraint = skeleton.ikConstraints.Items[ikConstraintIndex]; + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + constraint.mix = constraint.data.mix; + constraint.bendDirection = constraint.data.bendDirection; + return; + case MixPose.Current: + constraint.mix += (constraint.data.mix - constraint.mix) * alpha; + constraint.bendDirection = constraint.data.bendDirection; + return; + } + return; + } + + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + if (pose == MixPose.Setup) { + constraint.mix = constraint.data.mix + (frames[frames.Length + PREV_MIX] - constraint.data.mix) * alpha; + constraint.bendDirection = direction == MixDirection.Out ? constraint.data.bendDirection + : (int)frames[frames.Length + PREV_BEND_DIRECTION]; + } else { + constraint.mix += (frames[frames.Length + PREV_MIX] - constraint.mix) * alpha; + if (direction == MixDirection.In) constraint.bendDirection = (int)frames[frames.Length + PREV_BEND_DIRECTION]; + } + return; + } + + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + float mix = frames[frame + PREV_MIX]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + if (pose == MixPose.Setup) { + constraint.mix = constraint.data.mix + (mix + (frames[frame + MIX] - mix) * percent - constraint.data.mix) * alpha; + constraint.bendDirection = direction == MixDirection.Out ? constraint.data.bendDirection : (int)frames[frame + PREV_BEND_DIRECTION]; + } else { + constraint.mix += (mix + (frames[frame + MIX] - mix) * percent - constraint.mix) * alpha; + if (direction == MixDirection.In) constraint.bendDirection = (int)frames[frame + PREV_BEND_DIRECTION]; + } + } + } + + public class TransformConstraintTimeline : CurveTimeline { + public const int ENTRIES = 5; + private const int PREV_TIME = -5, PREV_ROTATE = -4, PREV_TRANSLATE = -3, PREV_SCALE = -2, PREV_SHEAR = -1; + private const int ROTATE = 1, TRANSLATE = 2, SCALE = 3, SHEAR = 4; + + internal int transformConstraintIndex; + internal float[] frames; + + public int TransformConstraintIndex { get { return transformConstraintIndex; } set { transformConstraintIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, rotate mix, translate mix, scale mix, shear mix, ... + + override public int PropertyId { + get { return ((int)TimelineType.TransformConstraint << 24) + transformConstraintIndex; } + } + + public TransformConstraintTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + public void SetFrame (int frameIndex, float time, float rotateMix, float translateMix, float scaleMix, float shearMix) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + ROTATE] = rotateMix; + frames[frameIndex + TRANSLATE] = translateMix; + frames[frameIndex + SCALE] = scaleMix; + frames[frameIndex + SHEAR] = shearMix; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + TransformConstraint constraint = skeleton.transformConstraints.Items[transformConstraintIndex]; + float[] frames = this.frames; + if (time < frames[0]) { + var data = constraint.data; + switch (pose) { + case MixPose.Setup: + constraint.rotateMix = data.rotateMix; + constraint.translateMix = data.translateMix; + constraint.scaleMix = data.scaleMix; + constraint.shearMix = data.shearMix; + return; + case MixPose.Current: + constraint.rotateMix += (data.rotateMix - constraint.rotateMix) * alpha; + constraint.translateMix += (data.translateMix - constraint.translateMix) * alpha; + constraint.scaleMix += (data.scaleMix - constraint.scaleMix) * alpha; + constraint.shearMix += (data.shearMix - constraint.shearMix) * alpha; + return; + } + return; + } + + float rotate, translate, scale, shear; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + rotate = frames[i + PREV_ROTATE]; + translate = frames[i + PREV_TRANSLATE]; + scale = frames[i + PREV_SCALE]; + shear = frames[i + PREV_SHEAR]; + } else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + rotate = frames[frame + PREV_ROTATE]; + translate = frames[frame + PREV_TRANSLATE]; + scale = frames[frame + PREV_SCALE]; + shear = frames[frame + PREV_SHEAR]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + rotate += (frames[frame + ROTATE] - rotate) * percent; + translate += (frames[frame + TRANSLATE] - translate) * percent; + scale += (frames[frame + SCALE] - scale) * percent; + shear += (frames[frame + SHEAR] - shear) * percent; + } + if (pose == MixPose.Setup) { + TransformConstraintData data = constraint.data; + constraint.rotateMix = data.rotateMix + (rotate - data.rotateMix) * alpha; + constraint.translateMix = data.translateMix + (translate - data.translateMix) * alpha; + constraint.scaleMix = data.scaleMix + (scale - data.scaleMix) * alpha; + constraint.shearMix = data.shearMix + (shear - data.shearMix) * alpha; + } else { + constraint.rotateMix += (rotate - constraint.rotateMix) * alpha; + constraint.translateMix += (translate - constraint.translateMix) * alpha; + constraint.scaleMix += (scale - constraint.scaleMix) * alpha; + constraint.shearMix += (shear - constraint.shearMix) * alpha; + } + } + } + + public class PathConstraintPositionTimeline : CurveTimeline { + public const int ENTRIES = 2; + protected const int PREV_TIME = -2, PREV_VALUE = -1; + protected const int VALUE = 1; + + internal int pathConstraintIndex; + internal float[] frames; + + override public int PropertyId { + get { return ((int)TimelineType.PathConstraintPosition << 24) + pathConstraintIndex; } + } + + public PathConstraintPositionTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + public int PathConstraintIndex { get { return pathConstraintIndex; } set { pathConstraintIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, position, ... + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, float value) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + VALUE] = value; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + PathConstraint constraint = skeleton.pathConstraints.Items[pathConstraintIndex]; + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + constraint.position = constraint.data.position; + return; + case MixPose.Current: + constraint.position += (constraint.data.position - constraint.position) * alpha; + return; + } + return; + } + + float position; + if (time >= frames[frames.Length - ENTRIES]) // Time is after last frame. + position = frames[frames.Length + PREV_VALUE]; + else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + position = frames[frame + PREV_VALUE]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + position += (frames[frame + VALUE] - position) * percent; + } + if (pose == MixPose.Setup) + constraint.position = constraint.data.position + (position - constraint.data.position) * alpha; + else + constraint.position += (position - constraint.position) * alpha; + } + } + + public class PathConstraintSpacingTimeline : PathConstraintPositionTimeline { + override public int PropertyId { + get { return ((int)TimelineType.PathConstraintSpacing << 24) + pathConstraintIndex; } + } + + public PathConstraintSpacingTimeline (int frameCount) + : base(frameCount) { + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + PathConstraint constraint = skeleton.pathConstraints.Items[pathConstraintIndex]; + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + constraint.spacing = constraint.data.spacing; + return; + case MixPose.Current: + constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha; + return; + } + return; + } + + float spacing; + if (time >= frames[frames.Length - ENTRIES]) // Time is after last frame. + spacing = frames[frames.Length + PREV_VALUE]; + else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + spacing = frames[frame + PREV_VALUE]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + spacing += (frames[frame + VALUE] - spacing) * percent; + } + + if (pose == MixPose.Setup) + constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha; + else + constraint.spacing += (spacing - constraint.spacing) * alpha; + } + } + + public class PathConstraintMixTimeline : CurveTimeline { + public const int ENTRIES = 3; + private const int PREV_TIME = -3, PREV_ROTATE = -2, PREV_TRANSLATE = -1; + private const int ROTATE = 1, TRANSLATE = 2; + + internal int pathConstraintIndex; + internal float[] frames; + + public int PathConstraintIndex { get { return pathConstraintIndex; } set { pathConstraintIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, rotate mix, translate mix, ... + + override public int PropertyId { + get { return ((int)TimelineType.PathConstraintMix << 24) + pathConstraintIndex; } + } + + public PathConstraintMixTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + /// Sets the time and mixes of the specified keyframe. + public void SetFrame (int frameIndex, float time, float rotateMix, float translateMix) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + ROTATE] = rotateMix; + frames[frameIndex + TRANSLATE] = translateMix; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha, MixPose pose, MixDirection direction) { + PathConstraint constraint = skeleton.pathConstraints.Items[pathConstraintIndex]; + float[] frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.Setup: + constraint.rotateMix = constraint.data.rotateMix; + constraint.translateMix = constraint.data.translateMix; + return; + case MixPose.Current: + constraint.rotateMix += (constraint.data.rotateMix - constraint.rotateMix) * alpha; + constraint.translateMix += (constraint.data.translateMix - constraint.translateMix) * alpha; + return; + } + return; + } + + float rotate, translate; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + rotate = frames[frames.Length + PREV_ROTATE]; + translate = frames[frames.Length + PREV_TRANSLATE]; + } else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, ENTRIES); + rotate = frames[frame + PREV_ROTATE]; + translate = frames[frame + PREV_TRANSLATE]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + rotate += (frames[frame + ROTATE] - rotate) * percent; + translate += (frames[frame + TRANSLATE] - translate) * percent; + } + + if (pose == MixPose.Setup) { + constraint.rotateMix = constraint.data.rotateMix + (rotate - constraint.data.rotateMix) * alpha; + constraint.translateMix = constraint.data.translateMix + (translate - constraint.data.translateMix) * alpha; + } else { + constraint.rotateMix += (rotate - constraint.rotateMix) * alpha; + constraint.translateMix += (translate - constraint.translateMix) * alpha; + } + } + } +} diff --git a/Assets/Spine/SpineCSharp/AnimationState.cs b/Assets/Spine/SpineCSharp/AnimationState.cs new file mode 100644 index 0000000..465e7b6 --- /dev/null +++ b/Assets/Spine/SpineCSharp/AnimationState.cs @@ -0,0 +1,1066 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + public class AnimationState { + static readonly Animation EmptyAnimation = new Animation("", new ExposedList(), 0); + internal const int Subsequent = 0, First = 1, Dip = 2, DipMix = 3; + + private AnimationStateData data; + + Pool trackEntryPool = new Pool(); + private readonly ExposedList tracks = new ExposedList(); + private readonly ExposedList events = new ExposedList(); + private readonly EventQueue queue; // Initialized by constructor. + + private readonly HashSet propertyIDs = new HashSet(); + private readonly ExposedList mixingTo = new ExposedList(); + private bool animationsChanged; + + private float timeScale = 1; + + public AnimationStateData Data { get { return data; } } + /// A list of tracks that have animations, which may contain nulls. + public ExposedList Tracks { get { return tracks; } } + public float TimeScale { get { return timeScale; } set { timeScale = value; } } + + public delegate void TrackEntryDelegate (TrackEntry trackEntry); + public event TrackEntryDelegate Start, Interrupt, End, Dispose, Complete; + + public delegate void TrackEntryEventDelegate (TrackEntry trackEntry, Event e); + public event TrackEntryEventDelegate Event; + + public AnimationState (AnimationStateData data) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + this.data = data; + this.queue = new EventQueue( + this, + delegate { this.animationsChanged = true; }, + trackEntryPool + ); + } + + /// + /// Increments the track entry times, setting queued animations as current if needed + /// delta time + public void Update (float delta) { + delta *= timeScale; + var tracksItems = tracks.Items; + for (int i = 0, n = tracks.Count; i < n; i++) { + TrackEntry current = tracksItems[i]; + if (current == null) continue; + + current.animationLast = current.nextAnimationLast; + current.trackLast = current.nextTrackLast; + + float currentDelta = delta * current.timeScale; + + if (current.delay > 0) { + current.delay -= currentDelta; + if (current.delay > 0) continue; + currentDelta = -current.delay; + current.delay = 0; + } + + TrackEntry next = current.next; + if (next != null) { + // When the next entry's delay is passed, change to the next entry, preserving leftover time. + float nextTime = current.trackLast - next.delay; + if (nextTime >= 0) { + next.delay = 0; + next.trackTime = nextTime + (delta * next.timeScale); + current.trackTime += currentDelta; + SetCurrent(i, next, true); + while (next.mixingFrom != null) { + next.mixTime += currentDelta; + next = next.mixingFrom; + } + continue; + } + } else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) { + // Clear the track when there is no next entry, the track end time is reached, and there is no mixingFrom. + tracksItems[i] = null; + + queue.End(current); + DisposeNext(current); + continue; + } + if (current.mixingFrom != null && UpdateMixingFrom(current, delta)) { + // End mixing from entries once all have completed. + var from = current.mixingFrom; + current.mixingFrom = null; + while (from != null) { + queue.End(from); + from = from.mixingFrom; + } + } + + current.trackTime += currentDelta; + } + + queue.Drain(); + } + + /// Returns true when all mixing from entries are complete. + private bool UpdateMixingFrom (TrackEntry to, float delta) { + TrackEntry from = to.mixingFrom; + if (from == null) return true; + + bool finished = UpdateMixingFrom(from, delta); + + from.animationLast = from.nextAnimationLast; + from.trackLast = from.nextTrackLast; + + // Require mixTime > 0 to ensure the mixing from entry was applied at least once. + if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) { + // Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame). + if (from.totalAlpha == 0 || to.mixDuration == 0) { + to.mixingFrom = from.mixingFrom; + to.interruptAlpha = from.interruptAlpha; + queue.End(from); + } + return finished; + } + + from.trackTime += delta * from.timeScale; + to.mixTime += delta * to.timeScale; + return false; + } + + /// + /// Poses the skeleton using the track entry animations. There are no side effects other than invoking listeners, so the + /// animation state can be applied to multiple skeletons to pose them identically. + public bool Apply (Skeleton skeleton) { + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); + if (animationsChanged) AnimationsChanged(); + + var events = this.events; + + bool applied = false; + var tracksItems = tracks.Items; + for (int i = 0, m = tracks.Count; i < m; i++) { + TrackEntry current = tracksItems[i]; + if (current == null || current.delay > 0) continue; + applied = true; + MixPose currentPose = i == 0 ? MixPose.Current : MixPose.CurrentLayered; + + // Apply mixing from entries first. + float mix = current.alpha; + if (current.mixingFrom != null) + mix *= ApplyMixingFrom(current, skeleton, currentPose); + else if (current.trackTime >= current.trackEnd && current.next == null) // + mix = 0; // Set to setup pose the last time the entry will be applied. + + // Apply current entry. + float animationLast = current.animationLast, animationTime = current.AnimationTime; + int timelineCount = current.animation.timelines.Count; + var timelines = current.animation.timelines; + var timelinesItems = timelines.Items; + if (mix == 1) { + for (int ii = 0; ii < timelineCount; ii++) + timelinesItems[ii].Apply(skeleton, animationLast, animationTime, events, 1, MixPose.Setup, MixDirection.In); + } else { + var timelineData = current.timelineData.Items; + + bool firstFrame = current.timelinesRotation.Count == 0; + if (firstFrame) current.timelinesRotation.EnsureCapacity(timelines.Count << 1); + var timelinesRotation = current.timelinesRotation.Items; + + for (int ii = 0; ii < timelineCount; ii++) { + Timeline timeline = timelinesItems[ii]; + MixPose pose = timelineData[ii] >= AnimationState.First ? MixPose.Setup : currentPose; + var rotateTimeline = timeline as RotateTimeline; + if (rotateTimeline != null) + ApplyRotateTimeline(rotateTimeline, skeleton, animationTime, mix, pose, timelinesRotation, ii << 1, firstFrame); + else + timeline.Apply(skeleton, animationLast, animationTime, events, mix, pose, MixDirection.In); + } + } + QueueEvents(current, animationTime); + events.Clear(false); + current.nextAnimationLast = animationTime; + current.nextTrackLast = current.trackTime; + } + + queue.Drain(); + return applied; + } + + private float ApplyMixingFrom (TrackEntry to, Skeleton skeleton, MixPose currentPose) { + TrackEntry from = to.mixingFrom; + if (from.mixingFrom != null) ApplyMixingFrom(from, skeleton, currentPose); + + float mix; + if (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes. + mix = 1; + currentPose = MixPose.Setup; + } else { + mix = to.mixTime / to.mixDuration; + if (mix > 1) mix = 1; + } + + var eventBuffer = mix < from.eventThreshold ? this.events : null; + bool attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold; + float animationLast = from.animationLast, animationTime = from.AnimationTime; + var timelines = from.animation.timelines; + int timelineCount = timelines.Count; + var timelinesItems = timelines.Items; + var timelineData = from.timelineData.Items; + var timelineDipMix = from.timelineDipMix.Items; + + bool firstFrame = from.timelinesRotation.Count == 0; + if (firstFrame) from.timelinesRotation.Resize(timelines.Count << 1); // from.timelinesRotation.setSize + var timelinesRotation = from.timelinesRotation.Items; + + MixPose pose; + float alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; + from.totalAlpha = 0; + for (int i = 0; i < timelineCount; i++) { + Timeline timeline = timelinesItems[i]; + switch (timelineData[i]) { + case Subsequent: + if (!attachments && timeline is AttachmentTimeline) continue; + if (!drawOrder && timeline is DrawOrderTimeline) continue; + pose = currentPose; + alpha = alphaMix; + break; + case First: + pose = MixPose.Setup; + alpha = alphaMix; + break; + case Dip: + pose = MixPose.Setup; + alpha = alphaDip; + break; + default: + pose = MixPose.Setup; + TrackEntry dipMix = timelineDipMix[i]; + alpha = alphaDip * Math.Max(0, 1 - dipMix.mixTime / dipMix.mixDuration); + break; + } + from.totalAlpha += alpha; + var rotateTimeline = timeline as RotateTimeline; + if (rotateTimeline != null) { + ApplyRotateTimeline(rotateTimeline, skeleton, animationTime, alpha, pose, timelinesRotation, i << 1, firstFrame); + } else { + timeline.Apply(skeleton, animationLast, animationTime, eventBuffer, alpha, pose, MixDirection.Out); + } + } + + if (to.mixDuration > 0) QueueEvents(from, animationTime); + this.events.Clear(false); + from.nextAnimationLast = animationTime; + from.nextTrackLast = from.trackTime; + + return mix; + } + + static private void ApplyRotateTimeline (RotateTimeline rotateTimeline, Skeleton skeleton, float time, float alpha, MixPose pose, + float[] timelinesRotation, int i, bool firstFrame) { + + if (firstFrame) timelinesRotation[i] = 0; + + if (alpha == 1) { + rotateTimeline.Apply(skeleton, 0, time, null, 1, pose, MixDirection.In); + return; + } + + Bone bone = skeleton.bones.Items[rotateTimeline.boneIndex]; + float[] frames = rotateTimeline.frames; + if (time < frames[0]) { + if (pose == MixPose.Setup) bone.rotation = bone.data.rotation; + return; + } + + float r2; + if (time >= frames[frames.Length - RotateTimeline.ENTRIES]) // Time is after last frame. + r2 = bone.data.rotation + frames[frames.Length + RotateTimeline.PREV_ROTATION]; + else { + // Interpolate between the previous frame and the current frame. + int frame = Animation.BinarySearch(frames, time, RotateTimeline.ENTRIES); + float prevRotation = frames[frame + RotateTimeline.PREV_ROTATION]; + float frameTime = frames[frame]; + float percent = rotateTimeline.GetCurvePercent((frame >> 1) - 1, + 1 - (time - frameTime) / (frames[frame + RotateTimeline.PREV_TIME] - frameTime)); + + r2 = frames[frame + RotateTimeline.ROTATION] - prevRotation; + r2 -= (16384 - (int)(16384.499999999996 - r2 / 360)) * 360; + r2 = prevRotation + r2 * percent + bone.data.rotation; + r2 -= (16384 - (int)(16384.499999999996 - r2 / 360)) * 360; + } + + // Mix between rotations using the direction of the shortest route on the first frame while detecting crosses. + float r1 = pose == MixPose.Setup ? bone.data.rotation : bone.rotation; + float total, diff = r2 - r1; + if (diff == 0) { + total = timelinesRotation[i]; + } else { + diff -= (16384 - (int)(16384.499999999996 - diff / 360)) * 360; + float lastTotal, lastDiff; + if (firstFrame) { + lastTotal = 0; + lastDiff = diff; + } else { + lastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops. + lastDiff = timelinesRotation[i + 1]; // Difference between bones. + } + bool current = diff > 0, dir = lastTotal >= 0; + // Detect cross at 0 (not 180). + if (Math.Sign(lastDiff) != Math.Sign(diff) && Math.Abs(lastDiff) <= 90) { + // A cross after a 360 rotation is a loop. + if (Math.Abs(lastTotal) > 180) lastTotal += 360 * Math.Sign(lastTotal); + dir = current; + } + total = diff + lastTotal - lastTotal % 360; // Store loops as part of lastTotal. + if (dir != current) total += 360 * Math.Sign(lastTotal); + timelinesRotation[i] = total; + } + timelinesRotation[i + 1] = diff; + r1 += total * alpha; + bone.rotation = r1 - (16384 - (int)(16384.499999999996 - r1 / 360)) * 360; + } + + private void QueueEvents (TrackEntry entry, float animationTime) { + float animationStart = entry.animationStart, animationEnd = entry.animationEnd; + float duration = animationEnd - animationStart; + float trackLastWrapped = entry.trackLast % duration; + + // Queue events before complete. + var events = this.events; + var eventsItems = events.Items; + int i = 0, n = events.Count; + for (; i < n; i++) { + var e = eventsItems[i]; + if (e.time < trackLastWrapped) break; + if (e.time > animationEnd) continue; // Discard events outside animation start/end. + queue.Event(entry, e); + } + + // Queue complete if completed a loop iteration or the animation. + bool complete = false; + if (entry.loop) + complete = duration == 0 || (trackLastWrapped > entry.trackTime % duration); + else + complete = animationTime >= animationEnd && entry.animationLast < animationEnd; + if (complete) queue.Complete(entry); + + // Queue events after complete. + for (; i < n; i++) { + Event e = eventsItems[i]; + if (e.time < animationStart) continue; // Discard events outside animation start/end. + queue.Event(entry, eventsItems[i]); + } + } + + /// + /// Removes all animations from all tracks, leaving skeletons in their previous pose. + /// It may be desired to use to mix the skeletons back to the setup pose, + /// rather than leaving them in their previous pose. + public void ClearTracks () { + bool oldDrainDisabled = queue.drainDisabled; + queue.drainDisabled = true; + for (int i = 0, n = tracks.Count; i < n; i++) { + ClearTrack(i); + } + tracks.Clear(); + queue.drainDisabled = oldDrainDisabled; + queue.Drain(); + } + + /// + /// Removes all animations from the tracks, leaving skeletons in their previous pose. + /// It may be desired to use to mix the skeletons back to the setup pose, + /// rather than leaving them in their previous pose. + public void ClearTrack (int trackIndex) { + if (trackIndex >= tracks.Count) return; + TrackEntry current = tracks.Items[trackIndex]; + if (current == null) return; + + queue.End(current); + + DisposeNext(current); + + TrackEntry entry = current; + while (true) { + TrackEntry from = entry.mixingFrom; + if (from == null) break; + queue.End(from); + entry.mixingFrom = null; + entry = from; + } + + tracks.Items[current.trackIndex] = null; + + queue.Drain(); + } + + /// Sets the active TrackEntry for a given track number. + private void SetCurrent (int index, TrackEntry current, bool interrupt) { + TrackEntry from = ExpandToIndex(index); + tracks.Items[index] = current; + + if (from != null) { + if (interrupt) queue.Interrupt(from); + current.mixingFrom = from; + current.mixTime = 0; + + // Store interrupted mix percentage. + if (from.mixingFrom != null && from.mixDuration > 0) + current.interruptAlpha *= Math.Min(1, from.mixTime / from.mixDuration); + + from.timelinesRotation.Clear(); // Reset rotation for mixing out, in case entry was mixed in. + } + + queue.Start(current); // triggers AnimationsChanged + } + + + /// Sets an animation by name. + public TrackEntry SetAnimation (int trackIndex, string animationName, bool loop) { + Animation animation = data.skeletonData.FindAnimation(animationName); + if (animation == null) throw new ArgumentException("Animation not found: " + animationName, "animationName"); + return SetAnimation(trackIndex, animation, loop); + } + + /// Sets the current animation for a track, discarding any queued animations. + /// If true, the animation will repeat. + /// If false, it will not, instead its last frame is applied if played beyond its duration. + /// In either case determines when the track is cleared. + /// + /// A track entry to allow further customization of animation playback. References to the track entry must not be kept + /// after . + public TrackEntry SetAnimation (int trackIndex, Animation animation, bool loop) { + if (animation == null) throw new ArgumentNullException("animation", "animation cannot be null."); + bool interrupt = true; + TrackEntry current = ExpandToIndex(trackIndex); + if (current != null) { + if (current.nextTrackLast == -1) { + // Don't mix from an entry that was never applied. + tracks.Items[trackIndex] = current.mixingFrom; + queue.Interrupt(current); + queue.End(current); + DisposeNext(current); + current = current.mixingFrom; + interrupt = false; + } else { + DisposeNext(current); + } + } + TrackEntry entry = NewTrackEntry(trackIndex, animation, loop, current); + SetCurrent(trackIndex, entry, interrupt); + queue.Drain(); + return entry; + } + + /// Queues an animation by name. + /// + public TrackEntry AddAnimation (int trackIndex, string animationName, bool loop, float delay) { + Animation animation = data.skeletonData.FindAnimation(animationName); + if (animation == null) throw new ArgumentException("Animation not found: " + animationName, "animationName"); + return AddAnimation(trackIndex, animation, loop, delay); + } + + /// Adds an animation to be played delay seconds after the current or last queued animation + /// for a track. If the track is empty, it is equivalent to calling . + /// + /// Seconds to begin this animation after the start of the previous animation. May be <= 0 to use the animation + /// duration of the previous track minus any mix duration plus the negative delay. + /// + /// A track entry to allow further customization of animation playback. References to the track entry must not be kept + /// after + public TrackEntry AddAnimation (int trackIndex, Animation animation, bool loop, float delay) { + if (animation == null) throw new ArgumentNullException("animation", "animation cannot be null."); + + TrackEntry last = ExpandToIndex(trackIndex); + if (last != null) { + while (last.next != null) + last = last.next; + } + + TrackEntry entry = NewTrackEntry(trackIndex, animation, loop, last); + + if (last == null) { + SetCurrent(trackIndex, entry, true); + queue.Drain(); + } else { + last.next = entry; + if (delay <= 0) { + float duration = last.animationEnd - last.animationStart; + if (duration != 0) { + if (last.loop) { + delay += duration * (1 + (int)(last.trackTime / duration)); + } else { + delay += duration; + } + delay -= data.GetMix(last.animation, animation); + } else + delay = 0; + } + } + + entry.delay = delay; + return entry; + } + + /// + /// Sets an empty animation for a track, discarding any queued animations, and mixes to it over the specified mix duration. + public TrackEntry SetEmptyAnimation (int trackIndex, float mixDuration) { + TrackEntry entry = SetAnimation(trackIndex, AnimationState.EmptyAnimation, false); + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + } + + /// + /// Adds an empty animation to be played after the current or last queued animation for a track, and mixes to it over the + /// specified mix duration. + /// + /// A track entry to allow further customization of animation playback. References to the track entry must not be kept after . + /// + /// Track number. + /// Mix duration. + /// Seconds to begin this animation after the start of the previous animation. May be <= 0 to use the animation + /// duration of the previous track minus any mix duration plus the negative delay. + public TrackEntry AddEmptyAnimation (int trackIndex, float mixDuration, float delay) { + if (delay <= 0) delay -= mixDuration; + TrackEntry entry = AddAnimation(trackIndex, AnimationState.EmptyAnimation, false, delay); + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + } + + /// + /// Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix duration. + public void SetEmptyAnimations (float mixDuration) { + bool oldDrainDisabled = queue.drainDisabled; + queue.drainDisabled = true; + for (int i = 0, n = tracks.Count; i < n; i++) { + TrackEntry current = tracks.Items[i]; + if (current != null) SetEmptyAnimation(i, mixDuration); + } + queue.drainDisabled = oldDrainDisabled; + queue.Drain(); + } + + private TrackEntry ExpandToIndex (int index) { + if (index < tracks.Count) return tracks.Items[index]; + while (index >= tracks.Count) + tracks.Add(null); + return null; + } + + /// Object-pooling version of new TrackEntry. Obtain an unused TrackEntry from the pool and clear/initialize its values. + /// May be null. + private TrackEntry NewTrackEntry (int trackIndex, Animation animation, bool loop, TrackEntry last) { + TrackEntry entry = trackEntryPool.Obtain(); // Pooling + entry.trackIndex = trackIndex; + entry.animation = animation; + entry.loop = loop; + + entry.eventThreshold = 0; + entry.attachmentThreshold = 0; + entry.drawOrderThreshold = 0; + + entry.animationStart = 0; + entry.animationEnd = animation.Duration; + entry.animationLast = -1; + entry.nextAnimationLast = -1; + + entry.delay = 0; + entry.trackTime = 0; + entry.trackLast = -1; + entry.nextTrackLast = -1; // nextTrackLast == -1 signifies a TrackEntry that wasn't applied yet. + entry.trackEnd = float.MaxValue; // loop ? float.MaxValue : animation.Duration; + entry.timeScale = 1; + + entry.alpha = 1; + entry.interruptAlpha = 1; + entry.mixTime = 0; + entry.mixDuration = (last == null) ? 0 : data.GetMix(last.animation, animation); + return entry; + } + + /// Dispose all track entries queued after the given TrackEntry. + private void DisposeNext (TrackEntry entry) { + TrackEntry next = entry.next; + while (next != null) { + queue.Dispose(next); + next = next.next; + } + entry.next = null; + } + + private void AnimationsChanged () { + animationsChanged = false; + + var propertyIDs = this.propertyIDs; + propertyIDs.Clear(); + var mixingTo = this.mixingTo; + + var tracksItems = tracks.Items; + for (int i = 0, n = tracks.Count; i < n; i++) { + var entry = tracksItems[i]; + if (entry != null) entry.SetTimelineData(null, mixingTo, propertyIDs); + } + } + + /// The track entry for the animation currently playing on the track, or null if no animation is currently playing. + public TrackEntry GetCurrent (int trackIndex) { + return (trackIndex >= tracks.Count) ? null : tracks.Items[trackIndex]; + } + + override public string ToString () { + var buffer = new System.Text.StringBuilder(); + for (int i = 0, n = tracks.Count; i < n; i++) { + TrackEntry entry = tracks.Items[i]; + if (entry == null) continue; + if (buffer.Length > 0) buffer.Append(", "); + buffer.Append(entry.ToString()); + } + return buffer.Length == 0 ? "" : buffer.ToString(); + } + + internal void OnStart (TrackEntry entry) { if (Start != null) Start(entry); } + internal void OnInterrupt (TrackEntry entry) { if (Interrupt != null) Interrupt(entry); } + internal void OnEnd (TrackEntry entry) { if (End != null) End(entry); } + internal void OnDispose (TrackEntry entry) { if (Dispose != null) Dispose(entry); } + internal void OnComplete (TrackEntry entry) { if (Complete != null) Complete(entry); } + internal void OnEvent (TrackEntry entry, Event e) { if (Event != null) Event(entry, e); } + } + + /// State for the playback of an animation. + public class TrackEntry : Pool.IPoolable { + internal Animation animation; + + internal TrackEntry next, mixingFrom; + internal int trackIndex; + + internal bool loop; + internal float eventThreshold, attachmentThreshold, drawOrderThreshold; + internal float animationStart, animationEnd, animationLast, nextAnimationLast; + internal float delay, trackTime, trackLast, nextTrackLast, trackEnd, timeScale = 1f; + internal float alpha, mixTime, mixDuration, interruptAlpha, totalAlpha; + internal readonly ExposedList timelineData = new ExposedList(); + internal readonly ExposedList timelineDipMix = new ExposedList(); + internal readonly ExposedList timelinesRotation = new ExposedList(); + + // IPoolable.Reset() + public void Reset () { + next = null; + mixingFrom = null; + animation = null; + timelineData.Clear(); + timelineDipMix.Clear(); + timelinesRotation.Clear(); + + Start = null; + Interrupt = null; + End = null; + Dispose = null; + Complete = null; + Event = null; + } + + /// Sets the timeline data. + /// May be null. + internal TrackEntry SetTimelineData (TrackEntry to, ExposedList mixingToArray, HashSet propertyIDs) { + if (to != null) mixingToArray.Add(to); + var lastEntry = mixingFrom != null ? mixingFrom.SetTimelineData(this, mixingToArray, propertyIDs) : this; + if (to != null) mixingToArray.Pop(); + + var mixingTo = mixingToArray.Items; + int mixingToLast = mixingToArray.Count - 1; + var timelines = animation.timelines.Items; + int timelinesCount = animation.timelines.Count; + var timelineDataItems = timelineData.Resize(timelinesCount).Items; // timelineData.setSize(timelinesCount); + timelineDipMix.Clear(); + var timelineDipMixItems = timelineDipMix.Resize(timelinesCount).Items; //timelineDipMix.setSize(timelinesCount); + + // outer: + for (int i = 0; i < timelinesCount; i++) { + int id = timelines[i].PropertyId; + if (!propertyIDs.Add(id)) { + timelineDataItems[i] = AnimationState.Subsequent; + } else if (to == null || !to.HasTimeline(id)) { + timelineDataItems[i] = AnimationState.First; + } else { + for (int ii = mixingToLast; ii >= 0; ii--) { + var entry = mixingTo[ii]; + if (!entry.HasTimeline(id)) { + if (entry.mixDuration > 0) { + timelineDataItems[i] = AnimationState.DipMix; + timelineDipMixItems[i] = entry; + goto continue_outer; // continue outer; + } + break; + } + } + timelineDataItems[i] = AnimationState.Dip; + } + continue_outer: {} + } + return lastEntry; + } + + bool HasTimeline (int id) { + var timelines = animation.timelines.Items; + for (int i = 0, n = animation.timelines.Count; i < n; i++) + if (timelines[i].PropertyId == id) return true; + return false; + } + + /// The index of the track where this entry is either current or queued. + public int TrackIndex { get { return trackIndex; } } + + /// The animation to apply for this track entry. + public Animation Animation { get { return animation; } } + + /// + /// If true, the animation will repeat. If false, it will not, instead its last frame is applied if played beyond its duration. + public bool Loop { get { return loop; } set { loop = value; } } + + /// + /// Seconds to postpone playing the animation. When a track entry is the current track entry, delay postpones incrementing + /// the track time. When a track entry is queued, delay is the time from the start of the previous animation to when the + /// track entry will become the current track entry. + public float Delay { get { return delay; } set { delay = value; } } + + /// + /// Current time in seconds this track entry has been the current track entry. The track time determines + /// . The track time can be set to start the animation at a time other than 0, without affecting looping. + public float TrackTime { get { return trackTime; } set { trackTime = value; } } + + /// + /// The track time in seconds when this animation will be removed from the track. Defaults to the animation duration for + /// non-looping animations and to for looping animations. If the track end time is reached and no + /// other animations are queued for playback, and mixing from any previous animations is complete, properties keyed by the animation, + /// are set to the setup pose and the track is cleared. + /// + /// It may be desired to use to mix the properties back to the + /// setup pose over time, rather than have it happen instantly. + /// + public float TrackEnd { get { return trackEnd; } set { trackEnd = value; } } + + /// + /// Seconds when this animation starts, both initially and after looping. Defaults to 0. + /// + /// When changing the animation start time, it often makes sense to set to the same value to + /// prevent timeline keys before the start time from triggering. + /// + public float AnimationStart { get { return animationStart; } set { animationStart = value; } } + + /// + /// Seconds for the last frame of this animation. Non-looping animations won't play past this time. Looping animations will + /// loop back to at this time. Defaults to the animation duration. + public float AnimationEnd { get { return animationEnd; } set { animationEnd = value; } } + + /// + /// The time in seconds this animation was last applied. Some timelines use this for one-time triggers. Eg, when this + /// animation is applied, event timelines will fire all events between the animation last time (exclusive) and animation time + /// (inclusive). Defaults to -1 to ensure triggers on frame 0 happen the first time this animation is applied. + public float AnimationLast { + get { return animationLast; } + set { + animationLast = value; + nextAnimationLast = value; + } + } + + /// + /// Uses to compute the animation time between . and + /// . When the track time is 0, the animation time is equal to the animation start time. + /// + public float AnimationTime { + get { + if (loop) { + float duration = animationEnd - animationStart; + if (duration == 0) return animationStart; + return (trackTime % duration) + animationStart; + } + return Math.Min(trackTime + animationStart, animationEnd); + } + } + + /// + /// Multiplier for the delta time when the animation state is updated, causing time for this animation to play slower or + /// faster. Defaults to 1. + /// + public float TimeScale { get { return timeScale; } set { timeScale = value; } } + + /// + /// Values less than 1 mix this animation with the last skeleton pose. Defaults to 1, which overwrites the last skeleton pose with + /// this animation. + /// + /// Typically track 0 is used to completely pose the skeleton, then alpha can be used on higher tracks. It doesn't make sense + /// to use alpha on track 0 if the skeleton pose is from the last frame render. + /// + public float Alpha { get { return alpha; } set { alpha = value; } } + + /// + /// When the mix percentage (mix time / mix duration) is less than the event threshold, event timelines for the animation + /// being mixed out will be applied. Defaults to 0, so event timelines are not applied for an animation being mixed out. + public float EventThreshold { get { return eventThreshold; } set { eventThreshold = value; } } + + /// + /// When the mix percentage (mix time / mix duration) is less than the attachment threshold, attachment timelines for the + /// animation being mixed out will be applied. Defaults to 0, so attachment timelines are not applied for an animation being + /// mixed out. + public float AttachmentThreshold { get { return attachmentThreshold; } set { attachmentThreshold = value; } } + + /// + /// When the mix percentage (mix time / mix duration) is less than the draw order threshold, draw order timelines for the + /// animation being mixed out will be applied. Defaults to 0, so draw order timelines are not applied for an animation being + /// mixed out. + /// + public float DrawOrderThreshold { get { return drawOrderThreshold; } set { drawOrderThreshold = value; } } + + /// + /// The animation queued to start after this animation, or null. + public TrackEntry Next { get { return next; } } + + /// + /// Returns true if at least one loop has been completed. + public bool IsComplete { + get { return trackTime >= animationEnd - animationStart; } + } + + /// + /// Seconds from 0 to the mix duration when mixing from the previous animation to this animation. May be slightly more than + /// when the mix is complete. + public float MixTime { get { return mixTime; } set { mixTime = value; } } + + /// + /// Seconds for mixing from the previous animation to this animation. Defaults to the value provided by + /// based on the animation before this animation (if any). + /// + /// The mix duration can be set manually rather than use the value from AnimationStateData.GetMix. + /// In that case, the mixDuration must be set before is next called. + /// + /// When using with a + /// delay less than or equal to 0, note the is set using the mix duration from the + /// + /// + /// + public float MixDuration { get { return mixDuration; } set { mixDuration = value; } } + + /// + /// The track entry for the previous animation when mixing from the previous animation to this animation, or null if no + /// mixing is currently occuring. When mixing from multiple animations, MixingFrom makes up a linked list. + public TrackEntry MixingFrom { get { return mixingFrom; } } + + public event AnimationState.TrackEntryDelegate Start, Interrupt, End, Dispose, Complete; + public event AnimationState.TrackEntryEventDelegate Event; + internal void OnStart () { if (Start != null) Start(this); } + internal void OnInterrupt () { if (Interrupt != null) Interrupt(this); } + internal void OnEnd () { if (End != null) End(this); } + internal void OnDispose () { if (Dispose != null) Dispose(this); } + internal void OnComplete () { if (Complete != null) Complete(this); } + internal void OnEvent (Event e) { if (Event != null) Event(this, e); } + + /// + /// Resets the rotation directions for mixing this entry's rotate timelines. This can be useful to avoid bones rotating the + /// long way around when using and starting animations on other tracks. + /// + /// Mixing involves finding a rotation between two others, which has two possible solutions: the short way or the long way around. + /// The two rotations likely change over time, so which direction is the short or long way also changes. + /// If the short way was always chosen, bones would flip to the other side when that direction became the long way. + /// TrackEntry chooses the short way the first time it is applied and remembers that direction. + public void ResetRotationDirections () { + timelinesRotation.Clear(); + } + + override public string ToString () { + return animation == null ? "" : animation.name; + } + } + + class EventQueue { + private readonly List eventQueueEntries = new List(); + internal bool drainDisabled; + + private readonly AnimationState state; + private readonly Pool trackEntryPool; + internal event Action AnimationsChanged; + + internal EventQueue (AnimationState state, Action HandleAnimationsChanged, Pool trackEntryPool) { + this.state = state; + this.AnimationsChanged += HandleAnimationsChanged; + this.trackEntryPool = trackEntryPool; + } + + struct EventQueueEntry { + public EventType type; + public TrackEntry entry; + public Event e; + + public EventQueueEntry (EventType eventType, TrackEntry trackEntry, Event e = null) { + this.type = eventType; + this.entry = trackEntry; + this.e = e; + } + } + + enum EventType { + Start, Interrupt, End, Dispose, Complete, Event + } + + internal void Start (TrackEntry entry) { + eventQueueEntries.Add(new EventQueueEntry(EventType.Start, entry)); + if (AnimationsChanged != null) AnimationsChanged(); + } + + internal void Interrupt (TrackEntry entry) { + eventQueueEntries.Add(new EventQueueEntry(EventType.Interrupt, entry)); + } + + internal void End (TrackEntry entry) { + eventQueueEntries.Add(new EventQueueEntry(EventType.End, entry)); + if (AnimationsChanged != null) AnimationsChanged(); + } + + internal void Dispose (TrackEntry entry) { + eventQueueEntries.Add(new EventQueueEntry(EventType.Dispose, entry)); + } + + internal void Complete (TrackEntry entry) { + eventQueueEntries.Add(new EventQueueEntry(EventType.Complete, entry)); + } + + internal void Event (TrackEntry entry, Event e) { + eventQueueEntries.Add(new EventQueueEntry(EventType.Event, entry, e)); + } + + /// Raises all events in the queue and drains the queue. + internal void Drain () { + if (drainDisabled) return; + drainDisabled = true; + + var entries = this.eventQueueEntries; + AnimationState state = this.state; + + // Don't cache entries.Count so callbacks can queue their own events (eg, call SetAnimation in AnimationState_Complete). + for (int i = 0; i < entries.Count; i++) { + var queueEntry = entries[i]; + TrackEntry trackEntry = queueEntry.entry; + + switch (queueEntry.type) { + case EventType.Start: + trackEntry.OnStart(); + state.OnStart(trackEntry); + break; + case EventType.Interrupt: + trackEntry.OnInterrupt(); + state.OnInterrupt(trackEntry); + break; + case EventType.End: + trackEntry.OnEnd(); + state.OnEnd(trackEntry); + goto case EventType.Dispose; // Fall through. (C#) + case EventType.Dispose: + trackEntry.OnDispose(); + state.OnDispose(trackEntry); + trackEntryPool.Free(trackEntry); // Pooling + break; + case EventType.Complete: + trackEntry.OnComplete(); + state.OnComplete(trackEntry); + break; + case EventType.Event: + trackEntry.OnEvent(queueEntry.e); + state.OnEvent(trackEntry, queueEntry.e); + break; + } + } + eventQueueEntries.Clear(); + + drainDisabled = false; + } + + internal void Clear () { + eventQueueEntries.Clear(); + } + } + + public class Pool where T : class, new() { + public readonly int max; + readonly Stack freeObjects; + + public int Count { get { return freeObjects.Count; } } + public int Peak { get; private set; } + + public Pool (int initialCapacity = 16, int max = int.MaxValue) { + freeObjects = new Stack(initialCapacity); + this.max = max; + } + + public T Obtain () { + return freeObjects.Count == 0 ? new T() : freeObjects.Pop(); + } + + public void Free (T obj) { + if (obj == null) throw new ArgumentNullException("obj", "obj cannot be null"); + if (freeObjects.Count < max) { + freeObjects.Push(obj); + Peak = Math.Max(Peak, freeObjects.Count); + } + Reset(obj); + } + +// protected void FreeAll (List objects) { +// if (objects == null) throw new ArgumentNullException("objects", "objects cannot be null."); +// var freeObjects = this.freeObjects; +// int max = this.max; +// for (int i = 0; i < objects.Count; i++) { +// T obj = objects[i]; +// if (obj == null) continue; +// if (freeObjects.Count < max) freeObjects.Push(obj); +// Reset(obj); +// } +// Peak = Math.Max(Peak, freeObjects.Count); +// } + + public void Clear () { + freeObjects.Clear(); + } + + protected void Reset (T obj) { + var poolable = obj as IPoolable; + if (poolable != null) poolable.Reset(); + } + + public interface IPoolable { + void Reset (); + } + } + +} diff --git a/Assets/Spine/SpineCSharp/AnimationStateData.cs b/Assets/Spine/SpineCSharp/AnimationStateData.cs new file mode 100644 index 0000000..4bceefa --- /dev/null +++ b/Assets/Spine/SpineCSharp/AnimationStateData.cs @@ -0,0 +1,115 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + + /// Stores mix (crossfade) durations to be applied when AnimationState animations are changed. + public class AnimationStateData { + internal SkeletonData skeletonData; + readonly Dictionary animationToMixTime = new Dictionary(AnimationPairComparer.Instance); + internal float defaultMix; + + /// The SkeletonData to look up animations when they are specified by name. + public SkeletonData SkeletonData { get { return skeletonData; } } + + /// + /// The mix duration to use when no mix duration has been specifically defined between two animations. + public float DefaultMix { get { return defaultMix; } set { defaultMix = value; } } + + public AnimationStateData (SkeletonData skeletonData) { + if (skeletonData == null) throw new ArgumentException("skeletonData cannot be null.", "skeletonData"); + this.skeletonData = skeletonData; + } + + /// Sets a mix duration by animation names. + public void SetMix (string fromName, string toName, float duration) { + Animation from = skeletonData.FindAnimation(fromName); + if (from == null) throw new ArgumentException("Animation not found: " + fromName, "fromName"); + Animation to = skeletonData.FindAnimation(toName); + if (to == null) throw new ArgumentException("Animation not found: " + toName, "toName"); + SetMix(from, to, duration); + } + + /// Sets a mix duration when changing from the specified animation to the other. + /// See TrackEntry.MixDuration. + public void SetMix (Animation from, Animation to, float duration) { + if (from == null) throw new ArgumentNullException("from", "from cannot be null."); + if (to == null) throw new ArgumentNullException("to", "to cannot be null."); + AnimationPair key = new AnimationPair(from, to); + animationToMixTime.Remove(key); + animationToMixTime.Add(key, duration); + } + + /// + /// The mix duration to use when changing from the specified animation to the other, + /// or the DefaultMix if no mix duration has been set. + /// + public float GetMix (Animation from, Animation to) { + if (from == null) throw new ArgumentNullException("from", "from cannot be null."); + if (to == null) throw new ArgumentNullException("to", "to cannot be null."); + AnimationPair key = new AnimationPair(from, to); + float duration; + if (animationToMixTime.TryGetValue(key, out duration)) return duration; + return defaultMix; + } + + public struct AnimationPair { + public readonly Animation a1; + public readonly Animation a2; + + public AnimationPair (Animation a1, Animation a2) { + this.a1 = a1; + this.a2 = a2; + } + + public override string ToString () { + return a1.name + "->" + a2.name; + } + } + + // Avoids boxing in the dictionary. + public class AnimationPairComparer : IEqualityComparer { + public static readonly AnimationPairComparer Instance = new AnimationPairComparer(); + + bool IEqualityComparer.Equals (AnimationPair x, AnimationPair y) { + return ReferenceEquals(x.a1, y.a1) && ReferenceEquals(x.a2, y.a2); + } + + int IEqualityComparer.GetHashCode (AnimationPair obj) { + // from Tuple.CombineHashCodes // return (((h1 << 5) + h1) ^ h2); + int h1 = obj.a1.GetHashCode(); + return (((h1 << 5) + h1) ^ obj.a2.GetHashCode()); + } + } + } +} diff --git a/Assets/Spine/SpineCSharp/Atlas.cs b/Assets/Spine/SpineCSharp/Atlas.cs new file mode 100644 index 0000000..1f48682 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Atlas.cs @@ -0,0 +1,311 @@ +/****************************************************************************** + * Spine Runtimes License Agreement + * Last updated May 1, 2019. Replaces all prior versions. + * + * Copyright (c) 2013-2019, Esoteric Software LLC + * + * Integration of the Spine Runtimes into software or otherwise creating + * derivative works of the Spine Runtimes is permitted under the terms and + * conditions of Section 2 of the Spine Editor License Agreement: + * http://esotericsoftware.com/spine-editor-license + * + * Otherwise, it is permitted to integrate the Spine Runtimes into software + * or otherwise create derivative works of the Spine Runtimes (collectively, + * "Products"), provided that each user of the Products must obtain their own + * Spine Editor license and redistribution of the Products in any form must + * include this license and copyright notice. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS + * INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if (UNITY_5 || UNITY_5_3_OR_NEWER || UNITY_WSA || UNITY_WP8 || UNITY_WP8_1) +#define IS_UNITY +#endif + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Reflection; + +#if WINDOWS_STOREAPP +using System.Threading.Tasks; +using Windows.Storage; +#endif + +namespace Spine { + public class Atlas : IEnumerable { + readonly List pages = new List(); + List regions = new List(); + TextureLoader textureLoader; + + #region IEnumerable implementation + public IEnumerator GetEnumerator () { + return regions.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { + return regions.GetEnumerator(); + } + #endregion + + #if !(IS_UNITY) + #if WINDOWS_STOREAPP + private async Task ReadFile(string path, TextureLoader textureLoader) { + var folder = Windows.ApplicationModel.Package.Current.InstalledLocation; + var file = await folder.GetFileAsync(path).AsTask().ConfigureAwait(false); + using (var reader = new StreamReader(await file.OpenStreamForReadAsync().ConfigureAwait(false))) { + try { + Load(reader, Path.GetDirectoryName(path), textureLoader); + } catch (Exception ex) { + throw new Exception("Error reading atlas file: " + path, ex); + } + } + } + + public Atlas(string path, TextureLoader textureLoader) { + this.ReadFile(path, textureLoader).Wait(); + } + #else + + public Atlas (string path, TextureLoader textureLoader) { + + #if WINDOWS_PHONE + Stream stream = Microsoft.Xna.Framework.TitleContainer.OpenStream(path); + using (StreamReader reader = new StreamReader(stream)) { + #else + using (StreamReader reader = new StreamReader(path)) { + #endif // WINDOWS_PHONE + + try { + Load(reader, Path.GetDirectoryName(path), textureLoader); + } catch (Exception ex) { + throw new Exception("Error reading atlas file: " + path, ex); + } + + } + } + #endif // WINDOWS_STOREAPP + + #endif + + public Atlas (TextReader reader, string dir, TextureLoader textureLoader) { + Load(reader, dir, textureLoader); + } + + public Atlas (List pages, List regions) { + this.pages = pages; + this.regions = regions; + this.textureLoader = null; + } + + private void Load (TextReader reader, string imagesDir, TextureLoader textureLoader) { + if (textureLoader == null) throw new ArgumentNullException("textureLoader", "textureLoader cannot be null."); + this.textureLoader = textureLoader; + + string[] tuple = new string[4]; + AtlasPage page = null; + while (true) { + string line = reader.ReadLine(); + if (line == null) break; + if (line.Trim().Length == 0) + page = null; + else if (page == null) { + page = new AtlasPage(); + page.name = line; + + if (ReadTuple(reader, tuple) == 2) { // size is only optional for an atlas packed with an old TexturePacker. + page.width = int.Parse(tuple[0], CultureInfo.InvariantCulture); + page.height = int.Parse(tuple[1], CultureInfo.InvariantCulture); + ReadTuple(reader, tuple); + } + page.format = (Format)Enum.Parse(typeof(Format), tuple[0], false); + + ReadTuple(reader, tuple); + page.minFilter = (TextureFilter)Enum.Parse(typeof(TextureFilter), tuple[0], false); + page.magFilter = (TextureFilter)Enum.Parse(typeof(TextureFilter), tuple[1], false); + + string direction = ReadValue(reader); + page.uWrap = TextureWrap.ClampToEdge; + page.vWrap = TextureWrap.ClampToEdge; + if (direction == "x") + page.uWrap = TextureWrap.Repeat; + else if (direction == "y") + page.vWrap = TextureWrap.Repeat; + else if (direction == "xy") + page.uWrap = page.vWrap = TextureWrap.Repeat; + + textureLoader.Load(page, Path.Combine(imagesDir, line)); + + pages.Add(page); + + } else { + AtlasRegion region = new AtlasRegion(); + region.name = line; + region.page = page; + + region.rotate = Boolean.Parse(ReadValue(reader)); + + ReadTuple(reader, tuple); + int x = int.Parse(tuple[0], CultureInfo.InvariantCulture); + int y = int.Parse(tuple[1], CultureInfo.InvariantCulture); + + ReadTuple(reader, tuple); + int width = int.Parse(tuple[0], CultureInfo.InvariantCulture); + int height = int.Parse(tuple[1], CultureInfo.InvariantCulture); + + region.u = x / (float)page.width; + region.v = y / (float)page.height; + if (region.rotate) { + region.u2 = (x + height) / (float)page.width; + region.v2 = (y + width) / (float)page.height; + } else { + region.u2 = (x + width) / (float)page.width; + region.v2 = (y + height) / (float)page.height; + } + region.x = x; + region.y = y; + region.width = Math.Abs(width); + region.height = Math.Abs(height); + + if (ReadTuple(reader, tuple) == 4) { // split is optional + region.splits = new [] {int.Parse(tuple[0], CultureInfo.InvariantCulture), + int.Parse(tuple[1], CultureInfo.InvariantCulture), + int.Parse(tuple[2], CultureInfo.InvariantCulture), + int.Parse(tuple[3], CultureInfo.InvariantCulture)}; + + if (ReadTuple(reader, tuple) == 4) { // pad is optional, but only present with splits + region.pads = new [] {int.Parse(tuple[0], CultureInfo.InvariantCulture), + int.Parse(tuple[1], CultureInfo.InvariantCulture), + int.Parse(tuple[2], CultureInfo.InvariantCulture), + int.Parse(tuple[3], CultureInfo.InvariantCulture)}; + + ReadTuple(reader, tuple); + } + } + + region.originalWidth = int.Parse(tuple[0], CultureInfo.InvariantCulture); + region.originalHeight = int.Parse(tuple[1], CultureInfo.InvariantCulture); + + ReadTuple(reader, tuple); + region.offsetX = int.Parse(tuple[0], CultureInfo.InvariantCulture); + region.offsetY = int.Parse(tuple[1], CultureInfo.InvariantCulture); + + region.index = int.Parse(ReadValue(reader), CultureInfo.InvariantCulture); + + regions.Add(region); + } + } + } + + static string ReadValue (TextReader reader) { + string line = reader.ReadLine(); + int colon = line.IndexOf(':'); + if (colon == -1) throw new Exception("Invalid line: " + line); + return line.Substring(colon + 1).Trim(); + } + + /// Returns the number of tuple values read (1, 2 or 4). + static int ReadTuple (TextReader reader, string[] tuple) { + string line = reader.ReadLine(); + int colon = line.IndexOf(':'); + if (colon == -1) throw new Exception("Invalid line: " + line); + int i = 0, lastMatch = colon + 1; + for (; i < 3; i++) { + int comma = line.IndexOf(',', lastMatch); + if (comma == -1) break; + tuple[i] = line.Substring(lastMatch, comma - lastMatch).Trim(); + lastMatch = comma + 1; + } + tuple[i] = line.Substring(lastMatch).Trim(); + return i + 1; + } + + public void FlipV () { + for (int i = 0, n = regions.Count; i < n; i++) { + AtlasRegion region = regions[i]; + region.v = 1 - region.v; + region.v2 = 1 - region.v2; + } + } + + /// Returns the first region found with the specified name. This method uses string comparison to find the region, so the result + /// should be cached rather than calling this method multiple times. + /// The region, or null. + public AtlasRegion FindRegion (string name) { + for (int i = 0, n = regions.Count; i < n; i++) + if (regions[i].name == name) return regions[i]; + return null; + } + + public void Dispose () { + if (textureLoader == null) return; + for (int i = 0, n = pages.Count; i < n; i++) + textureLoader.Unload(pages[i].rendererObject); + } + } + + public enum Format { + Alpha, + Intensity, + LuminanceAlpha, + RGB565, + RGBA4444, + RGB888, + RGBA8888 + } + + public enum TextureFilter { + Nearest, + Linear, + MipMap, + MipMapNearestNearest, + MipMapLinearNearest, + MipMapNearestLinear, + MipMapLinearLinear + } + + public enum TextureWrap { + MirroredRepeat, + ClampToEdge, + Repeat + } + + public class AtlasPage { + public string name; + public Format format; + public TextureFilter minFilter; + public TextureFilter magFilter; + public TextureWrap uWrap; + public TextureWrap vWrap; + public Object rendererObject; + public int width, height; + } + + public class AtlasRegion { + public AtlasPage page; + public string name; + public int x, y, width, height; + public float u, v, u2, v2; + public float offsetX, offsetY; + public int originalWidth, originalHeight; + public int index; + public bool rotate; + public int[] splits; + public int[] pads; + } + + public interface TextureLoader { + void Load (AtlasPage page, string path); + void Unload (Object texture); + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/AtlasAttachmentLoader.cs b/Assets/Spine/SpineCSharp/Attachments/AtlasAttachmentLoader.cs new file mode 100644 index 0000000..b9ebdf5 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/AtlasAttachmentLoader.cs @@ -0,0 +1,109 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + + /// + /// An AttachmentLoader that configures attachments using texture regions from an Atlas. + /// See Loading Skeleton Data in the Spine Runtimes Guide. + /// + public class AtlasAttachmentLoader : AttachmentLoader { + private Atlas[] atlasArray; + + public AtlasAttachmentLoader (params Atlas[] atlasArray) { + if (atlasArray == null) throw new ArgumentNullException("atlas array cannot be null."); + this.atlasArray = atlasArray; + } + + public RegionAttachment NewRegionAttachment (Skin skin, string name, string path) { + AtlasRegion region = FindRegion(path); + if (region == null) throw new ArgumentException(string.Format("Region not found in atlas: {0} (region attachment: {1})", path, name)); + RegionAttachment attachment = new RegionAttachment(name); + attachment.RendererObject = region; + attachment.SetUVs(region.u, region.v, region.u2, region.v2, region.rotate); + attachment.regionOffsetX = region.offsetX; + attachment.regionOffsetY = region.offsetY; + attachment.regionWidth = region.width; + attachment.regionHeight = region.height; + attachment.regionOriginalWidth = region.originalWidth; + attachment.regionOriginalHeight = region.originalHeight; + return attachment; + } + + public MeshAttachment NewMeshAttachment (Skin skin, string name, string path) { + AtlasRegion region = FindRegion(path); + if (region == null) throw new ArgumentException(string.Format("Region not found in atlas: {0} (region attachment: {1})", path, name)); + MeshAttachment attachment = new MeshAttachment(name); + attachment.RendererObject = region; + attachment.RegionU = region.u; + attachment.RegionV = region.v; + attachment.RegionU2 = region.u2; + attachment.RegionV2 = region.v2; + attachment.RegionRotate = region.rotate; + attachment.regionOffsetX = region.offsetX; + attachment.regionOffsetY = region.offsetY; + attachment.regionWidth = region.width; + attachment.regionHeight = region.height; + attachment.regionOriginalWidth = region.originalWidth; + attachment.regionOriginalHeight = region.originalHeight; + return attachment; + } + + public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, string name) { + return new BoundingBoxAttachment(name); + } + + public PathAttachment NewPathAttachment (Skin skin, string name) { + return new PathAttachment(name); + } + + public PointAttachment NewPointAttachment (Skin skin, string name) { + return new PointAttachment(name); + } + + public ClippingAttachment NewClippingAttachment(Skin skin, string name) { + return new ClippingAttachment(name); + } + + public AtlasRegion FindRegion (string name) { + AtlasRegion region; + + for (int i = 0; i < atlasArray.Length; i++) { + region = atlasArray[i].FindRegion(name); + if (region != null) + return region; + } + + return null; + } + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/Attachment.cs b/Assets/Spine/SpineCSharp/Attachments/Attachment.cs new file mode 100644 index 0000000..e109659 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/Attachment.cs @@ -0,0 +1,50 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + abstract public class Attachment { + public string Name { get; private set; } + + protected Attachment (string name) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null"); + Name = name; + } + + override public string ToString () { + return Name; + } + } + + public interface IHasRendererObject { + object RendererObject { get; } + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/AttachmentLoader.cs b/Assets/Spine/SpineCSharp/Attachments/AttachmentLoader.cs new file mode 100644 index 0000000..25cbe28 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/AttachmentLoader.cs @@ -0,0 +1,49 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine { + public interface AttachmentLoader { + /// May be null to not load any attachment. + RegionAttachment NewRegionAttachment (Skin skin, string name, string path); + + /// May be null to not load any attachment. + MeshAttachment NewMeshAttachment (Skin skin, string name, string path); + + /// May be null to not load any attachment. + BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, string name); + + /// May be null to not load any attachment + PathAttachment NewPathAttachment (Skin skin, string name); + + PointAttachment NewPointAttachment (Skin skin, string name); + + ClippingAttachment NewClippingAttachment (Skin skin, string name); + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/AttachmentType.cs b/Assets/Spine/SpineCSharp/Attachments/AttachmentType.cs new file mode 100644 index 0000000..fd94521 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/AttachmentType.cs @@ -0,0 +1,35 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine { + public enum AttachmentType { + Region, Boundingbox, Mesh, Linkedmesh, Path, Point, Clipping + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/BoundingBoxAttachment.cs b/Assets/Spine/SpineCSharp/Attachments/BoundingBoxAttachment.cs new file mode 100644 index 0000000..641c9e9 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/BoundingBoxAttachment.cs @@ -0,0 +1,40 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + /// Attachment that has a polygon for bounds checking. + public class BoundingBoxAttachment : VertexAttachment { + public BoundingBoxAttachment (string name) + : base(name) { + } + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/ClippingAttachment.cs b/Assets/Spine/SpineCSharp/Attachments/ClippingAttachment.cs new file mode 100644 index 0000000..2f845bf --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/ClippingAttachment.cs @@ -0,0 +1,42 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class ClippingAttachment : VertexAttachment { + internal SlotData endSlot; + + public SlotData EndSlot { get { return endSlot; } set { endSlot = value; } } + + public ClippingAttachment(string name) : base(name) { + } + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/MeshAttachment.cs b/Assets/Spine/SpineCSharp/Attachments/MeshAttachment.cs new file mode 100644 index 0000000..f23bbc4 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/MeshAttachment.cs @@ -0,0 +1,120 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + /// Attachment that displays a texture region using a mesh. + public class MeshAttachment : VertexAttachment, IHasRendererObject { + internal float regionOffsetX, regionOffsetY, regionWidth, regionHeight, regionOriginalWidth, regionOriginalHeight; + private MeshAttachment parentMesh; + internal float[] uvs, regionUVs; + internal int[] triangles; + internal float r = 1, g = 1, b = 1, a = 1; + internal int hulllength; + internal bool inheritDeform; + + public int HullLength { get { return hulllength; } set { hulllength = value; } } + public float[] RegionUVs { get { return regionUVs; } set { regionUVs = value; } } + /// The UV pair for each vertex, normalized within the entire texture. + public float[] UVs { get { return uvs; } set { uvs = value; } } + public int[] Triangles { get { return triangles; } set { triangles = value; } } + + public float R { get { return r; } set { r = value; } } + public float G { get { return g; } set { g = value; } } + public float B { get { return b; } set { b = value; } } + public float A { get { return a; } set { a = value; } } + + public string Path { get; set; } + public object RendererObject { get; set; } + public float RegionU { get; set; } + public float RegionV { get; set; } + public float RegionU2 { get; set; } + public float RegionV2 { get; set; } + public bool RegionRotate { get; set; } + public float RegionOffsetX { get { return regionOffsetX; } set { regionOffsetX = value; } } + public float RegionOffsetY { get { return regionOffsetY; } set { regionOffsetY = value; } } // Pixels stripped from the bottom left, unrotated. + public float RegionWidth { get { return regionWidth; } set { regionWidth = value; } } + public float RegionHeight { get { return regionHeight; } set { regionHeight = value; } } // Unrotated, stripped size. + public float RegionOriginalWidth { get { return regionOriginalWidth; } set { regionOriginalWidth = value; } } + public float RegionOriginalHeight { get { return regionOriginalHeight; } set { regionOriginalHeight = value; } } // Unrotated, unstripped size. + + public bool InheritDeform { get { return inheritDeform; } set { inheritDeform = value; } } + + public MeshAttachment ParentMesh { + get { return parentMesh; } + set { + parentMesh = value; + if (value != null) { + bones = value.bones; + vertices = value.vertices; + worldVerticesLength = value.worldVerticesLength; + regionUVs = value.regionUVs; + triangles = value.triangles; + HullLength = value.HullLength; + Edges = value.Edges; + Width = value.Width; + Height = value.Height; + } + } + } + + // Nonessential. + public int[] Edges { get; set; } + public float Width { get; set; } + public float Height { get; set; } + + public MeshAttachment (string name) + : base(name) { + } + + public void UpdateUVs () { + float u = RegionU, v = RegionV, width = RegionU2 - RegionU, height = RegionV2 - RegionV; + float[] regionUVs = this.regionUVs; + if (this.uvs == null || this.uvs.Length != regionUVs.Length) this.uvs = new float[regionUVs.Length]; + float[] uvs = this.uvs; + if (RegionRotate) { + for (int i = 0, n = uvs.Length; i < n; i += 2) { + uvs[i] = u + regionUVs[i + 1] * width; + uvs[i + 1] = v + height - regionUVs[i] * height; + } + } else { + for (int i = 0, n = uvs.Length; i < n; i += 2) { + uvs[i] = u + regionUVs[i] * width; + uvs[i + 1] = v + regionUVs[i + 1] * height; + } + } + } + + override public bool ApplyDeform (VertexAttachment sourceAttachment) { + return this == sourceAttachment || (inheritDeform && parentMesh == sourceAttachment); + } + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/PathAttachment.cs b/Assets/Spine/SpineCSharp/Attachments/PathAttachment.cs new file mode 100644 index 0000000..9c067c8 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/PathAttachment.cs @@ -0,0 +1,48 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + public class PathAttachment : VertexAttachment { + internal float[] lengths; + internal bool closed, constantSpeed; + + /// The length in the setup pose from the start of the path to the end of each curve. + public float[] Lengths { get { return lengths; } set { lengths = value; } } + public bool Closed { get { return closed; } set { closed = value; } } + public bool ConstantSpeed { get { return constantSpeed; } set { constantSpeed = value; } } + + public PathAttachment (String name) + : base(name) { + } + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/PointAttachment.cs b/Assets/Spine/SpineCSharp/Attachments/PointAttachment.cs new file mode 100644 index 0000000..b74d51f --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/PointAttachment.cs @@ -0,0 +1,61 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine { + /// + /// An attachment which is a single point and a rotation. This can be used to spawn projectiles, particles, etc. A bone can be + /// used in similar ways, but a PointAttachment is slightly less expensive to compute and can be hidden, shown, and placed in a + /// skin. + ///

+ /// See Point Attachments in the Spine User Guide. + ///

+ public class PointAttachment : Attachment { + internal float x, y, rotation; + public float X { get { return x; } set { x = value; } } + public float Y { get { return y; } set { y = value; } } + public float Rotation { get { return rotation; } set { rotation = value; } } + + public PointAttachment (string name) + : base(name) { + } + + public void ComputeWorldPosition (Bone bone, out float ox, out float oy) { + bone.LocalToWorld(this.x, this.y, out ox, out oy); + } + + public float ComputeWorldRotation (Bone bone) { + float cos = MathUtils.CosDeg(rotation), sin = MathUtils.SinDeg(rotation); + float ix = cos * bone.a + sin * bone.b; + float iy = cos * bone.c + sin * bone.d; + return MathUtils.Atan2(iy, ix) * MathUtils.RadDeg; + } + } +} + diff --git a/Assets/Spine/SpineCSharp/Attachments/RegionAttachment.cs b/Assets/Spine/SpineCSharp/Attachments/RegionAttachment.cs new file mode 100644 index 0000000..8b73134 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/RegionAttachment.cs @@ -0,0 +1,183 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + /// Attachment that displays a texture region. + public class RegionAttachment : Attachment, IHasRendererObject { + public const int BLX = 0; + public const int BLY = 1; + public const int ULX = 2; + public const int ULY = 3; + public const int URX = 4; + public const int URY = 5; + public const int BRX = 6; + public const int BRY = 7; + + internal float x, y, rotation, scaleX = 1, scaleY = 1, width, height; + internal float regionOffsetX, regionOffsetY, regionWidth, regionHeight, regionOriginalWidth, regionOriginalHeight; + internal float[] offset = new float[8], uvs = new float[8]; + internal float r = 1, g = 1, b = 1, a = 1; + + public float X { get { return x; } set { x = value; } } + public float Y { get { return y; } set { y = value; } } + public float Rotation { get { return rotation; } set { rotation = value; } } + public float ScaleX { get { return scaleX; } set { scaleX = value; } } + public float ScaleY { get { return scaleY; } set { scaleY = value; } } + public float Width { get { return width; } set { width = value; } } + public float Height { get { return height; } set { height = value; } } + + public float R { get { return r; } set { r = value; } } + public float G { get { return g; } set { g = value; } } + public float B { get { return b; } set { b = value; } } + public float A { get { return a; } set { a = value; } } + + public string Path { get; set; } + public object RendererObject { get; set; } + public float RegionOffsetX { get { return regionOffsetX; } set { regionOffsetX = value; } } + public float RegionOffsetY { get { return regionOffsetY; } set { regionOffsetY = value; } } // Pixels stripped from the bottom left, unrotated. + public float RegionWidth { get { return regionWidth; } set { regionWidth = value; } } + public float RegionHeight { get { return regionHeight; } set { regionHeight = value; } } // Unrotated, stripped size. + public float RegionOriginalWidth { get { return regionOriginalWidth; } set { regionOriginalWidth = value; } } + public float RegionOriginalHeight { get { return regionOriginalHeight; } set { regionOriginalHeight = value; } } // Unrotated, unstripped size. + + public float[] Offset { get { return offset; } } + public float[] UVs { get { return uvs; } } + + public RegionAttachment (string name) + : base(name) { + } + + public void UpdateOffset () { + float width = this.width; + float height = this.height; + float localX2 = width * 0.5f; + float localY2 = height * 0.5f; + float localX = -localX2; + float localY = -localY2; + if (regionOriginalWidth != 0) { // if (region != null) + localX += regionOffsetX / regionOriginalWidth * width; + localY += regionOffsetY / regionOriginalHeight * height; + localX2 -= (regionOriginalWidth - regionOffsetX - regionWidth) / regionOriginalWidth * width; + localY2 -= (regionOriginalHeight - regionOffsetY - regionHeight) / regionOriginalHeight * height; + } + float scaleX = this.scaleX; + float scaleY = this.scaleY; + localX *= scaleX; + localY *= scaleY; + localX2 *= scaleX; + localY2 *= scaleY; + float rotation = this.rotation; + float cos = MathUtils.CosDeg(rotation); + float sin = MathUtils.SinDeg(rotation); + float x = this.x; + float y = this.y; + float localXCos = localX * cos + x; + float localXSin = localX * sin; + float localYCos = localY * cos + y; + float localYSin = localY * sin; + float localX2Cos = localX2 * cos + x; + float localX2Sin = localX2 * sin; + float localY2Cos = localY2 * cos + y; + float localY2Sin = localY2 * sin; + float[] offset = this.offset; + offset[BLX] = localXCos - localYSin; + offset[BLY] = localYCos + localXSin; + offset[ULX] = localXCos - localY2Sin; + offset[ULY] = localY2Cos + localXSin; + offset[URX] = localX2Cos - localY2Sin; + offset[URY] = localY2Cos + localX2Sin; + offset[BRX] = localX2Cos - localYSin; + offset[BRY] = localYCos + localX2Sin; + } + + public void SetUVs (float u, float v, float u2, float v2, bool rotate) { + float[] uvs = this.uvs; + // UV values differ from RegionAttachment.java + if (rotate) { + uvs[URX] = u; + uvs[URY] = v2; + uvs[BRX] = u; + uvs[BRY] = v; + uvs[BLX] = u2; + uvs[BLY] = v; + uvs[ULX] = u2; + uvs[ULY] = v2; + } else { + uvs[ULX] = u; + uvs[ULY] = v2; + uvs[URX] = u; + uvs[URY] = v; + uvs[BRX] = u2; + uvs[BRY] = v; + uvs[BLX] = u2; + uvs[BLY] = v2; + } + } + + /// Transforms the attachment's four vertices to world coordinates. + /// The parent bone. + /// The output world vertices. Must have a length greater than or equal to offset + 8. + /// The worldVertices index to begin writing values. + /// The number of worldVertices entries between the value pairs written. + public void ComputeWorldVertices (Bone bone, float[] worldVertices, int offset, int stride = 2) { + float[] vertexOffset = this.offset; + float bwx = bone.worldX, bwy = bone.worldY; + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; + float offsetX, offsetY; + + // Vertex order is different from RegionAttachment.java + offsetX = vertexOffset[BRX]; // 0 + offsetY = vertexOffset[BRY]; // 1 + worldVertices[offset] = offsetX * a + offsetY * b + bwx; // bl + worldVertices[offset + 1] = offsetX * c + offsetY * d + bwy; + offset += stride; + + offsetX = vertexOffset[BLX]; // 2 + offsetY = vertexOffset[BLY]; // 3 + worldVertices[offset] = offsetX * a + offsetY * b + bwx; // ul + worldVertices[offset + 1] = offsetX * c + offsetY * d + bwy; + offset += stride; + + offsetX = vertexOffset[ULX]; // 4 + offsetY = vertexOffset[ULY]; // 5 + worldVertices[offset] = offsetX * a + offsetY * b + bwx; // ur + worldVertices[offset + 1] = offsetX * c + offsetY * d + bwy; + offset += stride; + + offsetX = vertexOffset[URX]; // 6 + offsetY = vertexOffset[URY]; // 7 + worldVertices[offset] = offsetX * a + offsetY * b + bwx; // br + worldVertices[offset + 1] = offsetX * c + offsetY * d + bwy; + //offset += stride; + } + } +} diff --git a/Assets/Spine/SpineCSharp/Attachments/VertexAttachment.cs b/Assets/Spine/SpineCSharp/Attachments/VertexAttachment.cs new file mode 100644 index 0000000..16b9b0e --- /dev/null +++ b/Assets/Spine/SpineCSharp/Attachments/VertexAttachment.cs @@ -0,0 +1,130 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + /// >An attachment with vertices that are transformed by one or more bones and can be deformed by a slot's vertices. + public class VertexAttachment : Attachment { + static int nextID = 0; + static readonly Object nextIdLock = new Object(); + + internal readonly int id; + internal int[] bones; + internal float[] vertices; + internal int worldVerticesLength; + + /// Gets a unique ID for this attachment. + public int Id { get { return id; } } + public int[] Bones { get { return bones; } set { bones = value; } } + public float[] Vertices { get { return vertices; } set { vertices = value; } } + public int WorldVerticesLength { get { return worldVerticesLength; } set { worldVerticesLength = value; } } + + public VertexAttachment (string name) + : base(name) { + + lock (VertexAttachment.nextIdLock) { + id = (VertexAttachment.nextID++ & 65535) << 11; + } + } + + public void ComputeWorldVertices (Slot slot, float[] worldVertices) { + ComputeWorldVertices(slot, 0, worldVerticesLength, worldVertices, 0); + } + + /// Transforms local vertices to world coordinates. + /// The index of the first value to transform. Each vertex has 2 values, x and y. + /// The number of world vertex values to output. Must be less than or equal to - start. + /// The output world vertices. Must have a length greater than or equal to + . + /// The index to begin writing values. + /// The number of entries between the value pairs written. + public void ComputeWorldVertices (Slot slot, int start, int count, float[] worldVertices, int offset, int stride = 2) { + count = offset + (count >> 1) * stride; + Skeleton skeleton = slot.bone.skeleton; + var deformArray = slot.attachmentVertices; + float[] vertices = this.vertices; + int[] bones = this.bones; + if (bones == null) { + if (deformArray.Count > 0) vertices = deformArray.Items; + Bone bone = slot.bone; + float x = bone.worldX, y = bone.worldY; + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; + for (int vv = start, w = offset; w < count; vv += 2, w += stride) { + float vx = vertices[vv], vy = vertices[vv + 1]; + worldVertices[w] = vx * a + vy * b + x; + worldVertices[w + 1] = vx * c + vy * d + y; + } + return; + } + int v = 0, skip = 0; + for (int i = 0; i < start; i += 2) { + int n = bones[v]; + v += n + 1; + skip += n; + } + var skeletonBones = skeleton.bones.Items; + if (deformArray.Count == 0) { + for (int w = offset, b = skip * 3; w < count; w += stride) { + float wx = 0, wy = 0; + int n = bones[v++]; + n += v; + for (; v < n; v++, b += 3) { + Bone bone = skeletonBones[bones[v]]; + float vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } else { + float[] deform = deformArray.Items; + for (int w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { + float wx = 0, wy = 0; + int n = bones[v++]; + n += v; + for (; v < n; v++, b += 3, f += 2) { + Bone bone = skeletonBones[bones[v]]; + float vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + } + + /// Returns true if a deform originally applied to the specified attachment should be applied to this attachment. + virtual public bool ApplyDeform (VertexAttachment sourceAttachment) { + return this == sourceAttachment; + } + } +} diff --git a/Assets/Spine/SpineCSharp/BlendMode.cs b/Assets/Spine/SpineCSharp/BlendMode.cs new file mode 100644 index 0000000..52b0d44 --- /dev/null +++ b/Assets/Spine/SpineCSharp/BlendMode.cs @@ -0,0 +1,35 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine { + public enum BlendMode { + Normal, Additive, Multiply, Screen + } +} diff --git a/Assets/Spine/SpineCSharp/Bone.cs b/Assets/Spine/SpineCSharp/Bone.cs new file mode 100644 index 0000000..a34a572 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Bone.cs @@ -0,0 +1,384 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + /// + /// Stores a bone's current pose. + /// + /// A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a + /// local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a + /// constraint or application code modifies the world transform after it was computed from the local transform. + /// + /// + public class Bone : IUpdatable { + static public bool yDown; + + internal BoneData data; + internal Skeleton skeleton; + internal Bone parent; + internal ExposedList children = new ExposedList(); + internal float x, y, rotation, scaleX, scaleY, shearX, shearY; + internal float ax, ay, arotation, ascaleX, ascaleY, ashearX, ashearY; + internal bool appliedValid; + + internal float a, b, worldX; + internal float c, d, worldY; + +// internal float worldSignX, worldSignY; +// public float WorldSignX { get { return worldSignX; } } +// public float WorldSignY { get { return worldSignY; } } + + internal bool sorted; + + public BoneData Data { get { return data; } } + public Skeleton Skeleton { get { return skeleton; } } + public Bone Parent { get { return parent; } } + public ExposedList Children { get { return children; } } + /// The local X translation. + public float X { get { return x; } set { x = value; } } + /// The local Y translation. + public float Y { get { return y; } set { y = value; } } + /// The local rotation. + public float Rotation { get { return rotation; } set { rotation = value; } } + + /// The local scaleX. + public float ScaleX { get { return scaleX; } set { scaleX = value; } } + + /// The local scaleY. + public float ScaleY { get { return scaleY; } set { scaleY = value; } } + + /// The local shearX. + public float ShearX { get { return shearX; } set { shearX = value; } } + + /// The local shearY. + public float ShearY { get { return shearY; } set { shearY = value; } } + + /// The rotation, as calculated by any constraints. + public float AppliedRotation { get { return arotation; } set { arotation = value; } } + + /// The applied local x translation. + public float AX { get { return ax; } set { ax = value; } } + + /// The applied local y translation. + public float AY { get { return ay; } set { ay = value; } } + + /// The applied local scaleX. + public float AScaleX { get { return ascaleX; } set { ascaleX = value; } } + + /// The applied local scaleY. + public float AScaleY { get { return ascaleY; } set { ascaleY = value; } } + + /// The applied local shearX. + public float AShearX { get { return ashearX; } set { ashearX = value; } } + + /// The applied local shearY. + public float AShearY { get { return ashearY; } set { ashearY = value; } } + + public float A { get { return a; } } + public float B { get { return b; } } + public float C { get { return c; } } + public float D { get { return d; } } + + public float WorldX { get { return worldX; } } + public float WorldY { get { return worldY; } } + public float WorldRotationX { get { return MathUtils.Atan2(c, a) * MathUtils.RadDeg; } } + public float WorldRotationY { get { return MathUtils.Atan2(d, b) * MathUtils.RadDeg; } } + + /// Returns the magnitide (always positive) of the world scale X. + public float WorldScaleX { get { return (float)Math.Sqrt(a * a + c * c); } } + /// Returns the magnitide (always positive) of the world scale Y. + public float WorldScaleY { get { return (float)Math.Sqrt(b * b + d * d); } } + + /// May be null. + public Bone (BoneData data, Skeleton skeleton, Bone parent) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); + this.data = data; + this.skeleton = skeleton; + this.parent = parent; + SetToSetupPose(); + } + + /// Same as . This method exists for Bone to implement . + public void Update () { + UpdateWorldTransform(x, y, rotation, scaleX, scaleY, shearX, shearY); + } + + /// Computes the world transform using the parent bone and this bone's local transform. + public void UpdateWorldTransform () { + UpdateWorldTransform(x, y, rotation, scaleX, scaleY, shearX, shearY); + } + + /// Computes the world transform using the parent bone and the specified local transform. + public void UpdateWorldTransform (float x, float y, float rotation, float scaleX, float scaleY, float shearX, float shearY) { + ax = x; + ay = y; + arotation = rotation; + ascaleX = scaleX; + ascaleY = scaleY; + ashearX = shearX; + ashearY = shearY; + appliedValid = true; + Skeleton skeleton = this.skeleton; + + Bone parent = this.parent; + if (parent == null) { // Root bone. + float rotationY = rotation + 90 + shearY; + float la = MathUtils.CosDeg(rotation + shearX) * scaleX; + float lb = MathUtils.CosDeg(rotationY) * scaleY; + float lc = MathUtils.SinDeg(rotation + shearX) * scaleX; + float ld = MathUtils.SinDeg(rotationY) * scaleY; + if (skeleton.flipX) { + x = -x; + la = -la; + lb = -lb; + } + if (skeleton.flipY != yDown) { + y = -y; + lc = -lc; + ld = -ld; + } + a = la; + b = lb; + c = lc; + d = ld; + worldX = x + skeleton.x; + worldY = y + skeleton.y; + return; + } + + float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + worldX = pa * x + pb * y + parent.worldX; + worldY = pc * x + pd * y + parent.worldY; + + switch (data.transformMode) { + case TransformMode.Normal: { + float rotationY = rotation + 90 + shearY; + float la = MathUtils.CosDeg(rotation + shearX) * scaleX; + float lb = MathUtils.CosDeg(rotationY) * scaleY; + float lc = MathUtils.SinDeg(rotation + shearX) * scaleX; + float ld = MathUtils.SinDeg(rotationY) * scaleY; + a = pa * la + pb * lc; + b = pa * lb + pb * ld; + c = pc * la + pd * lc; + d = pc * lb + pd * ld; + return; + } + case TransformMode.OnlyTranslation: { + float rotationY = rotation + 90 + shearY; + a = MathUtils.CosDeg(rotation + shearX) * scaleX; + b = MathUtils.CosDeg(rotationY) * scaleY; + c = MathUtils.SinDeg(rotation + shearX) * scaleX; + d = MathUtils.SinDeg(rotationY) * scaleY; + break; + } + case TransformMode.NoRotationOrReflection: { + float s = pa * pa + pc * pc, prx; + if (s > 0.0001f) { + s = Math.Abs(pa * pd - pb * pc) / s; + pb = pc * s; + pd = pa * s; + prx = MathUtils.Atan2(pc, pa) * MathUtils.RadDeg; + } else { + pa = 0; + pc = 0; + prx = 90 - MathUtils.Atan2(pd, pb) * MathUtils.RadDeg; + } + float rx = rotation + shearX - prx; + float ry = rotation + shearY - prx + 90; + float la = MathUtils.CosDeg(rx) * scaleX; + float lb = MathUtils.CosDeg(ry) * scaleY; + float lc = MathUtils.SinDeg(rx) * scaleX; + float ld = MathUtils.SinDeg(ry) * scaleY; + a = pa * la - pb * lc; + b = pa * lb - pb * ld; + c = pc * la + pd * lc; + d = pc * lb + pd * ld; + break; + } + case TransformMode.NoScale: + case TransformMode.NoScaleOrReflection: { + float cos = MathUtils.CosDeg(rotation), sin = MathUtils.SinDeg(rotation); + float za = pa * cos + pb * sin; + float zc = pc * cos + pd * sin; + float s = (float)Math.Sqrt(za * za + zc * zc); + if (s > 0.00001f) s = 1 / s; + za *= s; + zc *= s; + s = (float)Math.Sqrt(za * za + zc * zc); + float r = MathUtils.PI / 2 + MathUtils.Atan2(zc, za); + float zb = MathUtils.Cos(r) * s; + float zd = MathUtils.Sin(r) * s; + float la = MathUtils.CosDeg(shearX) * scaleX; + float lb = MathUtils.CosDeg(90 + shearY) * scaleY; + float lc = MathUtils.SinDeg(shearX) * scaleX; + float ld = MathUtils.SinDeg(90 + shearY) * scaleY; + if (data.transformMode != TransformMode.NoScaleOrReflection? pa * pd - pb* pc< 0 : skeleton.flipX != skeleton.flipY) { + zb = -zb; + zd = -zd; + } + a = za * la + zb * lc; + b = za * lb + zb * ld; + c = zc * la + zd * lc; + d = zc * lb + zd * ld; + return; + } + } + + if (skeleton.flipX) { + a = -a; + b = -b; + } + if (skeleton.flipY != Bone.yDown) { + c = -c; + d = -d; + } + } + + public void SetToSetupPose () { + BoneData data = this.data; + x = data.x; + y = data.y; + rotation = data.rotation; + scaleX = data.scaleX; + scaleY = data.scaleY; + shearX = data.shearX; + shearY = data.shearY; + } + + /// + /// Computes the individual applied transform values from the world transform. This can be useful to perform processing using + /// the applied transform after the world transform has been modified directly (eg, by a constraint).. + /// + /// Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. + /// + internal void UpdateAppliedTransform () { + appliedValid = true; + Bone parent = this.parent; + if (parent == null) { + ax = worldX; + ay = worldY; + arotation = MathUtils.Atan2(c, a) * MathUtils.RadDeg; + ascaleX = (float)Math.Sqrt(a * a + c * c); + ascaleY = (float)Math.Sqrt(b * b + d * d); + ashearX = 0; + ashearY = MathUtils.Atan2(a * b + c * d, a * d - b * c) * MathUtils.RadDeg; + return; + } + float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + float pid = 1 / (pa * pd - pb * pc); + float dx = worldX - parent.worldX, dy = worldY - parent.worldY; + ax = (dx * pd * pid - dy * pb * pid); + ay = (dy * pa * pid - dx * pc * pid); + float ia = pid * pd; + float id = pid * pa; + float ib = pid * pb; + float ic = pid * pc; + float ra = ia * a - ib * c; + float rb = ia * b - ib * d; + float rc = id * c - ic * a; + float rd = id * d - ic * b; + ashearX = 0; + ascaleX = (float)Math.Sqrt(ra * ra + rc * rc); + if (ascaleX > 0.0001f) { + float det = ra * rd - rb * rc; + ascaleY = det / ascaleX; + ashearY = MathUtils.Atan2(ra * rb + rc * rd, det) * MathUtils.RadDeg; + arotation = MathUtils.Atan2(rc, ra) * MathUtils.RadDeg; + } else { + ascaleX = 0; + ascaleY = (float)Math.Sqrt(rb * rb + rd * rd); + ashearY = 0; + arotation = 90 - MathUtils.Atan2(rd, rb) * MathUtils.RadDeg; + } + } + + public void WorldToLocal (float worldX, float worldY, out float localX, out float localY) { + float a = this.a, b = this.b, c = this.c, d = this.d; + float invDet = 1 / (a * d - b * c); + float x = worldX - this.worldX, y = worldY - this.worldY; + localX = (x * d * invDet - y * b * invDet); + localY = (y * a * invDet - x * c * invDet); + } + + public void LocalToWorld (float localX, float localY, out float worldX, out float worldY) { + worldX = localX * a + localY * b + this.worldX; + worldY = localX * c + localY * d + this.worldY; + } + + public float WorldToLocalRotationX { + get { + Bone parent = this.parent; + if (parent == null) return arotation; + float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d, a = this.a, c = this.c; + return MathUtils.Atan2(pa * c - pc * a, pd * a - pb * c) * MathUtils.RadDeg; + } + } + + public float WorldToLocalRotationY { + get { + Bone parent = this.parent; + if (parent == null) return arotation; + float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d, b = this.b, d = this.d; + return MathUtils.Atan2(pa * d - pc * b, pd * b - pb * d) * MathUtils.RadDeg; + } + } + + public float WorldToLocalRotation (float worldRotation) { + float sin = MathUtils.SinDeg(worldRotation), cos = MathUtils.CosDeg(worldRotation); + return MathUtils.Atan2(a * sin - c * cos, d * cos - b * sin) * MathUtils.RadDeg; + } + + public float LocalToWorldRotation (float localRotation) { + float sin = MathUtils.SinDeg(localRotation), cos = MathUtils.CosDeg(localRotation); + return MathUtils.Atan2(cos * c + sin * d, cos * a + sin * b) * MathUtils.RadDeg; + } + + /// + /// Rotates the world transform the specified amount and sets isAppliedValid to false. + /// + /// Degrees. + public void RotateWorld (float degrees) { + float a = this.a, b = this.b, c = this.c, d = this.d; + float cos = MathUtils.CosDeg(degrees), sin = MathUtils.SinDeg(degrees); + this.a = cos * a - sin * c; + this.b = cos * b - sin * d; + this.c = sin * a + cos * c; + this.d = sin * b + cos * d; + appliedValid = false; + } + + override public string ToString () { + return data.name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/BoneData.cs b/Assets/Spine/SpineCSharp/BoneData.cs new file mode 100644 index 0000000..2c267e9 --- /dev/null +++ b/Assets/Spine/SpineCSharp/BoneData.cs @@ -0,0 +1,100 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class BoneData { + internal int index; + internal string name; + internal BoneData parent; + internal float length; + internal float x, y, rotation, scaleX = 1, scaleY = 1, shearX, shearY; + internal TransformMode transformMode = TransformMode.Normal; + + /// The index of the bone in Skeleton.Bones + public int Index { get { return index; } } + + /// The name of the bone, which is unique within the skeleton. + public string Name { get { return name; } } + + /// May be null. + public BoneData Parent { get { return parent; } } + + public float Length { get { return length; } set { length = value; } } + + /// Local X translation. + public float X { get { return x; } set { x = value; } } + + /// Local Y translation. + public float Y { get { return y; } set { y = value; } } + + /// Local rotation. + public float Rotation { get { return rotation; } set { rotation = value; } } + + /// Local scaleX. + public float ScaleX { get { return scaleX; } set { scaleX = value; } } + + /// Local scaleY. + public float ScaleY { get { return scaleY; } set { scaleY = value; } } + + /// Local shearX. + public float ShearX { get { return shearX; } set { shearX = value; } } + + /// Local shearY. + public float ShearY { get { return shearY; } set { shearY = value; } } + + /// The transform mode for how parent world transforms affect this bone. + public TransformMode TransformMode { get { return transformMode; } set { transformMode = value; } } + + /// May be null. + public BoneData (int index, string name, BoneData parent) { + if (index < 0) throw new ArgumentException("index must be >= 0", "index"); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.index = index; + this.name = name; + this.parent = parent; + } + + override public string ToString () { + return name; + } + } + + [Flags] + public enum TransformMode { + //0000 0 Flip Scale Rotation + Normal = 0, // 0000 + OnlyTranslation = 7, // 0111 + NoRotationOrReflection = 1, // 0001 + NoScale = 2, // 0010 + NoScaleOrReflection = 6, // 0110 + } +} diff --git a/Assets/Spine/SpineCSharp/Event.cs b/Assets/Spine/SpineCSharp/Event.cs new file mode 100644 index 0000000..82a3556 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Event.cs @@ -0,0 +1,60 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + /// Stores the current pose values for an Event. + public class Event { + internal readonly EventData data; + internal readonly float time; + internal int intValue; + internal float floatValue; + internal string stringValue; + + public EventData Data { get { return data; } } + /// The animation time this event was keyed. + public float Time { get { return time; } } + + public int Int { get { return intValue; } set { intValue = value; } } + public float Float { get { return floatValue; } set { floatValue = value; } } + public string String { get { return stringValue; } set { stringValue = value; } } + + public Event (float time, EventData data) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + this.time = time; + this.data = data; + } + + override public string ToString () { + return this.data.Name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/EventData.cs b/Assets/Spine/SpineCSharp/EventData.cs new file mode 100644 index 0000000..32881f7 --- /dev/null +++ b/Assets/Spine/SpineCSharp/EventData.cs @@ -0,0 +1,53 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + /// Stores the setup pose values for an Event. + public class EventData { + internal string name; + + /// The name of the event, which is unique within the skeleton. + public string Name { get { return name; } } + public int Int { get; set; } + public float Float { get; set; } + public string String { get; set; } + + public EventData (string name) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.name = name; + } + + override public string ToString () { + return Name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/ExposedList.cs b/Assets/Spine/SpineCSharp/ExposedList.cs new file mode 100644 index 0000000..58a2322 --- /dev/null +++ b/Assets/Spine/SpineCSharp/ExposedList.cs @@ -0,0 +1,624 @@ +// +// System.Collections.Generic.List +// +// Authors: +// Ben Maurer (bmaurer@ximian.com) +// Martin Baulig (martin@ximian.com) +// Carlos Alberto Cortez (calberto.cortez@gmail.com) +// David Waite (mass@akuma.org) +// +// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com) +// Copyright (C) 2005 David Waite +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Spine { + [DebuggerDisplay("Count={Count}")] + public class ExposedList : IEnumerable { + public T[] Items; + public int Count; + private const int DefaultCapacity = 4; + private static readonly T[] EmptyArray = new T[0]; + private int version; + + public ExposedList () { + Items = EmptyArray; + } + + public ExposedList (IEnumerable collection) { + CheckCollection(collection); + + // initialize to needed size (if determinable) + ICollection c = collection as ICollection; + if (c == null) { + Items = EmptyArray; + AddEnumerable(collection); + } else { + Items = new T[c.Count]; + AddCollection(c); + } + } + + public ExposedList (int capacity) { + if (capacity < 0) + throw new ArgumentOutOfRangeException("capacity"); + Items = new T[capacity]; + } + + internal ExposedList (T[] data, int size) { + Items = data; + Count = size; + } + + public void Add (T item) { + // If we check to see if we need to grow before trying to grow + // we can speed things up by 25% + if (Count == Items.Length) + GrowIfNeeded(1); + Items[Count++] = item; + version++; + } + + public void GrowIfNeeded (int newCount) { + int minimumSize = Count + newCount; + if (minimumSize > Items.Length) + Capacity = Math.Max(Math.Max(Capacity * 2, DefaultCapacity), minimumSize); + } + + public ExposedList Resize (int newSize) { + int itemsLength = Items.Length; + var oldItems = Items; + if (newSize > itemsLength) { + Array.Resize(ref Items, newSize); +// var newItems = new T[newSize]; +// Array.Copy(oldItems, newItems, Count); +// Items = newItems; + } else if (newSize < itemsLength) { + // Allow nulling of T reference type to allow GC. + for (int i = newSize; i < itemsLength; i++) + oldItems[i] = default(T); + } + Count = newSize; + return this; + } + + public void EnsureCapacity (int min) { + if (Items.Length < min) { + int newCapacity = Items.Length == 0 ? DefaultCapacity : Items.Length * 2; + //if ((uint)newCapacity > Array.MaxArrayLength) newCapacity = Array.MaxArrayLength; + if (newCapacity < min) newCapacity = min; + Capacity = newCapacity; + } + } + + private void CheckRange (int index, int count) { + if (index < 0) + throw new ArgumentOutOfRangeException("index"); + + if (count < 0) + throw new ArgumentOutOfRangeException("count"); + + if ((uint)index + (uint)count > (uint)Count) + throw new ArgumentException("index and count exceed length of list"); + } + + private void AddCollection (ICollection collection) { + int collectionCount = collection.Count; + if (collectionCount == 0) + return; + + GrowIfNeeded(collectionCount); + collection.CopyTo(Items, Count); + Count += collectionCount; + } + + private void AddEnumerable (IEnumerable enumerable) { + foreach (T t in enumerable) { + Add(t); + } + } + + public void AddRange (IEnumerable collection) { + CheckCollection(collection); + + ICollection c = collection as ICollection; + if (c != null) + AddCollection(c); + else + AddEnumerable(collection); + version++; + } + + public int BinarySearch (T item) { + return Array.BinarySearch(Items, 0, Count, item); + } + + public int BinarySearch (T item, IComparer comparer) { + return Array.BinarySearch(Items, 0, Count, item, comparer); + } + + public int BinarySearch (int index, int count, T item, IComparer comparer) { + CheckRange(index, count); + return Array.BinarySearch(Items, index, count, item, comparer); + } + + public void Clear (bool clearArray = true) { + if (clearArray) + Array.Clear(Items, 0, Items.Length); + + Count = 0; + version++; + } + + public bool Contains (T item) { + return Array.IndexOf(Items, item, 0, Count) != -1; + } + + public ExposedList ConvertAll (Converter converter) { + if (converter == null) + throw new ArgumentNullException("converter"); + ExposedList u = new ExposedList(Count); + for (int i = 0; i < Count; i++) + u.Items[i] = converter(Items[i]); + + u.Count = Count; + return u; + } + + public void CopyTo (T[] array) { + Array.Copy(Items, 0, array, 0, Count); + } + + public void CopyTo (T[] array, int arrayIndex) { + Array.Copy(Items, 0, array, arrayIndex, Count); + } + + public void CopyTo (int index, T[] array, int arrayIndex, int count) { + CheckRange(index, count); + Array.Copy(Items, index, array, arrayIndex, count); + } + + + + public bool Exists (Predicate match) { + CheckMatch(match); + return GetIndex(0, Count, match) != -1; + } + + public T Find (Predicate match) { + CheckMatch(match); + int i = GetIndex(0, Count, match); + return (i != -1) ? Items[i] : default(T); + } + + private static void CheckMatch (Predicate match) { + if (match == null) + throw new ArgumentNullException("match"); + } + + public ExposedList FindAll (Predicate match) { + CheckMatch(match); + return FindAllList(match); + } + + private ExposedList FindAllList (Predicate match) { + ExposedList results = new ExposedList(); + for (int i = 0; i < Count; i++) + if (match(Items[i])) + results.Add(Items[i]); + + return results; + } + + public int FindIndex (Predicate match) { + CheckMatch(match); + return GetIndex(0, Count, match); + } + + public int FindIndex (int startIndex, Predicate match) { + CheckMatch(match); + CheckIndex(startIndex); + return GetIndex(startIndex, Count - startIndex, match); + } + + public int FindIndex (int startIndex, int count, Predicate match) { + CheckMatch(match); + CheckRange(startIndex, count); + return GetIndex(startIndex, count, match); + } + + private int GetIndex (int startIndex, int count, Predicate match) { + int end = startIndex + count; + for (int i = startIndex; i < end; i++) + if (match(Items[i])) + return i; + + return -1; + } + + public T FindLast (Predicate match) { + CheckMatch(match); + int i = GetLastIndex(0, Count, match); + return i == -1 ? default(T) : Items[i]; + } + + public int FindLastIndex (Predicate match) { + CheckMatch(match); + return GetLastIndex(0, Count, match); + } + + public int FindLastIndex (int startIndex, Predicate match) { + CheckMatch(match); + CheckIndex(startIndex); + return GetLastIndex(0, startIndex + 1, match); + } + + public int FindLastIndex (int startIndex, int count, Predicate match) { + CheckMatch(match); + int start = startIndex - count + 1; + CheckRange(start, count); + return GetLastIndex(start, count, match); + } + + private int GetLastIndex (int startIndex, int count, Predicate match) { + // unlike FindLastIndex, takes regular params for search range + for (int i = startIndex + count; i != startIndex; ) + if (match(Items[--i])) + return i; + return -1; + } + + public void ForEach (Action action) { + if (action == null) + throw new ArgumentNullException("action"); + for (int i = 0; i < Count; i++) + action(Items[i]); + } + + public Enumerator GetEnumerator () { + return new Enumerator(this); + } + + public ExposedList GetRange (int index, int count) { + CheckRange(index, count); + T[] tmpArray = new T[count]; + Array.Copy(Items, index, tmpArray, 0, count); + return new ExposedList(tmpArray, count); + } + + public int IndexOf (T item) { + return Array.IndexOf(Items, item, 0, Count); + } + + public int IndexOf (T item, int index) { + CheckIndex(index); + return Array.IndexOf(Items, item, index, Count - index); + } + + public int IndexOf (T item, int index, int count) { + if (index < 0) + throw new ArgumentOutOfRangeException("index"); + + if (count < 0) + throw new ArgumentOutOfRangeException("count"); + + if ((uint)index + (uint)count > (uint)Count) + throw new ArgumentOutOfRangeException("index and count exceed length of list"); + + return Array.IndexOf(Items, item, index, count); + } + + private void Shift (int start, int delta) { + if (delta < 0) + start -= delta; + + if (start < Count) + Array.Copy(Items, start, Items, start + delta, Count - start); + + Count += delta; + + if (delta < 0) + Array.Clear(Items, Count, -delta); + } + + private void CheckIndex (int index) { + if (index < 0 || (uint)index > (uint)Count) + throw new ArgumentOutOfRangeException("index"); + } + + public void Insert (int index, T item) { + CheckIndex(index); + if (Count == Items.Length) + GrowIfNeeded(1); + Shift(index, 1); + Items[index] = item; + version++; + } + + private void CheckCollection (IEnumerable collection) { + if (collection == null) + throw new ArgumentNullException("collection"); + } + + public void InsertRange (int index, IEnumerable collection) { + CheckCollection(collection); + CheckIndex(index); + if (collection == this) { + T[] buffer = new T[Count]; + CopyTo(buffer, 0); + GrowIfNeeded(Count); + Shift(index, buffer.Length); + Array.Copy(buffer, 0, Items, index, buffer.Length); + } else { + ICollection c = collection as ICollection; + if (c != null) + InsertCollection(index, c); + else + InsertEnumeration(index, collection); + } + version++; + } + + private void InsertCollection (int index, ICollection collection) { + int collectionCount = collection.Count; + GrowIfNeeded(collectionCount); + + Shift(index, collectionCount); + collection.CopyTo(Items, index); + } + + private void InsertEnumeration (int index, IEnumerable enumerable) { + foreach (T t in enumerable) + Insert(index++, t); + } + + public int LastIndexOf (T item) { + return Array.LastIndexOf(Items, item, Count - 1, Count); + } + + public int LastIndexOf (T item, int index) { + CheckIndex(index); + return Array.LastIndexOf(Items, item, index, index + 1); + } + + public int LastIndexOf (T item, int index, int count) { + if (index < 0) + throw new ArgumentOutOfRangeException("index", index, "index is negative"); + + if (count < 0) + throw new ArgumentOutOfRangeException("count", count, "count is negative"); + + if (index - count + 1 < 0) + throw new ArgumentOutOfRangeException("count", count, "count is too large"); + + return Array.LastIndexOf(Items, item, index, count); + } + + public bool Remove (T item) { + int loc = IndexOf(item); + if (loc != -1) + RemoveAt(loc); + + return loc != -1; + } + + public int RemoveAll (Predicate match) { + CheckMatch(match); + int i = 0; + int j = 0; + + // Find the first item to remove + for (i = 0; i < Count; i++) + if (match(Items[i])) + break; + + if (i == Count) + return 0; + + version++; + + // Remove any additional items + for (j = i + 1; j < Count; j++) { + if (!match(Items[j])) + Items[i++] = Items[j]; + } + if (j - i > 0) + Array.Clear(Items, i, j - i); + + Count = i; + return (j - i); + } + + public void RemoveAt (int index) { + if (index < 0 || (uint)index >= (uint)Count) + throw new ArgumentOutOfRangeException("index"); + Shift(index, -1); + Array.Clear(Items, Count, 1); + version++; + } + + // Spine Added Method + // Based on Stack.Pop(); https://referencesource.microsoft.com/#mscorlib/system/collections/stack.cs + /// Pops the last item of the list. If the list is empty, Pop throws an InvalidOperationException. + public T Pop () { + if (Count == 0) + throw new InvalidOperationException("List is empty. Nothing to pop."); + + int i = Count - 1; + T item = Items[i]; + Items[i] = default(T); + Count--; + version++; + return item; + } + + public void RemoveRange (int index, int count) { + CheckRange(index, count); + if (count > 0) { + Shift(index, -count); + Array.Clear(Items, Count, count); + version++; + } + } + + public void Reverse () { + Array.Reverse(Items, 0, Count); + version++; + } + + public void Reverse (int index, int count) { + CheckRange(index, count); + Array.Reverse(Items, index, count); + version++; + } + + public void Sort () { + Array.Sort(Items, 0, Count, Comparer.Default); + version++; + } + + public void Sort (IComparer comparer) { + Array.Sort(Items, 0, Count, comparer); + version++; + } + + public void Sort (Comparison comparison) { + Array.Sort(Items, comparison); + version++; + } + + public void Sort (int index, int count, IComparer comparer) { + CheckRange(index, count); + Array.Sort(Items, index, count, comparer); + version++; + } + + public T[] ToArray () { + T[] t = new T[Count]; + Array.Copy(Items, t, Count); + + return t; + } + + public void TrimExcess () { + Capacity = Count; + } + + public bool TrueForAll (Predicate match) { + CheckMatch(match); + + for (int i = 0; i < Count; i++) + if (!match(Items[i])) + return false; + + return true; + } + + public int Capacity { + get { + return Items.Length; + } + set { + if ((uint)value < (uint)Count) + throw new ArgumentOutOfRangeException(); + + Array.Resize(ref Items, value); + } + } + + #region Interface implementations. + + IEnumerator IEnumerable.GetEnumerator () { + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator () { + return GetEnumerator(); + } + + #endregion + + public struct Enumerator : IEnumerator, IDisposable { + private ExposedList l; + private int next; + private int ver; + private T current; + + internal Enumerator (ExposedList l) + : this() { + this.l = l; + ver = l.version; + } + + public void Dispose () { + l = null; + } + + private void VerifyState () { + if (l == null) + throw new ObjectDisposedException(GetType().FullName); + if (ver != l.version) + throw new InvalidOperationException( + "Collection was modified; enumeration operation may not execute."); + } + + public bool MoveNext () { + VerifyState(); + + if (next < 0) + return false; + + if (next < l.Count) { + current = l.Items[next++]; + return true; + } + + next = -1; + return false; + } + + public T Current { + get { + return current; + } + } + + void IEnumerator.Reset () { + VerifyState(); + next = 0; + } + + object IEnumerator.Current { + get { + VerifyState(); + if (next <= 0) + throw new InvalidOperationException(); + return current; + } + } + } + } +} diff --git a/Assets/Spine/SpineCSharp/IConstraint.cs b/Assets/Spine/SpineCSharp/IConstraint.cs new file mode 100644 index 0000000..445d077 --- /dev/null +++ b/Assets/Spine/SpineCSharp/IConstraint.cs @@ -0,0 +1,40 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine { + + /// The interface for all constraints. + public interface IConstraint : IUpdatable { + /// The ordinal for the order a skeleton's constraints will be applied. + int Order { get; } + + } + +} \ No newline at end of file diff --git a/Assets/Spine/SpineCSharp/IUpdatable.cs b/Assets/Spine/SpineCSharp/IUpdatable.cs new file mode 100644 index 0000000..4669d8c --- /dev/null +++ b/Assets/Spine/SpineCSharp/IUpdatable.cs @@ -0,0 +1,35 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +namespace Spine { + public interface IUpdatable { + void Update (); + } +} diff --git a/Assets/Spine/SpineCSharp/IkConstraint.cs b/Assets/Spine/SpineCSharp/IkConstraint.cs new file mode 100644 index 0000000..3f132d7 --- /dev/null +++ b/Assets/Spine/SpineCSharp/IkConstraint.cs @@ -0,0 +1,227 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class IkConstraint : IConstraint { + internal IkConstraintData data; + internal ExposedList bones = new ExposedList(); + internal Bone target; + internal float mix; + internal int bendDirection; + + public IkConstraintData Data { get { return data; } } + public int Order { get { return data.order; } } + public ExposedList Bones { get { return bones; } } + public Bone Target { get { return target; } set { target = value; } } + public int BendDirection { get { return bendDirection; } set { bendDirection = value; } } + public float Mix { get { return mix; } set { mix = value; } } + + public IkConstraint (IkConstraintData data, Skeleton skeleton) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); + this.data = data; + mix = data.mix; + bendDirection = data.bendDirection; + + bones = new ExposedList(data.bones.Count); + foreach (BoneData boneData in data.bones) + bones.Add(skeleton.FindBone(boneData.name)); + target = skeleton.FindBone(data.target.name); + } + + /// Applies the constraint to the constrained bones. + public void Apply () { + Update(); + } + + public void Update () { + Bone target = this.target; + ExposedList bones = this.bones; + switch (bones.Count) { + case 1: + Apply(bones.Items[0], target.worldX, target.worldY, mix); + break; + case 2: + Apply(bones.Items[0], bones.Items[1], target.worldX, target.worldY, bendDirection, mix); + break; + } + } + + override public string ToString () { + return data.name; + } + + /// Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified + /// in the world coordinate system. + static public void Apply (Bone bone, float targetX, float targetY, float alpha) { + if (!bone.appliedValid) bone.UpdateAppliedTransform(); + Bone p = bone.parent; + float id = 1 / (p.a * p.d - p.b * p.c); + float x = targetX - p.worldX, y = targetY - p.worldY; + float tx = (x * p.d - y * p.b) * id - bone.ax, ty = (y * p.a - x * p.c) * id - bone.ay; + float rotationIK = (float)Math.Atan2(ty, tx) * MathUtils.RadDeg - bone.ashearX - bone.arotation; + if (bone.ascaleX < 0) rotationIK += 180; + if (rotationIK > 180) + rotationIK -= 360; + else if (rotationIK < -180) rotationIK += 360; + bone.UpdateWorldTransform(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, bone.ascaleX, bone.ascaleY, bone.ashearX, + bone.ashearY); + } + + /// Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as + /// possible. The target is specified in the world coordinate system. + /// A direct descendant of the parent bone. + static public void Apply (Bone parent, Bone child, float targetX, float targetY, int bendDir, float alpha) { + if (alpha == 0) { + child.UpdateWorldTransform (); + return; + } + //float px = parent.x, py = parent.y, psx = parent.scaleX, psy = parent.scaleY, csx = child.scaleX; + if (!parent.appliedValid) parent.UpdateAppliedTransform(); + if (!child.appliedValid) child.UpdateAppliedTransform(); + float px = parent.ax, py = parent.ay, psx = parent.ascaleX, psy = parent.ascaleY, csx = child.ascaleX; + int os1, os2, s2; + if (psx < 0) { + psx = -psx; + os1 = 180; + s2 = -1; + } else { + os1 = 0; + s2 = 1; + } + if (psy < 0) { + psy = -psy; + s2 = -s2; + } + if (csx < 0) { + csx = -csx; + os2 = 180; + } else + os2 = 0; + float cx = child.ax, cy, cwx, cwy, a = parent.a, b = parent.b, c = parent.c, d = parent.d; + bool u = Math.Abs(psx - psy) <= 0.0001f; + if (!u) { + cy = 0; + cwx = a * cx + parent.worldX; + cwy = c * cx + parent.worldY; + } else { + cy = child.ay; + cwx = a * cx + b * cy + parent.worldX; + cwy = c * cx + d * cy + parent.worldY; + } + Bone pp = parent.parent; + a = pp.a; + b = pp.b; + c = pp.c; + d = pp.d; + float id = 1 / (a * d - b * c), x = targetX - pp.worldX, y = targetY - pp.worldY; + float tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py; + x = cwx - pp.worldX; + y = cwy - pp.worldY; + float dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py; + float l1 = (float)Math.Sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2; + if (u) { + l2 *= psx; + float cos = (tx * tx + ty * ty - l1 * l1 - l2 * l2) / (2 * l1 * l2); + if (cos < -1) + cos = -1; + else if (cos > 1) cos = 1; + a2 = (float)Math.Acos(cos) * bendDir; + a = l1 + l2 * cos; + b = l2 * (float)Math.Sin(a2); + a1 = (float)Math.Atan2(ty * a - tx * b, tx * a + ty * b); + } else { + a = psx * l2; + b = psy * l2; + float aa = a * a, bb = b * b, dd = tx * tx + ty * ty, ta = (float)Math.Atan2(ty, tx); + c = bb * l1 * l1 + aa * dd - aa * bb; + float c1 = -2 * bb * l1, c2 = bb - aa; + d = c1 * c1 - 4 * c2 * c; + if (d >= 0) { + float q = (float)Math.Sqrt(d); + if (c1 < 0) q = -q; + q = -(c1 + q) / 2; + float r0 = q / c2, r1 = c / q; + float r = Math.Abs(r0) < Math.Abs(r1) ? r0 : r1; + if (r * r <= dd) { + y = (float)Math.Sqrt(dd - r * r) * bendDir; + a1 = ta - (float)Math.Atan2(y, r); + a2 = (float)Math.Atan2(y / psy, (r - l1) / psx); + goto break_outer; // break outer; + } + } + float minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0; + float maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0; + c = -a * l1 / (aa - bb); + if (c >= -1 && c <= 1) { + c = (float)Math.Acos(c); + x = a * (float)Math.Cos(c) + l1; + y = b * (float)Math.Sin(c); + d = x * x + y * y; + if (d < minDist) { + minAngle = c; + minDist = d; + minX = x; + minY = y; + } + if (d > maxDist) { + maxAngle = c; + maxDist = d; + maxX = x; + maxY = y; + } + } + if (dd <= (minDist + maxDist) / 2) { + a1 = ta - (float)Math.Atan2(minY * bendDir, minX); + a2 = minAngle * bendDir; + } else { + a1 = ta - (float)Math.Atan2(maxY * bendDir, maxX); + a2 = maxAngle * bendDir; + } + } + break_outer: + float os = (float)Math.Atan2(cy, cx) * s2; + float rotation = parent.arotation; + a1 = (a1 - os) * MathUtils.RadDeg + os1 - rotation; + if (a1 > 180) + a1 -= 360; + else if (a1 < -180) a1 += 360; + parent.UpdateWorldTransform(px, py, rotation + a1 * alpha, parent.scaleX, parent.ascaleY, 0, 0); + rotation = child.arotation; + a2 = ((a2 + os) * MathUtils.RadDeg - child.ashearX) * s2 + os2 - rotation; + if (a2 > 180) + a2 -= 360; + else if (a2 < -180) a2 += 360; + child.UpdateWorldTransform(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); + } + } +} diff --git a/Assets/Spine/SpineCSharp/IkConstraintData.cs b/Assets/Spine/SpineCSharp/IkConstraintData.cs new file mode 100644 index 0000000..61e0a46 --- /dev/null +++ b/Assets/Spine/SpineCSharp/IkConstraintData.cs @@ -0,0 +1,82 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + /// Stores the setup pose for an IkConstraint. + public class IkConstraintData { + internal string name; + internal int order; + internal List bones = new List(); + internal BoneData target; + internal int bendDirection = 1; + internal float mix = 1; + + /// The IK constraint's name, which is unique within the skeleton. + public string Name { + get { return name; } + } + + public int Order { + get { return order; } + set { order = value; } + } + + /// The bones that are constrained by this IK Constraint. + public List Bones { + get { return bones; } + } + + /// The bone that is the IK target. + public BoneData Target { + get { return target; } + set { target = value; } + } + + /// Controls the bend direction of the IK bones, either 1 or -1. + public int BendDirection { + get { return bendDirection; } + set { bendDirection = value; } + } + + public float Mix { get { return mix; } set { mix = value; } } + + public IkConstraintData (string name) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.name = name; + } + + override public string ToString () { + return name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/Json.cs b/Assets/Spine/SpineCSharp/Json.cs new file mode 100644 index 0000000..37ca8d6 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Json.cs @@ -0,0 +1,535 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.IO; +using System.Text; +using System.Collections; +using System.Globalization; +using System.Collections.Generic; + +namespace Spine { + public static class Json { + public static object Deserialize (TextReader text) { + var parser = new SharpJson.JsonDecoder(); + parser.parseNumbersAsFloat = true; + return parser.Decode(text.ReadToEnd()); + } + } +} + +/** + * + * Copyright (c) 2016 Adriano Tinoco d'Oliveira Rezende + * + * Based on the JSON parser by Patrick van Bergen + * http://techblog.procurios.nl/k/news/view/14605/14863/how-do-i-write-my-own-parser-(for-json).html + * + * Changes made: + * + * - Optimized parser speed (deserialize roughly near 3x faster than original) + * - Added support to handle lexer/parser error messages with line numbers + * - Added more fine grained control over type conversions during the parsing + * - Refactory API (Separate Lexer code from Parser code and the Encoder from Decoder) + * + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * The above copyright notice and this permission notice shall be included in all copies or substantial + * portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +namespace SharpJson +{ + class Lexer + { + public enum Token { + None, + Null, + True, + False, + Colon, + Comma, + String, + Number, + CurlyOpen, + CurlyClose, + SquaredOpen, + SquaredClose, + }; + + public bool hasError { + get { + return !success; + } + } + + public int lineNumber { + get; + private set; + } + + public bool parseNumbersAsFloat { + get; + set; + } + + char[] json; + int index = 0; + bool success = true; + char[] stringBuffer = new char[4096]; + + public Lexer(string text) + { + Reset(); + + json = text.ToCharArray(); + parseNumbersAsFloat = false; + } + + public void Reset() + { + index = 0; + lineNumber = 1; + success = true; + } + + public string ParseString() + { + int idx = 0; + StringBuilder builder = null; + + SkipWhiteSpaces(); + + // " + char c = json[index++]; + + bool failed = false; + bool complete = false; + + while (!complete && !failed) { + if (index == json.Length) + break; + + c = json[index++]; + if (c == '"') { + complete = true; + break; + } else if (c == '\\') { + if (index == json.Length) + break; + + c = json[index++]; + + switch (c) { + case '"': + stringBuffer[idx++] = '"'; + break; + case '\\': + stringBuffer[idx++] = '\\'; + break; + case '/': + stringBuffer[idx++] = '/'; + break; + case 'b': + stringBuffer[idx++] = '\b'; + break; + case'f': + stringBuffer[idx++] = '\f'; + break; + case 'n': + stringBuffer[idx++] = '\n'; + break; + case 'r': + stringBuffer[idx++] = '\r'; + break; + case 't': + stringBuffer[idx++] = '\t'; + break; + case 'u': + int remainingLength = json.Length - index; + if (remainingLength >= 4) { + var hex = new string(json, index, 4); + + // XXX: handle UTF + stringBuffer[idx++] = (char) Convert.ToInt32(hex, 16); + + // skip 4 chars + index += 4; + } else { + failed = true; + } + break; + } + } else { + stringBuffer[idx++] = c; + } + + if (idx >= stringBuffer.Length) { + if (builder == null) + builder = new StringBuilder(); + + builder.Append(stringBuffer, 0, idx); + idx = 0; + } + } + + if (!complete) { + success = false; + return null; + } + + if (builder != null) + return builder.ToString (); + else + return new string (stringBuffer, 0, idx); + } + + string GetNumberString() + { + SkipWhiteSpaces(); + + int lastIndex = GetLastIndexOfNumber(index); + int charLength = (lastIndex - index) + 1; + + var result = new string (json, index, charLength); + + index = lastIndex + 1; + + return result; + } + + public float ParseFloatNumber() + { + float number; + var str = GetNumberString (); + + if (!float.TryParse (str, NumberStyles.Float, CultureInfo.InvariantCulture, out number)) + return 0; + + return number; + } + + public double ParseDoubleNumber() + { + double number; + var str = GetNumberString (); + + if (!double.TryParse(str, NumberStyles.Any, CultureInfo.InvariantCulture, out number)) + return 0; + + return number; + } + + int GetLastIndexOfNumber(int index) + { + int lastIndex; + + for (lastIndex = index; lastIndex < json.Length; lastIndex++) { + char ch = json[lastIndex]; + + if ((ch < '0' || ch > '9') && ch != '+' && ch != '-' + && ch != '.' && ch != 'e' && ch != 'E') + break; + } + + return lastIndex - 1; + } + + void SkipWhiteSpaces() + { + for (; index < json.Length; index++) { + char ch = json[index]; + + if (ch == '\n') + lineNumber++; + + if (!char.IsWhiteSpace(json[index])) + break; + } + } + + public Token LookAhead() + { + SkipWhiteSpaces(); + + int savedIndex = index; + return NextToken(json, ref savedIndex); + } + + public Token NextToken() + { + SkipWhiteSpaces(); + return NextToken(json, ref index); + } + + static Token NextToken(char[] json, ref int index) + { + if (index == json.Length) + return Token.None; + + char c = json[index++]; + + switch (c) { + case '{': + return Token.CurlyOpen; + case '}': + return Token.CurlyClose; + case '[': + return Token.SquaredOpen; + case ']': + return Token.SquaredClose; + case ',': + return Token.Comma; + case '"': + return Token.String; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': + return Token.Number; + case ':': + return Token.Colon; + } + + index--; + + int remainingLength = json.Length - index; + + // false + if (remainingLength >= 5) { + if (json[index] == 'f' && + json[index + 1] == 'a' && + json[index + 2] == 'l' && + json[index + 3] == 's' && + json[index + 4] == 'e') { + index += 5; + return Token.False; + } + } + + // true + if (remainingLength >= 4) { + if (json[index] == 't' && + json[index + 1] == 'r' && + json[index + 2] == 'u' && + json[index + 3] == 'e') { + index += 4; + return Token.True; + } + } + + // null + if (remainingLength >= 4) { + if (json[index] == 'n' && + json[index + 1] == 'u' && + json[index + 2] == 'l' && + json[index + 3] == 'l') { + index += 4; + return Token.Null; + } + } + + return Token.None; + } + } + + public class JsonDecoder + { + public string errorMessage { + get; + private set; + } + + public bool parseNumbersAsFloat { + get; + set; + } + + Lexer lexer; + + public JsonDecoder() + { + errorMessage = null; + parseNumbersAsFloat = false; + } + + public object Decode(string text) + { + errorMessage = null; + + lexer = new Lexer(text); + lexer.parseNumbersAsFloat = parseNumbersAsFloat; + + return ParseValue(); + } + + public static object DecodeText(string text) + { + var builder = new JsonDecoder(); + return builder.Decode(text); + } + + IDictionary ParseObject() + { + var table = new Dictionary(); + + // { + lexer.NextToken(); + + while (true) { + var token = lexer.LookAhead(); + + switch (token) { + case Lexer.Token.None: + TriggerError("Invalid token"); + return null; + case Lexer.Token.Comma: + lexer.NextToken(); + break; + case Lexer.Token.CurlyClose: + lexer.NextToken(); + return table; + default: + // name + string name = EvalLexer(lexer.ParseString()); + + if (errorMessage != null) + return null; + + // : + token = lexer.NextToken(); + + if (token != Lexer.Token.Colon) { + TriggerError("Invalid token; expected ':'"); + return null; + } + + // value + object value = ParseValue(); + + if (errorMessage != null) + return null; + + table[name] = value; + break; + } + } + + //return null; // Unreachable code + } + + IList ParseArray() + { + var array = new List(); + + // [ + lexer.NextToken(); + + while (true) { + var token = lexer.LookAhead(); + + switch (token) { + case Lexer.Token.None: + TriggerError("Invalid token"); + return null; + case Lexer.Token.Comma: + lexer.NextToken(); + break; + case Lexer.Token.SquaredClose: + lexer.NextToken(); + return array; + default: + object value = ParseValue(); + + if (errorMessage != null) + return null; + + array.Add(value); + break; + } + } + + //return null; // Unreachable code + } + + object ParseValue() + { + switch (lexer.LookAhead()) { + case Lexer.Token.String: + return EvalLexer(lexer.ParseString()); + case Lexer.Token.Number: + if (parseNumbersAsFloat) + return EvalLexer(lexer.ParseFloatNumber()); + else + return EvalLexer(lexer.ParseDoubleNumber()); + case Lexer.Token.CurlyOpen: + return ParseObject(); + case Lexer.Token.SquaredOpen: + return ParseArray(); + case Lexer.Token.True: + lexer.NextToken(); + return true; + case Lexer.Token.False: + lexer.NextToken(); + return false; + case Lexer.Token.Null: + lexer.NextToken(); + return null; + case Lexer.Token.None: + break; + } + + TriggerError("Unable to parse value"); + return null; + } + + void TriggerError(string message) + { + errorMessage = string.Format("Error: '{0}' at line {1}", + message, lexer.lineNumber); + } + + T EvalLexer(T value) + { + if (lexer.hasError) + TriggerError("Lexical error ocurred"); + + return value; + } + } +} diff --git a/Assets/Spine/SpineCSharp/MathUtils.cs b/Assets/Spine/SpineCSharp/MathUtils.cs new file mode 100644 index 0000000..6726cd9 --- /dev/null +++ b/Assets/Spine/SpineCSharp/MathUtils.cs @@ -0,0 +1,100 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public static class MathUtils { + public const float PI = 3.1415927f; + public const float PI2 = PI * 2; + public const float RadDeg = 180f / PI; + public const float DegRad = PI / 180; + + const int SIN_BITS = 14; // 16KB. Adjust for accuracy. + const int SIN_MASK = ~(-1 << SIN_BITS); + const int SIN_COUNT = SIN_MASK + 1; + const float RadFull = PI * 2; + const float DegFull = 360; + const float RadToIndex = SIN_COUNT / RadFull; + const float DegToIndex = SIN_COUNT / DegFull; + static float[] sin = new float[SIN_COUNT]; + + static MathUtils () { + for (int i = 0; i < SIN_COUNT; i++) + sin[i] = (float)Math.Sin((i + 0.5f) / SIN_COUNT * RadFull); + for (int i = 0; i < 360; i += 90) + sin[(int)(i * DegToIndex) & SIN_MASK] = (float)Math.Sin(i * DegRad); + } + + /// Returns the sine in radians from a lookup table. + static public float Sin (float radians) { + return sin[(int)(radians * RadToIndex) & SIN_MASK]; + } + + /// Returns the cosine in radians from a lookup table. + static public float Cos (float radians) { + return sin[(int)((radians + PI / 2) * RadToIndex) & SIN_MASK]; + } + + /// Returns the sine in radians from a lookup table. + static public float SinDeg (float degrees) { + return sin[(int)(degrees * DegToIndex) & SIN_MASK]; + } + + /// Returns the cosine in radians from a lookup table. + static public float CosDeg (float degrees) { + return sin[(int)((degrees + 90) * DegToIndex) & SIN_MASK]; + } + + /// Returns atan2 in radians, faster but less accurate than Math.Atan2. Average error of 0.00231 radians (0.1323 + /// degrees), largest error of 0.00488 radians (0.2796 degrees). + static public float Atan2 (float y, float x) { + if (x == 0f) { + if (y > 0f) return PI / 2; + if (y == 0f) return 0f; + return -PI / 2; + } + float atan, z = y / x; + if (Math.Abs(z) < 1f) { + atan = z / (1f + 0.28f * z * z); + if (x < 0f) return atan + (y < 0f ? -PI : PI); + return atan; + } + atan = PI / 2 - z / (z * z + 0.28f); + return y < 0f ? atan - PI : atan; + } + + static public float Clamp (float value, float min, float max) { + if (value < min) return min; + if (value > max) return max; + return value; + } + } +} diff --git a/Assets/Spine/SpineCSharp/PathConstraint.cs b/Assets/Spine/SpineCSharp/PathConstraint.cs new file mode 100644 index 0000000..839dd55 --- /dev/null +++ b/Assets/Spine/SpineCSharp/PathConstraint.cs @@ -0,0 +1,417 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class PathConstraint : IConstraint { + const int NONE = -1, BEFORE = -2, AFTER = -3; + const float Epsilon = 0.00001f; + + internal PathConstraintData data; + internal ExposedList bones; + internal Slot target; + internal float position, spacing, rotateMix, translateMix; + + internal ExposedList spaces = new ExposedList(), positions = new ExposedList(); + internal ExposedList world = new ExposedList(), curves = new ExposedList(), lengths = new ExposedList(); + internal float[] segments = new float[10]; + + public int Order { get { return data.order; } } + public float Position { get { return position; } set { position = value; } } + public float Spacing { get { return spacing; } set { spacing = value; } } + public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } + public float TranslateMix { get { return translateMix; } set { translateMix = value; } } + public ExposedList Bones { get { return bones; } } + public Slot Target { get { return target; } set { target = value; } } + public PathConstraintData Data { get { return data; } } + + public PathConstraint (PathConstraintData data, Skeleton skeleton) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); + this.data = data; + bones = new ExposedList(data.Bones.Count); + foreach (BoneData boneData in data.bones) + bones.Add(skeleton.FindBone(boneData.name)); + target = skeleton.FindSlot(data.target.name); + position = data.position; + spacing = data.spacing; + rotateMix = data.rotateMix; + translateMix = data.translateMix; + } + + /// Applies the constraint to the constrained bones. + public void Apply () { + Update(); + } + + public void Update () { + PathAttachment attachment = target.Attachment as PathAttachment; + if (attachment == null) return; + + float rotateMix = this.rotateMix, translateMix = this.translateMix; + bool translate = translateMix > 0, rotate = rotateMix > 0; + if (!translate && !rotate) return; + + PathConstraintData data = this.data; + SpacingMode spacingMode = data.spacingMode; + bool lengthSpacing = spacingMode == SpacingMode.Length; + RotateMode rotateMode = data.rotateMode; + bool tangents = rotateMode == RotateMode.Tangent, scale = rotateMode == RotateMode.ChainScale; + int boneCount = this.bones.Count, spacesCount = tangents ? boneCount : boneCount + 1; + Bone[] bonesItems = this.bones.Items; + ExposedList spaces = this.spaces.Resize(spacesCount), lengths = null; + float spacing = this.spacing; + if (scale || lengthSpacing) { + if (scale) lengths = this.lengths.Resize(boneCount); + for (int i = 0, n = spacesCount - 1; i < n;) { + Bone bone = bonesItems[i]; + float setupLength = bone.data.length; + if (setupLength < PathConstraint.Epsilon) { + if (scale) lengths.Items[i] = 0; + spaces.Items[++i] = 0; + } else { + float x = setupLength * bone.a, y = setupLength * bone.c; + float length = (float)Math.Sqrt(x * x + y * y); + if (scale) lengths.Items[i] = length; + spaces.Items[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength; + } + } + } else { + for (int i = 1; i < spacesCount; i++) + spaces.Items[i] = spacing; + } + + float[] positions = ComputeWorldPositions(attachment, spacesCount, tangents, + data.positionMode == PositionMode.Percent, spacingMode == SpacingMode.Percent); + float boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation; + bool tip; + if (offsetRotation == 0) { + tip = rotateMode == RotateMode.Chain; + } else { + tip = false; + Bone p = target.bone; + offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.DegRad : -MathUtils.DegRad; + } + for (int i = 0, p = 3; i < boneCount; i++, p += 3) { + Bone bone = bonesItems[i]; + bone.worldX += (boneX - bone.worldX) * translateMix; + bone.worldY += (boneY - bone.worldY) * translateMix; + float x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY; + if (scale) { + float length = lengths.Items[i]; + if (length >= PathConstraint.Epsilon) { + float s = ((float)Math.Sqrt(dx * dx + dy * dy) / length - 1) * rotateMix + 1; + bone.a *= s; + bone.c *= s; + } + } + boneX = x; + boneY = y; + if (rotate) { + float a = bone.a, b = bone.b, c = bone.c, d = bone.d, r, cos, sin; + if (tangents) + r = positions[p - 1]; + else if (spaces.Items[i + 1] < PathConstraint.Epsilon) + r = positions[p + 2]; + else + r = MathUtils.Atan2(dy, dx); + r -= MathUtils.Atan2(c, a); + if (tip) { + cos = MathUtils.Cos(r); + sin = MathUtils.Sin(r); + float length = bone.data.length; + boneX += (length * (cos * a - sin * c) - dx) * rotateMix; + boneY += (length * (sin * a + cos * c) - dy) * rotateMix; + } else { + r += offsetRotation; + } + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) // + r += MathUtils.PI2; + r *= rotateMix; + cos = MathUtils.Cos(r); + sin = MathUtils.Sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + } + bone.appliedValid = false; + } + } + + float[] ComputeWorldPositions (PathAttachment path, int spacesCount, bool tangents, bool percentPosition, + bool percentSpacing) { + + Slot target = this.target; + float position = this.position; + float[] spacesItems = this.spaces.Items, output = this.positions.Resize(spacesCount * 3 + 2).Items, world; + bool closed = path.Closed; + int verticesLength = path.WorldVerticesLength, curveCount = verticesLength / 6, prevCurve = NONE; + + float pathLength; + if (!path.ConstantSpeed) { + float[] lengths = path.Lengths; + curveCount -= closed ? 1 : 2; + pathLength = lengths[curveCount]; + if (percentPosition) position *= pathLength; + if (percentSpacing) { + for (int i = 0; i < spacesCount; i++) + spacesItems[i] *= pathLength; + } + world = this.world.Resize(8).Items; + for (int i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { + float space = spacesItems[i]; + position += space; + float p = position; + + if (closed) { + p %= pathLength; + if (p < 0) p += pathLength; + curve = 0; + } else if (p < 0) { + if (prevCurve != BEFORE) { + prevCurve = BEFORE; + path.ComputeWorldVertices(target, 2, 4, world, 0); + } + AddBeforePosition(p, world, 0, output, o); + continue; + } else if (p > pathLength) { + if (prevCurve != AFTER) { + prevCurve = AFTER; + path.ComputeWorldVertices(target, verticesLength - 6, 4, world, 0); + } + AddAfterPosition(p - pathLength, world, 0, output, o); + continue; + } + + // Determine curve containing position. + for (;; curve++) { + float length = lengths[curve]; + if (p > length) continue; + if (curve == 0) + p /= length; + else { + float prev = lengths[curve - 1]; + p = (p - prev) / (length - prev); + } + break; + } + if (curve != prevCurve) { + prevCurve = curve; + if (closed && curve == curveCount) { + path.ComputeWorldVertices(target, verticesLength - 4, 4, world, 0); + path.ComputeWorldVertices(target, 0, 4, world, 4); + } else + path.ComputeWorldVertices(target, curve * 6 + 2, 8, world, 0); + } + AddCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], output, o, + tangents || (i > 0 && space < PathConstraint.Epsilon)); + } + return output; + } + + // World vertices. + if (closed) { + verticesLength += 2; + world = this.world.Resize(verticesLength).Items; + path.ComputeWorldVertices(target, 2, verticesLength - 4, world, 0); + path.ComputeWorldVertices(target, 0, 2, world, verticesLength - 4); + world[verticesLength - 2] = world[0]; + world[verticesLength - 1] = world[1]; + } else { + curveCount--; + verticesLength -= 4; + world = this.world.Resize(verticesLength).Items; + path.ComputeWorldVertices(target, 2, verticesLength, world, 0); + } + + // Curve lengths. + float[] curves = this.curves.Resize(curveCount).Items; + pathLength = 0; + float x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0; + float tmpx, tmpy, dddfx, dddfy, ddfx, ddfy, dfx, dfy; + for (int i = 0, w = 2; i < curveCount; i++, w += 6) { + cx1 = world[w]; + cy1 = world[w + 1]; + cx2 = world[w + 2]; + cy2 = world[w + 3]; + x2 = world[w + 4]; + y2 = world[w + 5]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.1875f; + tmpy = (y1 - cy1 * 2 + cy2) * 0.1875f; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375f; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375f; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.75f + tmpx + dddfx * 0.16666667f; + dfy = (cy1 - y1) * 0.75f + tmpy + dddfy * 0.16666667f; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + curves[i] = pathLength; + x1 = x2; + y1 = y2; + } + if (percentPosition) position *= pathLength; + if (percentSpacing) { + for (int i = 0; i < spacesCount; i++) + spacesItems[i] *= pathLength; + } + + float[] segments = this.segments; + float curveLength = 0; + for (int i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { + float space = spacesItems[i]; + position += space; + float p = position; + + if (closed) { + p %= pathLength; + if (p < 0) p += pathLength; + curve = 0; + } else if (p < 0) { + AddBeforePosition(p, world, 0, output, o); + continue; + } else if (p > pathLength) { + AddAfterPosition(p - pathLength, world, verticesLength - 4, output, o); + continue; + } + + // Determine curve containing position. + for (;; curve++) { + float length = curves[curve]; + if (p > length) continue; + if (curve == 0) + p /= length; + else { + float prev = curves[curve - 1]; + p = (p - prev) / (length - prev); + } + break; + } + + // Curve segment lengths. + if (curve != prevCurve) { + prevCurve = curve; + int ii = curve * 6; + x1 = world[ii]; + y1 = world[ii + 1]; + cx1 = world[ii + 2]; + cy1 = world[ii + 3]; + cx2 = world[ii + 4]; + cy2 = world[ii + 5]; + x2 = world[ii + 6]; + y2 = world[ii + 7]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.03f; + tmpy = (y1 - cy1 * 2 + cy2) * 0.03f; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006f; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006f; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.3f + tmpx + dddfx * 0.16666667f; + dfy = (cy1 - y1) * 0.3f + tmpy + dddfy * 0.16666667f; + curveLength = (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[0] = curveLength; + for (ii = 1; ii < 8; ii++) { + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + curveLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[ii] = curveLength; + } + dfx += ddfx; + dfy += ddfy; + curveLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[8] = curveLength; + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + curveLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[9] = curveLength; + segment = 0; + } + + // Weight by segment length. + p *= curveLength; + for (;; segment++) { + float length = segments[segment]; + if (p > length) continue; + if (segment == 0) + p /= length; + else { + float prev = segments[segment - 1]; + p = segment + (p - prev) / (length - prev); + } + break; + } + AddCurvePosition(p * 0.1f, x1, y1, cx1, cy1, cx2, cy2, x2, y2, output, o, tangents || (i > 0 && space < PathConstraint.Epsilon)); + } + return output; + } + + static void AddBeforePosition (float p, float[] temp, int i, float[] output, int o) { + float x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = MathUtils.Atan2(dy, dx); + output[o] = x1 + p * MathUtils.Cos(r); + output[o + 1] = y1 + p * MathUtils.Sin(r); + output[o + 2] = r; + } + + static void AddAfterPosition (float p, float[] temp, int i, float[] output, int o) { + float x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = MathUtils.Atan2(dy, dx); + output[o] = x1 + p * MathUtils.Cos(r); + output[o + 1] = y1 + p * MathUtils.Sin(r); + output[o + 2] = r; + } + + static void AddCurvePosition (float p, float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2, + float[] output, int o, bool tangents) { + if (p < PathConstraint.Epsilon || float.IsNaN(p)) p = PathConstraint.Epsilon; + float tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; + float ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; + float x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; + output[o] = x; + output[o + 1] = y; + if (tangents) + output[o + 2] = (float)Math.Atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + } + } +} diff --git a/Assets/Spine/SpineCSharp/PathConstraintData.cs b/Assets/Spine/SpineCSharp/PathConstraintData.cs new file mode 100644 index 0000000..e468184 --- /dev/null +++ b/Assets/Spine/SpineCSharp/PathConstraintData.cs @@ -0,0 +1,79 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class PathConstraintData { + internal string name; + internal int order; + internal ExposedList bones = new ExposedList(); + internal SlotData target; + internal PositionMode positionMode; + internal SpacingMode spacingMode; + internal RotateMode rotateMode; + internal float offsetRotation; + internal float position, spacing, rotateMix, translateMix; + + public string Name { get { return name; } } + public int Order { get { return order; } set { order = value; } } + public ExposedList Bones { get { return bones; } } + public SlotData Target { get { return target; } set { target = value; } } + public PositionMode PositionMode { get { return positionMode; } set { positionMode = value; } } + public SpacingMode SpacingMode { get { return spacingMode; } set { spacingMode = value; } } + public RotateMode RotateMode { get { return rotateMode; } set { rotateMode = value; } } + public float OffsetRotation { get { return offsetRotation; } set { offsetRotation = value; } } + public float Position { get { return position; } set { position = value; } } + public float Spacing { get { return spacing; } set { spacing = value; } } + public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } + public float TranslateMix { get { return translateMix; } set { translateMix = value; } } + + public PathConstraintData (String name) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.name = name; + } + + public override string ToString () { + return name; + } + } + + public enum PositionMode { + Fixed, Percent + } + + public enum SpacingMode { + Length, Fixed, Percent + } + + public enum RotateMode { + Tangent, Chain, ChainScale + } +} diff --git a/Assets/Spine/SpineCSharp/Skeleton.cs b/Assets/Spine/SpineCSharp/Skeleton.cs new file mode 100644 index 0000000..a0b1a01 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Skeleton.cs @@ -0,0 +1,541 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + public class Skeleton { + internal SkeletonData data; + internal ExposedList bones; + internal ExposedList slots; + internal ExposedList drawOrder; + internal ExposedList ikConstraints; + internal ExposedList transformConstraints; + internal ExposedList pathConstraints; + internal ExposedList updateCache = new ExposedList(); + internal ExposedList updateCacheReset = new ExposedList(); + internal Skin skin; + internal float r = 1, g = 1, b = 1, a = 1; + internal float time; + internal bool flipX, flipY; + internal float x, y; + + public SkeletonData Data { get { return data; } } + public ExposedList Bones { get { return bones; } } + public ExposedList UpdateCacheList { get { return updateCache; } } + public ExposedList Slots { get { return slots; } } + public ExposedList DrawOrder { get { return drawOrder; } } + public ExposedList IkConstraints { get { return ikConstraints; } } + public ExposedList PathConstraints { get { return pathConstraints; } } + public ExposedList TransformConstraints { get { return transformConstraints; } } + public Skin Skin { get { return skin; } set { skin = value; } } + public float R { get { return r; } set { r = value; } } + public float G { get { return g; } set { g = value; } } + public float B { get { return b; } set { b = value; } } + public float A { get { return a; } set { a = value; } } + public float Time { get { return time; } set { time = value; } } + public float X { get { return x; } set { x = value; } } + public float Y { get { return y; } set { y = value; } } + public bool FlipX { get { return flipX; } set { flipX = value; } } + public bool FlipY { get { return flipY; } set { flipY = value; } } + + public Bone RootBone { + get { return bones.Count == 0 ? null : bones.Items[0]; } + } + + public Skeleton (SkeletonData data) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + this.data = data; + + bones = new ExposedList(data.bones.Count); + foreach (BoneData boneData in data.bones) { + Bone bone; + if (boneData.parent == null) { + bone = new Bone(boneData, this, null); + } else { + Bone parent = bones.Items[boneData.parent.index]; + bone = new Bone(boneData, this, parent); + parent.children.Add(bone); + } + bones.Add(bone); + } + + slots = new ExposedList(data.slots.Count); + drawOrder = new ExposedList(data.slots.Count); + foreach (SlotData slotData in data.slots) { + Bone bone = bones.Items[slotData.boneData.index]; + Slot slot = new Slot(slotData, bone); + slots.Add(slot); + drawOrder.Add(slot); + } + + ikConstraints = new ExposedList(data.ikConstraints.Count); + foreach (IkConstraintData ikConstraintData in data.ikConstraints) + ikConstraints.Add(new IkConstraint(ikConstraintData, this)); + + transformConstraints = new ExposedList(data.transformConstraints.Count); + foreach (TransformConstraintData transformConstraintData in data.transformConstraints) + transformConstraints.Add(new TransformConstraint(transformConstraintData, this)); + + pathConstraints = new ExposedList (data.pathConstraints.Count); + foreach (PathConstraintData pathConstraintData in data.pathConstraints) + pathConstraints.Add(new PathConstraint(pathConstraintData, this)); + + UpdateCache(); + UpdateWorldTransform(); + } + + /// Caches information about bones and constraints. Must be called if bones, constraints or weighted path attachments are added + /// or removed. + public void UpdateCache () { + ExposedList updateCache = this.updateCache; + updateCache.Clear(); + this.updateCacheReset.Clear(); + + ExposedList bones = this.bones; + for (int i = 0, n = bones.Count; i < n; i++) + bones.Items[i].sorted = false; + + ExposedList ikConstraints = this.ikConstraints; + var transformConstraints = this.transformConstraints; + var pathConstraints = this.pathConstraints; + int ikCount = IkConstraints.Count, transformCount = transformConstraints.Count, pathCount = pathConstraints.Count; + int constraintCount = ikCount + transformCount + pathCount; + //outer: + for (int i = 0; i < constraintCount; i++) { + for (int ii = 0; ii < ikCount; ii++) { + IkConstraint constraint = ikConstraints.Items[ii]; + if (constraint.data.order == i) { + SortIkConstraint(constraint); + goto continue_outer; //continue outer; + } + } + for (int ii = 0; ii < transformCount; ii++) { + TransformConstraint constraint = transformConstraints.Items[ii]; + if (constraint.data.order == i) { + SortTransformConstraint(constraint); + goto continue_outer; //continue outer; + } + } + for (int ii = 0; ii < pathCount; ii++) { + PathConstraint constraint = pathConstraints.Items[ii]; + if (constraint.data.order == i) { + SortPathConstraint(constraint); + goto continue_outer; //continue outer; + } + } + continue_outer: {} + } + + for (int i = 0, n = bones.Count; i < n; i++) + SortBone(bones.Items[i]); + } + + private void SortIkConstraint (IkConstraint constraint) { + Bone target = constraint.target; + SortBone(target); + + var constrained = constraint.bones; + Bone parent = constrained.Items[0]; + SortBone(parent); + + if (constrained.Count > 1) { + Bone child = constrained.Items[constrained.Count - 1]; + if (!updateCache.Contains(child)) + updateCacheReset.Add(child); + } + + updateCache.Add(constraint); + + SortReset(parent.children); + constrained.Items[constrained.Count - 1].sorted = true; + } + + private void SortPathConstraint (PathConstraint constraint) { + Slot slot = constraint.target; + int slotIndex = slot.data.index; + Bone slotBone = slot.bone; + if (skin != null) SortPathConstraintAttachment(skin, slotIndex, slotBone); + if (data.defaultSkin != null && data.defaultSkin != skin) + SortPathConstraintAttachment(data.defaultSkin, slotIndex, slotBone); + for (int ii = 0, nn = data.skins.Count; ii < nn; ii++) + SortPathConstraintAttachment(data.skins.Items[ii], slotIndex, slotBone); + + Attachment attachment = slot.attachment; + if (attachment is PathAttachment) SortPathConstraintAttachment(attachment, slotBone); + + var constrained = constraint.bones; + int boneCount = constrained.Count; + for (int i = 0; i < boneCount; i++) + SortBone(constrained.Items[i]); + + updateCache.Add(constraint); + + for (int i = 0; i < boneCount; i++) + SortReset(constrained.Items[i].children); + for (int i = 0; i < boneCount; i++) + constrained.Items[i].sorted = true; + } + + private void SortTransformConstraint (TransformConstraint constraint) { + SortBone(constraint.target); + + var constrained = constraint.bones; + int boneCount = constrained.Count; + if (constraint.data.local) { + for (int i = 0; i < boneCount; i++) { + Bone child = constrained.Items[i]; + SortBone(child.parent); + if (!updateCache.Contains(child)) updateCacheReset.Add(child); + } + } else { + for (int i = 0; i < boneCount; i++) + SortBone(constrained.Items[i]); + } + + updateCache.Add(constraint); + + for (int i = 0; i < boneCount; i++) + SortReset(constrained.Items[i].children); + for (int i = 0; i < boneCount; i++) + constrained.Items[i].sorted = true; + } + + private void SortPathConstraintAttachment (Skin skin, int slotIndex, Bone slotBone) { + foreach (var entry in skin.Attachments) + if (entry.Key.slotIndex == slotIndex) SortPathConstraintAttachment(entry.Value, slotBone); + } + + private void SortPathConstraintAttachment (Attachment attachment, Bone slotBone) { + if (!(attachment is PathAttachment)) return; + int[] pathBones = ((PathAttachment)attachment).bones; + if (pathBones == null) + SortBone(slotBone); + else { + var bones = this.bones; + for (int i = 0, n = pathBones.Length; i < n;) { + int nn = pathBones[i++]; + nn += i; + while (i < nn) + SortBone(bones.Items[pathBones[i++]]); + } + } + } + + private void SortBone (Bone bone) { + if (bone.sorted) return; + Bone parent = bone.parent; + if (parent != null) SortBone(parent); + bone.sorted = true; + updateCache.Add(bone); + } + + private static void SortReset (ExposedList bones) { + var bonesItems = bones.Items; + for (int i = 0, n = bones.Count; i < n; i++) { + Bone bone = bonesItems[i]; + if (bone.sorted) SortReset(bone.children); + bone.sorted = false; + } + } + + /// Updates the world transform for each bone and applies constraints. + public void UpdateWorldTransform () { + var updateCacheReset = this.updateCacheReset; + var updateCacheResetItems = updateCacheReset.Items; + for (int i = 0, n = updateCacheReset.Count; i < n; i++) { + Bone bone = updateCacheResetItems[i]; + bone.ax = bone.x; + bone.ay = bone.y; + bone.arotation = bone.rotation; + bone.ascaleX = bone.scaleX; + bone.ascaleY = bone.scaleY; + bone.ashearX = bone.shearX; + bone.ashearY = bone.shearY; + bone.appliedValid = true; + } + var updateItems = this.updateCache.Items; + for (int i = 0, n = updateCache.Count; i < n; i++) + updateItems[i].Update(); + } + + /// Sets the bones, constraints, and slots to their setup pose values. + public void SetToSetupPose () { + SetBonesToSetupPose(); + SetSlotsToSetupPose(); + } + + /// Sets the bones and constraints to their setup pose values. + public void SetBonesToSetupPose () { + var bonesItems = this.bones.Items; + for (int i = 0, n = bones.Count; i < n; i++) + bonesItems[i].SetToSetupPose(); + + var ikConstraintsItems = this.ikConstraints.Items; + for (int i = 0, n = ikConstraints.Count; i < n; i++) { + IkConstraint constraint = ikConstraintsItems[i]; + constraint.bendDirection = constraint.data.bendDirection; + constraint.mix = constraint.data.mix; + } + + var transformConstraintsItems = this.transformConstraints.Items; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + TransformConstraint constraint = transformConstraintsItems[i]; + TransformConstraintData constraintData = constraint.data; + constraint.rotateMix = constraintData.rotateMix; + constraint.translateMix = constraintData.translateMix; + constraint.scaleMix = constraintData.scaleMix; + constraint.shearMix = constraintData.shearMix; + } + + var pathConstraintItems = this.pathConstraints.Items; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + PathConstraint constraint = pathConstraintItems[i]; + PathConstraintData constraintData = constraint.data; + constraint.position = constraintData.position; + constraint.spacing = constraintData.spacing; + constraint.rotateMix = constraintData.rotateMix; + constraint.translateMix = constraintData.translateMix; + } + } + + public void SetSlotsToSetupPose () { + var slots = this.slots; + var slotsItems = slots.Items; + drawOrder.Clear(); + for (int i = 0, n = slots.Count; i < n; i++) + drawOrder.Add(slotsItems[i]); + + for (int i = 0, n = slots.Count; i < n; i++) + slotsItems[i].SetToSetupPose(); + } + + /// May be null. + public Bone FindBone (string boneName) { + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); + var bones = this.bones; + var bonesItems = bones.Items; + for (int i = 0, n = bones.Count; i < n; i++) { + Bone bone = bonesItems[i]; + if (bone.data.name == boneName) return bone; + } + return null; + } + + /// -1 if the bone was not found. + public int FindBoneIndex (string boneName) { + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); + var bones = this.bones; + var bonesItems = bones.Items; + for (int i = 0, n = bones.Count; i < n; i++) + if (bonesItems[i].data.name == boneName) return i; + return -1; + } + + /// May be null. + public Slot FindSlot (string slotName) { + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); + var slots = this.slots; + var slotsItems = slots.Items; + for (int i = 0, n = slots.Count; i < n; i++) { + Slot slot = slotsItems[i]; + if (slot.data.name == slotName) return slot; + } + return null; + } + + /// -1 if the bone was not found. + public int FindSlotIndex (string slotName) { + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); + var slots = this.slots; + var slotsItems = slots.Items; + for (int i = 0, n = slots.Count; i < n; i++) + if (slotsItems[i].data.name.Equals(slotName)) return i; + return -1; + } + + /// Sets a skin by name (see SetSkin). + public void SetSkin (string skinName) { + Skin foundSkin = data.FindSkin(skinName); + if (foundSkin == null) throw new ArgumentException("Skin not found: " + skinName, "skinName"); + SetSkin(foundSkin); + } + + /// + /// Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. + /// If there was no old skin, each slot's setup mode attachment is attached from the new skin. + /// After changing the skin, the visible attachments can be reset to those attached in the setup pose by calling + /// . + /// Also, often is called before the next time the + /// skeleton is rendered to allow any attachment keys in the current animation(s) to hide or show attachments from the new skin. + /// + /// May be null. + public void SetSkin (Skin newSkin) { + if (newSkin != null) { + if (skin != null) + newSkin.AttachAll(this, skin); + else { + ExposedList slots = this.slots; + for (int i = 0, n = slots.Count; i < n; i++) { + Slot slot = slots.Items[i]; + string name = slot.data.attachmentName; + if (name != null) { + Attachment attachment = newSkin.GetAttachment(i, name); + if (attachment != null) slot.Attachment = attachment; + } + } + } + } + skin = newSkin; + } + + /// May be null. + public Attachment GetAttachment (string slotName, string attachmentName) { + return GetAttachment(data.FindSlotIndex(slotName), attachmentName); + } + + /// May be null. + public Attachment GetAttachment (int slotIndex, string attachmentName) { + if (attachmentName == null) throw new ArgumentNullException("attachmentName", "attachmentName cannot be null."); + if (skin != null) { + Attachment attachment = skin.GetAttachment(slotIndex, attachmentName); + if (attachment != null) return attachment; + } + return data.defaultSkin != null ? data.defaultSkin.GetAttachment(slotIndex, attachmentName) : null; + } + + /// May be null. + public void SetAttachment (string slotName, string attachmentName) { + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); + ExposedList slots = this.slots; + for (int i = 0, n = slots.Count; i < n; i++) { + Slot slot = slots.Items[i]; + if (slot.data.name == slotName) { + Attachment attachment = null; + if (attachmentName != null) { + attachment = GetAttachment(i, attachmentName); + if (attachment == null) throw new Exception("Attachment not found: " + attachmentName + ", for slot: " + slotName); + } + slot.Attachment = attachment; + return; + } + } + throw new Exception("Slot not found: " + slotName); + } + + /// May be null. + public IkConstraint FindIkConstraint (string constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList ikConstraints = this.ikConstraints; + for (int i = 0, n = ikConstraints.Count; i < n; i++) { + IkConstraint ikConstraint = ikConstraints.Items[i]; + if (ikConstraint.data.name == constraintName) return ikConstraint; + } + return null; + } + + /// May be null. + public TransformConstraint FindTransformConstraint (string constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList transformConstraints = this.transformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + TransformConstraint transformConstraint = transformConstraints.Items[i]; + if (transformConstraint.data.name == constraintName) return transformConstraint; + } + return null; + } + + /// May be null. + public PathConstraint FindPathConstraint (string constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + PathConstraint constraint = pathConstraints.Items[i]; + if (constraint.data.name.Equals(constraintName)) return constraint; + } + return null; + } + + public void Update (float delta) { + time += delta; + } + + /// Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose. + /// The horizontal distance between the skeleton origin and the left side of the AABB. + /// The vertical distance between the skeleton origin and the bottom side of the AABB. + /// The width of the AABB + /// The height of the AABB. + /// Reference to hold a float[]. May be a null reference. This method will assign it a new float[] with the appropriate size as needed. + public void GetBounds (out float x, out float y, out float width, out float height, ref float[] vertexBuffer) { + float[] temp = vertexBuffer; + temp = temp ?? new float[8]; + var drawOrderItems = this.drawOrder.Items; + float minX = int.MaxValue, minY = int.MaxValue, maxX = int.MinValue, maxY = int.MinValue; + for (int i = 0, n = this.drawOrder.Count; i < n; i++) { + Slot slot = drawOrderItems[i]; + int verticesLength = 0; + float[] vertices = null; + Attachment attachment = slot.attachment; + var regionAttachment = attachment as RegionAttachment; + if (regionAttachment != null) { + verticesLength = 8; + vertices = temp; + if (vertices.Length < 8) vertices = temp = new float[8]; + regionAttachment.ComputeWorldVertices(slot.bone, temp, 0); + } else { + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) { + MeshAttachment mesh = meshAttachment; + verticesLength = mesh.WorldVerticesLength; + vertices = temp; + if (vertices.Length < verticesLength) vertices = temp = new float[verticesLength]; + mesh.ComputeWorldVertices(slot, 0, verticesLength, temp, 0); + } + } + + if (vertices != null) { + for (int ii = 0; ii < verticesLength; ii += 2) { + float vx = vertices[ii], vy = vertices[ii + 1]; + minX = Math.Min(minX, vx); + minY = Math.Min(minY, vy); + maxX = Math.Max(maxX, vx); + maxY = Math.Max(maxY, vy); + } + } + } + x = minX; + y = minY; + width = maxX - minX; + height = maxY - minY; + vertexBuffer = temp; + } + } +} diff --git a/Assets/Spine/SpineCSharp/SkeletonBinary.cs b/Assets/Spine/SpineCSharp/SkeletonBinary.cs new file mode 100644 index 0000000..1f009f9 --- /dev/null +++ b/Assets/Spine/SpineCSharp/SkeletonBinary.cs @@ -0,0 +1,893 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if (UNITY_5 || UNITY_5_3_OR_NEWER || UNITY_WSA || UNITY_WP8 || UNITY_WP8_1) +#define IS_UNITY +#endif + +using System; +using System.IO; +using System.Collections.Generic; + +#if WINDOWS_STOREAPP +using System.Threading.Tasks; +using Windows.Storage; +#endif + +namespace Spine { + public class SkeletonBinary { + public const int BONE_ROTATE = 0; + public const int BONE_TRANSLATE = 1; + public const int BONE_SCALE = 2; + public const int BONE_SHEAR = 3; + + public const int SLOT_ATTACHMENT = 0; + public const int SLOT_COLOR = 1; + public const int SLOT_TWO_COLOR = 2; + + public const int PATH_POSITION = 0; + public const int PATH_SPACING = 1; + public const int PATH_MIX = 2; + + public const int CURVE_LINEAR = 0; + public const int CURVE_STEPPED = 1; + public const int CURVE_BEZIER = 2; + + public float Scale { get; set; } + + private AttachmentLoader attachmentLoader; + private byte[] buffer = new byte[32]; + private List linkedMeshes = new List(); + + public SkeletonBinary (params Atlas[] atlasArray) + : this(new AtlasAttachmentLoader(atlasArray)) { + } + + public SkeletonBinary (AttachmentLoader attachmentLoader) { + if (attachmentLoader == null) throw new ArgumentNullException("attachmentLoader"); + this.attachmentLoader = attachmentLoader; + Scale = 1; + } + + #if !ISUNITY && WINDOWS_STOREAPP + private async Task ReadFile(string path) { + var folder = Windows.ApplicationModel.Package.Current.InstalledLocation; + using (var input = new BufferedStream(await folder.GetFileAsync(path).AsTask().ConfigureAwait(false))) { + SkeletonData skeletonData = ReadSkeletonData(input); + skeletonData.Name = Path.GetFileNameWithoutExtension(path); + return skeletonData; + } + } + + public SkeletonData ReadSkeletonData (String path) { + return this.ReadFile(path).Result; + } + #else + public SkeletonData ReadSkeletonData (String path) { + #if WINDOWS_PHONE + using (var input = new BufferedStream(Microsoft.Xna.Framework.TitleContainer.OpenStream(path))) { + #else + using (var input = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { + #endif + SkeletonData skeletonData = ReadSkeletonData(input); + skeletonData.name = Path.GetFileNameWithoutExtension(path); + return skeletonData; + } + } + #endif // WINDOWS_STOREAPP + + public static readonly TransformMode[] TransformModeValues = { + TransformMode.Normal, + TransformMode.OnlyTranslation, + TransformMode.NoRotationOrReflection, + TransformMode.NoScale, + TransformMode.NoScaleOrReflection + }; + + /// Returns the version string of binary skeleton data. + public static string GetVersionString (Stream input) { + if (input == null) throw new ArgumentNullException("input"); + + try { + // Hash. + int byteCount = ReadVarint(input, true); + if (byteCount > 1) input.Position += byteCount - 1; + + // Version. + byteCount = ReadVarint(input, true); + if (byteCount > 1) { + byteCount--; + var buffer = new byte[byteCount]; + ReadFully(input, buffer, 0, byteCount); + return System.Text.Encoding.UTF8.GetString(buffer, 0, byteCount); + } + + throw new ArgumentException("Stream does not contain a valid binary Skeleton Data.", "input"); + } catch (Exception e) { + throw new ArgumentException("Stream does not contain a valid binary Skeleton Data.\n" + e, "input"); + } + } + + public SkeletonData ReadSkeletonData (Stream input) { + if (input == null) throw new ArgumentNullException("input"); + float scale = Scale; + + var skeletonData = new SkeletonData(); + skeletonData.hash = ReadString(input); + if (skeletonData.hash.Length == 0) skeletonData.hash = null; + skeletonData.version = ReadString(input); + if (skeletonData.version.Length == 0) skeletonData.version = null; + skeletonData.width = ReadFloat(input); + skeletonData.height = ReadFloat(input); + + bool nonessential = ReadBoolean(input); + + if (nonessential) { + skeletonData.fps = ReadFloat(input); + skeletonData.imagesPath = ReadString(input); + if (skeletonData.imagesPath.Length == 0) skeletonData.imagesPath = null; + } + + // Bones. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + String name = ReadString(input); + BoneData parent = i == 0 ? null : skeletonData.bones.Items[ReadVarint(input, true)]; + BoneData data = new BoneData(i, name, parent); + data.rotation = ReadFloat(input); + data.x = ReadFloat(input) * scale; + data.y = ReadFloat(input) * scale; + data.scaleX = ReadFloat(input); + data.scaleY = ReadFloat(input); + data.shearX = ReadFloat(input); + data.shearY = ReadFloat(input); + data.length = ReadFloat(input) * scale; + data.transformMode = TransformModeValues[ReadVarint(input, true)]; + if (nonessential) ReadInt(input); // Skip bone color. + skeletonData.bones.Add(data); + } + + // Slots. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + String slotName = ReadString(input); + BoneData boneData = skeletonData.bones.Items[ReadVarint(input, true)]; + SlotData slotData = new SlotData(i, slotName, boneData); + int color = ReadInt(input); + slotData.r = ((color & 0xff000000) >> 24) / 255f; + slotData.g = ((color & 0x00ff0000) >> 16) / 255f; + slotData.b = ((color & 0x0000ff00) >> 8) / 255f; + slotData.a = ((color & 0x000000ff)) / 255f; + + int darkColor = ReadInt(input); // 0x00rrggbb + if (darkColor != -1) { + slotData.hasSecondColor = true; + slotData.r2 = ((darkColor & 0x00ff0000) >> 16) / 255f; + slotData.g2 = ((darkColor & 0x0000ff00) >> 8) / 255f; + slotData.b2 = ((darkColor & 0x000000ff)) / 255f; + } + + slotData.attachmentName = ReadString(input); + slotData.blendMode = (BlendMode)ReadVarint(input, true); + skeletonData.slots.Add(slotData); + } + + // IK constraints. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + IkConstraintData data = new IkConstraintData(ReadString(input)); + data.order = ReadVarint(input, true); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) + data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]); + data.target = skeletonData.bones.Items[ReadVarint(input, true)]; + data.mix = ReadFloat(input); + data.bendDirection = ReadSByte(input); + skeletonData.ikConstraints.Add(data); + } + + // Transform constraints. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + TransformConstraintData data = new TransformConstraintData(ReadString(input)); + data.order = ReadVarint(input, true); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) + data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]); + data.target = skeletonData.bones.Items[ReadVarint(input, true)]; + data.local = ReadBoolean(input); + data.relative = ReadBoolean(input); + data.offsetRotation = ReadFloat(input); + data.offsetX = ReadFloat(input) * scale; + data.offsetY = ReadFloat(input) * scale; + data.offsetScaleX = ReadFloat(input); + data.offsetScaleY = ReadFloat(input); + data.offsetShearY = ReadFloat(input); + data.rotateMix = ReadFloat(input); + data.translateMix = ReadFloat(input); + data.scaleMix = ReadFloat(input); + data.shearMix = ReadFloat(input); + skeletonData.transformConstraints.Add(data); + } + + // Path constraints + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + PathConstraintData data = new PathConstraintData(ReadString(input)); + data.order = ReadVarint(input, true); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) + data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]); + data.target = skeletonData.slots.Items[ReadVarint(input, true)]; + data.positionMode = (PositionMode)Enum.GetValues(typeof(PositionMode)).GetValue(ReadVarint(input, true)); + data.spacingMode = (SpacingMode)Enum.GetValues(typeof(SpacingMode)).GetValue(ReadVarint(input, true)); + data.rotateMode = (RotateMode)Enum.GetValues(typeof(RotateMode)).GetValue(ReadVarint(input, true)); + data.offsetRotation = ReadFloat(input); + data.position = ReadFloat(input); + if (data.positionMode == PositionMode.Fixed) data.position *= scale; + data.spacing = ReadFloat(input); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale; + data.rotateMix = ReadFloat(input); + data.translateMix = ReadFloat(input); + skeletonData.pathConstraints.Add(data); + } + + // Default skin. + Skin defaultSkin = ReadSkin(input, skeletonData, "default", nonessential); + if (defaultSkin != null) { + skeletonData.defaultSkin = defaultSkin; + skeletonData.skins.Add(defaultSkin); + } + + // Skins. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) + skeletonData.skins.Add(ReadSkin(input, skeletonData, ReadString(input), nonessential)); + + // Linked meshes. + for (int i = 0, n = linkedMeshes.Count; i < n; i++) { + SkeletonJson.LinkedMesh linkedMesh = linkedMeshes[i]; + Skin skin = linkedMesh.skin == null ? skeletonData.DefaultSkin : skeletonData.FindSkin(linkedMesh.skin); + if (skin == null) throw new Exception("Skin not found: " + linkedMesh.skin); + Attachment parent = skin.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent); + if (parent == null) throw new Exception("Parent mesh not found: " + linkedMesh.parent); + linkedMesh.mesh.ParentMesh = (MeshAttachment)parent; + linkedMesh.mesh.UpdateUVs(); + } + linkedMeshes.Clear(); + + // Events. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + EventData data = new EventData(ReadString(input)); + data.Int = ReadVarint(input, false); + data.Float = ReadFloat(input); + data.String = ReadString(input); + skeletonData.events.Add(data); + } + + // Animations. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) + ReadAnimation(ReadString(input), input, skeletonData); + + skeletonData.bones.TrimExcess(); + skeletonData.slots.TrimExcess(); + skeletonData.skins.TrimExcess(); + skeletonData.events.TrimExcess(); + skeletonData.animations.TrimExcess(); + skeletonData.ikConstraints.TrimExcess(); + skeletonData.pathConstraints.TrimExcess(); + return skeletonData; + } + + + /// May be null. + private Skin ReadSkin (Stream input, SkeletonData skeletonData, String skinName, bool nonessential) { + int slotCount = ReadVarint(input, true); + if (slotCount == 0) return null; + Skin skin = new Skin(skinName); + for (int i = 0; i < slotCount; i++) { + int slotIndex = ReadVarint(input, true); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) { + String name = ReadString(input); + Attachment attachment = ReadAttachment(input, skeletonData, skin, slotIndex, name, nonessential); + if (attachment != null) skin.AddAttachment(slotIndex, name, attachment); + } + } + return skin; + } + + private Attachment ReadAttachment (Stream input, SkeletonData skeletonData, Skin skin, int slotIndex, String attachmentName, bool nonessential) { + float scale = Scale; + + String name = ReadString(input); + if (name == null) name = attachmentName; + + AttachmentType type = (AttachmentType)input.ReadByte(); + switch (type) { + case AttachmentType.Region: { + String path = ReadString(input); + float rotation = ReadFloat(input); + float x = ReadFloat(input); + float y = ReadFloat(input); + float scaleX = ReadFloat(input); + float scaleY = ReadFloat(input); + float width = ReadFloat(input); + float height = ReadFloat(input); + int color = ReadInt(input); + + if (path == null) path = name; + RegionAttachment region = attachmentLoader.NewRegionAttachment(skin, name, path); + if (region == null) return null; + region.Path = path; + region.x = x * scale; + region.y = y * scale; + region.scaleX = scaleX; + region.scaleY = scaleY; + region.rotation = rotation; + region.width = width * scale; + region.height = height * scale; + region.r = ((color & 0xff000000) >> 24) / 255f; + region.g = ((color & 0x00ff0000) >> 16) / 255f; + region.b = ((color & 0x0000ff00) >> 8) / 255f; + region.a = ((color & 0x000000ff)) / 255f; + region.UpdateOffset(); + return region; + } + case AttachmentType.Boundingbox: { + int vertexCount = ReadVarint(input, true); + Vertices vertices = ReadVertices(input, vertexCount); + if (nonessential) ReadInt(input); //int color = nonessential ? ReadInt(input) : 0; // Avoid unused local warning. + + BoundingBoxAttachment box = attachmentLoader.NewBoundingBoxAttachment(skin, name); + if (box == null) return null; + box.worldVerticesLength = vertexCount << 1; + box.vertices = vertices.vertices; + box.bones = vertices.bones; + return box; + } + case AttachmentType.Mesh: { + String path = ReadString(input); + int color = ReadInt(input); + int vertexCount = ReadVarint(input, true); + float[] uvs = ReadFloatArray(input, vertexCount << 1, 1); + int[] triangles = ReadShortArray(input); + Vertices vertices = ReadVertices(input, vertexCount); + int hullLength = ReadVarint(input, true); + int[] edges = null; + float width = 0, height = 0; + if (nonessential) { + edges = ReadShortArray(input); + width = ReadFloat(input); + height = ReadFloat(input); + } + + if (path == null) path = name; + MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); + if (mesh == null) return null; + mesh.Path = path; + mesh.r = ((color & 0xff000000) >> 24) / 255f; + mesh.g = ((color & 0x00ff0000) >> 16) / 255f; + mesh.b = ((color & 0x0000ff00) >> 8) / 255f; + mesh.a = ((color & 0x000000ff)) / 255f; + mesh.bones = vertices.bones; + mesh.vertices = vertices.vertices; + mesh.WorldVerticesLength = vertexCount << 1; + mesh.triangles = triangles; + mesh.regionUVs = uvs; + mesh.UpdateUVs(); + mesh.HullLength = hullLength << 1; + if (nonessential) { + mesh.Edges = edges; + mesh.Width = width * scale; + mesh.Height = height * scale; + } + return mesh; + } + case AttachmentType.Linkedmesh: { + String path = ReadString(input); + int color = ReadInt(input); + String skinName = ReadString(input); + String parent = ReadString(input); + bool inheritDeform = ReadBoolean(input); + float width = 0, height = 0; + if (nonessential) { + width = ReadFloat(input); + height = ReadFloat(input); + } + + if (path == null) path = name; + MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); + if (mesh == null) return null; + mesh.Path = path; + mesh.r = ((color & 0xff000000) >> 24) / 255f; + mesh.g = ((color & 0x00ff0000) >> 16) / 255f; + mesh.b = ((color & 0x0000ff00) >> 8) / 255f; + mesh.a = ((color & 0x000000ff)) / 255f; + mesh.inheritDeform = inheritDeform; + if (nonessential) { + mesh.Width = width * scale; + mesh.Height = height * scale; + } + linkedMeshes.Add(new SkeletonJson.LinkedMesh(mesh, skinName, slotIndex, parent)); + return mesh; + } + case AttachmentType.Path: { + bool closed = ReadBoolean(input); + bool constantSpeed = ReadBoolean(input); + int vertexCount = ReadVarint(input, true); + Vertices vertices = ReadVertices(input, vertexCount); + float[] lengths = new float[vertexCount / 3]; + for (int i = 0, n = lengths.Length; i < n; i++) + lengths[i] = ReadFloat(input) * scale; + if (nonessential) ReadInt(input); //int color = nonessential ? ReadInt(input) : 0; + + PathAttachment path = attachmentLoader.NewPathAttachment(skin, name); + if (path == null) return null; + path.closed = closed; + path.constantSpeed = constantSpeed; + path.worldVerticesLength = vertexCount << 1; + path.vertices = vertices.vertices; + path.bones = vertices.bones; + path.lengths = lengths; + return path; + } + case AttachmentType.Point: { + float rotation = ReadFloat(input); + float x = ReadFloat(input); + float y = ReadFloat(input); + if (nonessential) ReadInt(input); //int color = nonessential ? ReadInt(input) : 0; + + PointAttachment point = attachmentLoader.NewPointAttachment(skin, name); + if (point == null) return null; + point.x = x * scale; + point.y = y * scale; + point.rotation = rotation; + //if (nonessential) point.color = color; + return point; + } + case AttachmentType.Clipping: { + int endSlotIndex = ReadVarint(input, true); + int vertexCount = ReadVarint(input, true); + Vertices vertices = ReadVertices(input, vertexCount); + if (nonessential) ReadInt(input); + + ClippingAttachment clip = attachmentLoader.NewClippingAttachment(skin, name); + if (clip == null) return null; + clip.EndSlot = skeletonData.slots.Items[endSlotIndex]; + clip.worldVerticesLength = vertexCount << 1; + clip.vertices = vertices.vertices; + clip.bones = vertices.bones; + return clip; + } + } + return null; + } + + private Vertices ReadVertices (Stream input, int vertexCount) { + float scale = Scale; + int verticesLength = vertexCount << 1; + Vertices vertices = new Vertices(); + if(!ReadBoolean(input)) { + vertices.vertices = ReadFloatArray(input, verticesLength, scale); + return vertices; + } + var weights = new ExposedList(verticesLength * 3 * 3); + var bonesArray = new ExposedList(verticesLength * 3); + for (int i = 0; i < vertexCount; i++) { + int boneCount = ReadVarint(input, true); + bonesArray.Add(boneCount); + for (int ii = 0; ii < boneCount; ii++) { + bonesArray.Add(ReadVarint(input, true)); + weights.Add(ReadFloat(input) * scale); + weights.Add(ReadFloat(input) * scale); + weights.Add(ReadFloat(input)); + } + } + + vertices.vertices = weights.ToArray(); + vertices.bones = bonesArray.ToArray(); + return vertices; + } + + private float[] ReadFloatArray (Stream input, int n, float scale) { + float[] array = new float[n]; + if (scale == 1) { + for (int i = 0; i < n; i++) + array[i] = ReadFloat(input); + } else { + for (int i = 0; i < n; i++) + array[i] = ReadFloat(input) * scale; + } + return array; + } + + private int[] ReadShortArray (Stream input) { + int n = ReadVarint(input, true); + int[] array = new int[n]; + for (int i = 0; i < n; i++) + array[i] = (input.ReadByte() << 8) | input.ReadByte(); + return array; + } + + private void ReadAnimation (String name, Stream input, SkeletonData skeletonData) { + var timelines = new ExposedList(); + float scale = Scale; + float duration = 0; + + // Slot timelines. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + int slotIndex = ReadVarint(input, true); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) { + int timelineType = input.ReadByte(); + int frameCount = ReadVarint(input, true); + switch (timelineType) { + case SLOT_ATTACHMENT: { + AttachmentTimeline timeline = new AttachmentTimeline(frameCount); + timeline.slotIndex = slotIndex; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) + timeline.SetFrame(frameIndex, ReadFloat(input), ReadString(input)); + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[frameCount - 1]); + break; + } + case SLOT_COLOR: { + ColorTimeline timeline = new ColorTimeline(frameCount); + timeline.slotIndex = slotIndex; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + float time = ReadFloat(input); + int color = ReadInt(input); + float r = ((color & 0xff000000) >> 24) / 255f; + float g = ((color & 0x00ff0000) >> 16) / 255f; + float b = ((color & 0x0000ff00) >> 8) / 255f; + float a = ((color & 0x000000ff)) / 255f; + timeline.SetFrame(frameIndex, time, r, g, b, a); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * ColorTimeline.ENTRIES]); + break; + } + case SLOT_TWO_COLOR: { + TwoColorTimeline timeline = new TwoColorTimeline(frameCount); + timeline.slotIndex = slotIndex; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + float time = ReadFloat(input); + int color = ReadInt(input); + float r = ((color & 0xff000000) >> 24) / 255f; + float g = ((color & 0x00ff0000) >> 16) / 255f; + float b = ((color & 0x0000ff00) >> 8) / 255f; + float a = ((color & 0x000000ff)) / 255f; + int color2 = ReadInt(input); // 0x00rrggbb + float r2 = ((color2 & 0x00ff0000) >> 16) / 255f; + float g2 = ((color2 & 0x0000ff00) >> 8) / 255f; + float b2 = ((color2 & 0x000000ff)) / 255f; + + timeline.SetFrame(frameIndex, time, r, g, b, a, r2, g2, b2); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * TwoColorTimeline.ENTRIES]); + break; + } + } + } + } + + // Bone timelines. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + int boneIndex = ReadVarint(input, true); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) { + int timelineType = input.ReadByte(); + int frameCount = ReadVarint(input, true); + switch (timelineType) { + case BONE_ROTATE: { + RotateTimeline timeline = new RotateTimeline(frameCount); + timeline.boneIndex = boneIndex; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input)); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * RotateTimeline.ENTRIES]); + break; + } + case BONE_TRANSLATE: + case BONE_SCALE: + case BONE_SHEAR: { + TranslateTimeline timeline; + float timelineScale = 1; + if (timelineType == BONE_SCALE) + timeline = new ScaleTimeline(frameCount); + else if (timelineType == BONE_SHEAR) + timeline = new ShearTimeline(frameCount); + else { + timeline = new TranslateTimeline(frameCount); + timelineScale = scale; + } + timeline.boneIndex = boneIndex; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input) * timelineScale, ReadFloat(input) + * timelineScale); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * TranslateTimeline.ENTRIES]); + break; + } + } + } + } + + // IK timelines. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + int index = ReadVarint(input, true); + int frameCount = ReadVarint(input, true); + IkConstraintTimeline timeline = new IkConstraintTimeline(frameCount); + timeline.ikConstraintIndex = index; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input), ReadSByte(input)); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * IkConstraintTimeline.ENTRIES]); + } + + // Transform constraint timelines. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + int index = ReadVarint(input, true); + int frameCount = ReadVarint(input, true); + TransformConstraintTimeline timeline = new TransformConstraintTimeline(frameCount); + timeline.transformConstraintIndex = index; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input), ReadFloat(input), ReadFloat(input), ReadFloat(input)); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * TransformConstraintTimeline.ENTRIES]); + } + + // Path constraint timelines. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + int index = ReadVarint(input, true); + PathConstraintData data = skeletonData.pathConstraints.Items[index]; + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) { + int timelineType = ReadSByte(input); + int frameCount = ReadVarint(input, true); + switch(timelineType) { + case PATH_POSITION: + case PATH_SPACING: { + PathConstraintPositionTimeline timeline; + float timelineScale = 1; + if (timelineType == PATH_SPACING) { + timeline = new PathConstraintSpacingTimeline(frameCount); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) timelineScale = scale; + } else { + timeline = new PathConstraintPositionTimeline(frameCount); + if (data.positionMode == PositionMode.Fixed) timelineScale = scale; + } + timeline.pathConstraintIndex = index; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input) * timelineScale); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * PathConstraintPositionTimeline.ENTRIES]); + break; + } + case PATH_MIX: { + PathConstraintMixTimeline timeline = new PathConstraintMixTimeline(frameCount); + timeline.pathConstraintIndex = index; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input), ReadFloat(input)); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * PathConstraintMixTimeline.ENTRIES]); + break; + } + } + } + } + + // Deform timelines. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + Skin skin = skeletonData.skins.Items[ReadVarint(input, true)]; + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) { + int slotIndex = ReadVarint(input, true); + for (int iii = 0, nnn = ReadVarint(input, true); iii < nnn; iii++) { + VertexAttachment attachment = (VertexAttachment)skin.GetAttachment(slotIndex, ReadString(input)); + bool weighted = attachment.bones != null; + float[] vertices = attachment.vertices; + int deformLength = weighted ? vertices.Length / 3 * 2 : vertices.Length; + + int frameCount = ReadVarint(input, true); + DeformTimeline timeline = new DeformTimeline(frameCount); + timeline.slotIndex = slotIndex; + timeline.attachment = attachment; + + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + float time = ReadFloat(input); + float[] deform; + int end = ReadVarint(input, true); + if (end == 0) + deform = weighted ? new float[deformLength] : vertices; + else { + deform = new float[deformLength]; + int start = ReadVarint(input, true); + end += start; + if (scale == 1) { + for (int v = start; v < end; v++) + deform[v] = ReadFloat(input); + } else { + for (int v = start; v < end; v++) + deform[v] = ReadFloat(input) * scale; + } + if (!weighted) { + for (int v = 0, vn = deform.Length; v < vn; v++) + deform[v] += vertices[v]; + } + } + + timeline.SetFrame(frameIndex, time, deform); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[frameCount - 1]); + } + } + } + + // Draw order timeline. + int drawOrderCount = ReadVarint(input, true); + if (drawOrderCount > 0) { + DrawOrderTimeline timeline = new DrawOrderTimeline(drawOrderCount); + int slotCount = skeletonData.slots.Count; + for (int i = 0; i < drawOrderCount; i++) { + float time = ReadFloat(input); + int offsetCount = ReadVarint(input, true); + int[] drawOrder = new int[slotCount]; + for (int ii = slotCount - 1; ii >= 0; ii--) + drawOrder[ii] = -1; + int[] unchanged = new int[slotCount - offsetCount]; + int originalIndex = 0, unchangedIndex = 0; + for (int ii = 0; ii < offsetCount; ii++) { + int slotIndex = ReadVarint(input, true); + // Collect unchanged items. + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + // Set changed items. + drawOrder[originalIndex + ReadVarint(input, true)] = originalIndex++; + } + // Collect remaining unchanged items. + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + // Fill in unchanged items. + for (int ii = slotCount - 1; ii >= 0; ii--) + if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex]; + timeline.SetFrame(i, time, drawOrder); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[drawOrderCount - 1]); + } + + // Event timeline. + int eventCount = ReadVarint(input, true); + if (eventCount > 0) { + EventTimeline timeline = new EventTimeline(eventCount); + for (int i = 0; i < eventCount; i++) { + float time = ReadFloat(input); + EventData eventData = skeletonData.events.Items[ReadVarint(input, true)]; + Event e = new Event(time, eventData); + e.Int = ReadVarint(input, false); + e.Float = ReadFloat(input); + e.String = ReadBoolean(input) ? ReadString(input) : eventData.String; + timeline.SetFrame(i, e); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[eventCount - 1]); + } + + timelines.TrimExcess(); + skeletonData.animations.Add(new Animation(name, timelines, duration)); + } + + private void ReadCurve (Stream input, int frameIndex, CurveTimeline timeline) { + switch (input.ReadByte()) { + case CURVE_STEPPED: + timeline.SetStepped(frameIndex); + break; + case CURVE_BEZIER: + timeline.SetCurve(frameIndex, ReadFloat(input), ReadFloat(input), ReadFloat(input), ReadFloat(input)); + break; + } + } + + private static sbyte ReadSByte (Stream input) { + int value = input.ReadByte(); + if (value == -1) throw new EndOfStreamException(); + return (sbyte)value; + } + + private static bool ReadBoolean (Stream input) { + return input.ReadByte() != 0; + } + + private float ReadFloat (Stream input) { + buffer[3] = (byte)input.ReadByte(); + buffer[2] = (byte)input.ReadByte(); + buffer[1] = (byte)input.ReadByte(); + buffer[0] = (byte)input.ReadByte(); + return BitConverter.ToSingle(buffer, 0); + } + + private static int ReadInt (Stream input) { + return (input.ReadByte() << 24) + (input.ReadByte() << 16) + (input.ReadByte() << 8) + input.ReadByte(); + } + + private static int ReadVarint (Stream input, bool optimizePositive) { + int b = input.ReadByte(); + int result = b & 0x7F; + if ((b & 0x80) != 0) { + b = input.ReadByte(); + result |= (b & 0x7F) << 7; + if ((b & 0x80) != 0) { + b = input.ReadByte(); + result |= (b & 0x7F) << 14; + if ((b & 0x80) != 0) { + b = input.ReadByte(); + result |= (b & 0x7F) << 21; + if ((b & 0x80) != 0) result |= (input.ReadByte() & 0x7F) << 28; + } + } + } + return optimizePositive ? result : ((result >> 1) ^ -(result & 1)); + } + + private string ReadString (Stream input) { + int byteCount = ReadVarint(input, true); + switch (byteCount) { + case 0: + return null; + case 1: + return ""; + } + byteCount--; + byte[] buffer = this.buffer; + if (buffer.Length < byteCount) buffer = new byte[byteCount]; + ReadFully(input, buffer, 0, byteCount); + return System.Text.Encoding.UTF8.GetString(buffer, 0, byteCount); + } + + private static void ReadFully (Stream input, byte[] buffer, int offset, int length) { + while (length > 0) { + int count = input.Read(buffer, offset, length); + if (count <= 0) throw new EndOfStreamException(); + offset += count; + length -= count; + } + } + + internal class Vertices { + public int[] bones; + public float[] vertices; + } + } +} diff --git a/Assets/Spine/SpineCSharp/SkeletonBounds.cs b/Assets/Spine/SpineCSharp/SkeletonBounds.cs new file mode 100644 index 0000000..e0096c2 --- /dev/null +++ b/Assets/Spine/SpineCSharp/SkeletonBounds.cs @@ -0,0 +1,234 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + + /// + /// Collects each BoundingBoxAttachment that is visible and computes the world vertices for its polygon. + /// The polygon vertices are provided along with convenience methods for doing hit detection. + /// + public class SkeletonBounds { + private ExposedList polygonPool = new ExposedList(); + private float minX, minY, maxX, maxY; + + public ExposedList BoundingBoxes { get; private set; } + public ExposedList Polygons { get; private set; } + public float MinX { get { return minX; } set { minX = value; } } + public float MinY { get { return minY; } set { minY = value; } } + public float MaxX { get { return maxX; } set { maxX = value; } } + public float MaxY { get { return maxY; } set { maxY = value; } } + public float Width { get { return maxX - minX; } } + public float Height { get { return maxY - minY; } } + + public SkeletonBounds () { + BoundingBoxes = new ExposedList(); + Polygons = new ExposedList(); + } + + /// + /// Clears any previous polygons, finds all visible bounding box attachments, + /// and computes the world vertices for each bounding box's polygon. + /// The skeleton. + /// + /// If true, the axis aligned bounding box containing all the polygons is computed. + /// If false, the SkeletonBounds AABB methods will always return true. + /// + public void Update (Skeleton skeleton, bool updateAabb) { + ExposedList boundingBoxes = BoundingBoxes; + ExposedList polygons = Polygons; + ExposedList slots = skeleton.slots; + int slotCount = slots.Count; + + boundingBoxes.Clear(); + for (int i = 0, n = polygons.Count; i < n; i++) + polygonPool.Add(polygons.Items[i]); + polygons.Clear(); + + for (int i = 0; i < slotCount; i++) { + Slot slot = slots.Items[i]; + BoundingBoxAttachment boundingBox = slot.attachment as BoundingBoxAttachment; + if (boundingBox == null) continue; + boundingBoxes.Add(boundingBox); + + Polygon polygon = null; + int poolCount = polygonPool.Count; + if (poolCount > 0) { + polygon = polygonPool.Items[poolCount - 1]; + polygonPool.RemoveAt(poolCount - 1); + } else + polygon = new Polygon(); + polygons.Add(polygon); + + int count = boundingBox.worldVerticesLength; + polygon.Count = count; + if (polygon.Vertices.Length < count) polygon.Vertices = new float[count]; + boundingBox.ComputeWorldVertices(slot, polygon.Vertices); + } + + if (updateAabb) { + AabbCompute(); + } else { + minX = int.MinValue; + minY = int.MinValue; + maxX = int.MaxValue; + maxY = int.MaxValue; + } + } + + private void AabbCompute () { + float minX = int.MaxValue, minY = int.MaxValue, maxX = int.MinValue, maxY = int.MinValue; + ExposedList polygons = Polygons; + for (int i = 0, n = polygons.Count; i < n; i++) { + Polygon polygon = polygons.Items[i]; + float[] vertices = polygon.Vertices; + for (int ii = 0, nn = polygon.Count; ii < nn; ii += 2) { + float x = vertices[ii]; + float y = vertices[ii + 1]; + minX = Math.Min(minX, x); + minY = Math.Min(minY, y); + maxX = Math.Max(maxX, x); + maxY = Math.Max(maxY, y); + } + } + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + } + + + /// Returns true if the axis aligned bounding box contains the point. + public bool AabbContainsPoint (float x, float y) { + return x >= minX && x <= maxX && y >= minY && y <= maxY; + } + + /// Returns true if the axis aligned bounding box intersects the line segment. + public bool AabbIntersectsSegment (float x1, float y1, float x2, float y2) { + float minX = this.minX; + float minY = this.minY; + float maxX = this.maxX; + float maxY = this.maxY; + if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY)) + return false; + float m = (y2 - y1) / (x2 - x1); + float y = m * (minX - x1) + y1; + if (y > minY && y < maxY) return true; + y = m * (maxX - x1) + y1; + if (y > minY && y < maxY) return true; + float x = (minY - y1) / m + x1; + if (x > minX && x < maxX) return true; + x = (maxY - y1) / m + x1; + if (x > minX && x < maxX) return true; + return false; + } + + /// Returns true if the axis aligned bounding box intersects the axis aligned bounding box of the specified bounds. + public bool AabbIntersectsSkeleton (SkeletonBounds bounds) { + return minX < bounds.maxX && maxX > bounds.minX && minY < bounds.maxY && maxY > bounds.minY; + } + + /// Returns true if the polygon contains the point. + public bool ContainsPoint (Polygon polygon, float x, float y) { + float[] vertices = polygon.Vertices; + int nn = polygon.Count; + + int prevIndex = nn - 2; + bool inside = false; + for (int ii = 0; ii < nn; ii += 2) { + float vertexY = vertices[ii + 1]; + float prevY = vertices[prevIndex + 1]; + if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) { + float vertexX = vertices[ii]; + if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) inside = !inside; + } + prevIndex = ii; + } + return inside; + } + + /// Returns the first bounding box attachment that contains the point, or null. When doing many checks, it is usually more + /// efficient to only call this method if {@link #aabbContainsPoint(float, float)} returns true. + public BoundingBoxAttachment ContainsPoint (float x, float y) { + ExposedList polygons = Polygons; + for (int i = 0, n = polygons.Count; i < n; i++) + if (ContainsPoint(polygons.Items[i], x, y)) return BoundingBoxes.Items[i]; + return null; + } + + /// Returns the first bounding box attachment that contains the line segment, or null. When doing many checks, it is usually + /// more efficient to only call this method if {@link #aabbIntersectsSegment(float, float, float, float)} returns true. + public BoundingBoxAttachment IntersectsSegment (float x1, float y1, float x2, float y2) { + ExposedList polygons = Polygons; + for (int i = 0, n = polygons.Count; i < n; i++) + if (IntersectsSegment(polygons.Items[i], x1, y1, x2, y2)) return BoundingBoxes.Items[i]; + return null; + } + + /// Returns true if the polygon contains the line segment. + public bool IntersectsSegment (Polygon polygon, float x1, float y1, float x2, float y2) { + float[] vertices = polygon.Vertices; + int nn = polygon.Count; + + float width12 = x1 - x2, height12 = y1 - y2; + float det1 = x1 * y2 - y1 * x2; + float x3 = vertices[nn - 2], y3 = vertices[nn - 1]; + for (int ii = 0; ii < nn; ii += 2) { + float x4 = vertices[ii], y4 = vertices[ii + 1]; + float det2 = x3 * y4 - y3 * x4; + float width34 = x3 - x4, height34 = y3 - y4; + float det3 = width12 * height34 - height12 * width34; + float x = (det1 * width34 - width12 * det2) / det3; + if (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) { + float y = (det1 * height34 - height12 * det2) / det3; + if (((y >= y3 && y <= y4) || (y >= y4 && y <= y3)) && ((y >= y1 && y <= y2) || (y >= y2 && y <= y1))) return true; + } + x3 = x4; + y3 = y4; + } + return false; + } + + public Polygon GetPolygon (BoundingBoxAttachment attachment) { + int index = BoundingBoxes.IndexOf(attachment); + return index == -1 ? null : Polygons.Items[index]; + } + } + + public class Polygon { + public float[] Vertices { get; set; } + public int Count { get; set; } + + public Polygon () { + Vertices = new float[16]; + } + } +} diff --git a/Assets/Spine/SpineCSharp/SkeletonClipping.cs b/Assets/Spine/SpineCSharp/SkeletonClipping.cs new file mode 100644 index 0000000..a11c0c8 --- /dev/null +++ b/Assets/Spine/SpineCSharp/SkeletonClipping.cs @@ -0,0 +1,285 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class SkeletonClipping { + internal readonly Triangulator triangulator = new Triangulator(); + internal readonly ExposedList clippingPolygon = new ExposedList(); + internal readonly ExposedList clipOutput = new ExposedList(128); + internal readonly ExposedList clippedVertices = new ExposedList(128); + internal readonly ExposedList clippedTriangles = new ExposedList(128); + internal readonly ExposedList clippedUVs = new ExposedList(128); + internal readonly ExposedList scratch = new ExposedList(); + + internal ClippingAttachment clipAttachment; + internal ExposedList> clippingPolygons; + + public ExposedList ClippedVertices { get { return clippedVertices; } } + public ExposedList ClippedTriangles { get { return clippedTriangles; } } + public ExposedList ClippedUVs { get { return clippedUVs; } } + + public bool IsClipping { get { return clipAttachment != null; } } + + public int ClipStart (Slot slot, ClippingAttachment clip) { + if (clipAttachment != null) return 0; + clipAttachment = clip; + + int n = clip.worldVerticesLength; + float[] vertices = clippingPolygon.Resize(n).Items; + clip.ComputeWorldVertices(slot, 0, n, vertices, 0, 2); + MakeClockwise(clippingPolygon); + clippingPolygons = triangulator.Decompose(clippingPolygon, triangulator.Triangulate(clippingPolygon)); + foreach (var polygon in clippingPolygons) { + MakeClockwise(polygon); + polygon.Add(polygon.Items[0]); + polygon.Add(polygon.Items[1]); + } + return clippingPolygons.Count; + } + + public void ClipEnd (Slot slot) { + if (clipAttachment != null && clipAttachment.endSlot == slot.data) ClipEnd(); + } + + public void ClipEnd () { + if (clipAttachment == null) return; + clipAttachment = null; + clippingPolygons = null; + clippedVertices.Clear(); + clippedTriangles.Clear(); + clippingPolygon.Clear(); + } + + public void ClipTriangles (float[] vertices, int verticesLength, int[] triangles, int trianglesLength, float[] uvs) { + ExposedList clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; + var clippedTriangles = this.clippedTriangles; + var polygons = clippingPolygons.Items; + int polygonsCount = clippingPolygons.Count; + + int index = 0; + clippedVertices.Clear(); + clippedUVs.Clear(); + clippedTriangles.Clear(); + //outer: + for (int i = 0; i < trianglesLength; i += 3) { + int vertexOffset = triangles[i] << 1; + float x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; + float u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1]; + + vertexOffset = triangles[i + 1] << 1; + float x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1]; + float u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1]; + + vertexOffset = triangles[i + 2] << 1; + float x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1]; + float u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1]; + + for (int p = 0; p < polygonsCount; p++) { + int s = clippedVertices.Count; + if (Clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) { + int clipOutputLength = clipOutput.Count; + if (clipOutputLength == 0) continue; + float d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1; + float d = 1 / (d0 * d2 + d1 * (y1 - y3)); + + int clipOutputCount = clipOutputLength >> 1; + float[] clipOutputItems = clipOutput.Items; + float[] clippedVerticesItems = clippedVertices.Resize(s + clipOutputCount * 2).Items; + float[] clippedUVsItems = clippedUVs.Resize(s + clipOutputCount * 2).Items; + for (int ii = 0; ii < clipOutputLength; ii += 2) { + float x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; + clippedVerticesItems[s] = x; + clippedVerticesItems[s + 1] = y; + float c0 = x - x3, c1 = y - y3; + float a = (d0 * c0 + d1 * c1) * d; + float b = (d4 * c0 + d2 * c1) * d; + float c = 1 - a - b; + clippedUVsItems[s] = u1 * a + u2 * b + u3 * c; + clippedUVsItems[s + 1] = v1 * a + v2 * b + v3 * c; + s += 2; + } + + s = clippedTriangles.Count; + int[] clippedTrianglesItems = clippedTriangles.Resize(s + 3 * (clipOutputCount - 2)).Items; + clipOutputCount--; + for (int ii = 1; ii < clipOutputCount; ii++) { + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = index + ii; + clippedTrianglesItems[s + 2] = index + ii + 1; + s += 3; + } + index += clipOutputCount + 1; + } + else { + float[] clippedVerticesItems = clippedVertices.Resize(s + 3 * 2).Items; + float[] clippedUVsItems = clippedUVs.Resize(s + 3 * 2).Items; + clippedVerticesItems[s] = x1; + clippedVerticesItems[s + 1] = y1; + clippedVerticesItems[s + 2] = x2; + clippedVerticesItems[s + 3] = y2; + clippedVerticesItems[s + 4] = x3; + clippedVerticesItems[s + 5] = y3; + + clippedUVsItems[s] = u1; + clippedUVsItems[s + 1] = v1; + clippedUVsItems[s + 2] = u2; + clippedUVsItems[s + 3] = v2; + clippedUVsItems[s + 4] = u3; + clippedUVsItems[s + 5] = v3; + + s = clippedTriangles.Count; + int[] clippedTrianglesItems = clippedTriangles.Resize(s + 3).Items; + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = index + 1; + clippedTrianglesItems[s + 2] = index + 2; + index += 3; + break; //continue outer; + } + } + } + + } + + /** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping + * area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */ + internal bool Clip (float x1, float y1, float x2, float y2, float x3, float y3, ExposedList clippingArea, ExposedList output) { + var originalOutput = output; + var clipped = false; + + // Avoid copy at the end. + ExposedList input = null; + if (clippingArea.Count % 4 >= 2) { + input = output; + output = scratch; + } else { + input = scratch; + } + + input.Clear(); + input.Add(x1); + input.Add(y1); + input.Add(x2); + input.Add(y2); + input.Add(x3); + input.Add(y3); + input.Add(x1); + input.Add(y1); + output.Clear(); + + float[] clippingVertices = clippingArea.Items; + int clippingVerticesLast = clippingArea.Count - 4; + for (int i = 0; ; i += 2) { + float edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1]; + float edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3]; + float deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2; + + float[] inputVertices = input.Items; + int inputVerticesLength = input.Count - 2, outputStart = output.Count; + for (int ii = 0; ii < inputVerticesLength; ii += 2) { + float inputX = inputVertices[ii], inputY = inputVertices[ii + 1]; + float inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3]; + bool side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; + if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { + if (side2) { // v1 inside, v2 inside + output.Add(inputX2); + output.Add(inputY2); + continue; + } + // v1 inside, v2 outside + float c0 = inputY2 - inputY, c2 = inputX2 - inputX; + float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); + output.Add(edgeX + (edgeX2 - edgeX) * ua); + output.Add(edgeY + (edgeY2 - edgeY) * ua); + } + else if (side2) { // v1 outside, v2 inside + float c0 = inputY2 - inputY, c2 = inputX2 - inputX; + float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); + output.Add(edgeX + (edgeX2 - edgeX) * ua); + output.Add(edgeY + (edgeY2 - edgeY) * ua); + output.Add(inputX2); + output.Add(inputY2); + } + clipped = true; + } + + if (outputStart == output.Count) { // All edges outside. + originalOutput.Clear(); + return true; + } + + output.Add(output.Items[0]); + output.Add(output.Items[1]); + + if (i == clippingVerticesLast) break; + var temp = output; + output = input; + output.Clear(); + input = temp; + } + + if (originalOutput != output) { + originalOutput.Clear(); + for (int i = 0, n = output.Count - 2; i < n; i++) { + originalOutput.Add(output.Items[i]); + } + } else { + originalOutput.Resize(originalOutput.Count - 2); + } + + return clipped; + } + + static void MakeClockwise (ExposedList polygon) { + float[] vertices = polygon.Items; + int verticeslength = polygon.Count; + + float area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x, p1y, p2x, p2y; + for (int i = 0, n = verticeslength - 3; i < n; i += 2) { + p1x = vertices[i]; + p1y = vertices[i + 1]; + p2x = vertices[i + 2]; + p2y = vertices[i + 3]; + area += p1x * p2y - p2x * p1y; + } + if (area < 0) return; + + for (int i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) { + float x = vertices[i], y = vertices[i + 1]; + int other = lastX - i; + vertices[i] = vertices[other]; + vertices[i + 1] = vertices[other + 1]; + vertices[other] = x; + vertices[other + 1] = y; + } + } + } +} diff --git a/Assets/Spine/SpineCSharp/SkeletonData.cs b/Assets/Spine/SpineCSharp/SkeletonData.cs new file mode 100644 index 0000000..b2e8310 --- /dev/null +++ b/Assets/Spine/SpineCSharp/SkeletonData.cs @@ -0,0 +1,224 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + + /// Stores the setup pose and all of the stateless data for a skeleton. + public class SkeletonData { + internal string name; + internal ExposedList bones = new ExposedList(); // Ordered parents first + internal ExposedList slots = new ExposedList(); // Setup pose draw order. + internal ExposedList skins = new ExposedList(); + internal Skin defaultSkin; + internal ExposedList events = new ExposedList(); + internal ExposedList animations = new ExposedList(); + internal ExposedList ikConstraints = new ExposedList(); + internal ExposedList transformConstraints = new ExposedList(); + internal ExposedList pathConstraints = new ExposedList(); + internal float width, height; + internal string version, hash; + + // Nonessential. + internal float fps; + internal string imagesPath; + + public string Name { get { return name; } set { name = value; } } + + /// The skeleton's bones, sorted parent first. The root bone is always the first bone. + public ExposedList Bones { get { return bones; } } + + public ExposedList Slots { get { return slots; } } + + /// All skins, including the default skin. + public ExposedList Skins { get { return skins; } set { skins = value; } } + + /// + /// The skeleton's default skin. + /// By default this skin contains all attachments that were not in a skin in Spine. + /// + /// May be null. + public Skin DefaultSkin { get { return defaultSkin; } set { defaultSkin = value; } } + + public ExposedList Events { get { return events; } set { events = value; } } + public ExposedList Animations { get { return animations; } set { animations = value; } } + public ExposedList IkConstraints { get { return ikConstraints; } set { ikConstraints = value; } } + public ExposedList TransformConstraints { get { return transformConstraints; } set { transformConstraints = value; } } + public ExposedList PathConstraints { get { return pathConstraints; } set { pathConstraints = value; } } + + public float Width { get { return width; } set { width = value; } } + public float Height { get { return height; } set { height = value; } } + /// The Spine version used to export this data, or null. + public string Version { get { return version; } set { version = value; } } + public string Hash { get { return hash; } set { hash = value; } } + public string ImagesPath { get { return imagesPath; } set { imagesPath = value; } } + + /// + /// The dopesheet FPS in Spine. Available only when nonessential data was exported. + public float Fps { get { return fps; } set { fps = value; } } + + // --- Bones. + + /// + /// Finds a bone by comparing each bone's name. + /// It is more efficient to cache the results of this method than to call it multiple times. + /// May be null. + public BoneData FindBone (string boneName) { + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); + var bones = this.bones; + var bonesItems = bones.Items; + for (int i = 0, n = bones.Count; i < n; i++) { + BoneData bone = bonesItems[i]; + if (bone.name == boneName) return bone; + } + return null; + } + + /// -1 if the bone was not found. + public int FindBoneIndex (string boneName) { + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); + var bones = this.bones; + var bonesItems = bones.Items; + for (int i = 0, n = bones.Count; i < n; i++) + if (bonesItems[i].name == boneName) return i; + return -1; + } + + // --- Slots. + + /// May be null. + public SlotData FindSlot (string slotName) { + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); + ExposedList slots = this.slots; + for (int i = 0, n = slots.Count; i < n; i++) { + SlotData slot = slots.Items[i]; + if (slot.name == slotName) return slot; + } + return null; + } + + /// -1 if the slot was not found. + public int FindSlotIndex (string slotName) { + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); + ExposedList slots = this.slots; + for (int i = 0, n = slots.Count; i < n; i++) + if (slots.Items[i].name == slotName) return i; + return -1; + } + + // --- Skins. + + /// May be null. + public Skin FindSkin (string skinName) { + if (skinName == null) throw new ArgumentNullException("skinName", "skinName cannot be null."); + foreach (Skin skin in skins) + if (skin.name == skinName) return skin; + return null; + } + + // --- Events. + + /// May be null. + public EventData FindEvent (string eventDataName) { + if (eventDataName == null) throw new ArgumentNullException("eventDataName", "eventDataName cannot be null."); + foreach (EventData eventData in events) + if (eventData.name == eventDataName) return eventData; + return null; + } + + // --- Animations. + + /// May be null. + public Animation FindAnimation (string animationName) { + if (animationName == null) throw new ArgumentNullException("animationName", "animationName cannot be null."); + ExposedList animations = this.animations; + for (int i = 0, n = animations.Count; i < n; i++) { + Animation animation = animations.Items[i]; + if (animation.name == animationName) return animation; + } + return null; + } + + // --- IK constraints. + + /// May be null. + public IkConstraintData FindIkConstraint (string constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList ikConstraints = this.ikConstraints; + for (int i = 0, n = ikConstraints.Count; i < n; i++) { + IkConstraintData ikConstraint = ikConstraints.Items[i]; + if (ikConstraint.name == constraintName) return ikConstraint; + } + return null; + } + + // --- Transform constraints. + + /// May be null. + public TransformConstraintData FindTransformConstraint (string constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList transformConstraints = this.transformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + TransformConstraintData transformConstraint = transformConstraints.Items[i]; + if (transformConstraint.name == constraintName) return transformConstraint; + } + return null; + } + + // --- Path constraints. + + /// May be null. + public PathConstraintData FindPathConstraint (string constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + PathConstraintData constraint = pathConstraints.Items[i]; + if (constraint.name.Equals(constraintName)) return constraint; + } + return null; + } + + /// -1 if the path constraint was not found. + public int FindPathConstraintIndex (string pathConstraintName) { + if (pathConstraintName == null) throw new ArgumentNullException("pathConstraintName", "pathConstraintName cannot be null."); + ExposedList pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) + if (pathConstraints.Items[i].name.Equals(pathConstraintName)) return i; + return -1; + } + + // --- + + override public string ToString () { + return name ?? base.ToString(); + } + } +} diff --git a/Assets/Spine/SpineCSharp/SkeletonJson.cs b/Assets/Spine/SpineCSharp/SkeletonJson.cs new file mode 100644 index 0000000..5f3fee5 --- /dev/null +++ b/Assets/Spine/SpineCSharp/SkeletonJson.cs @@ -0,0 +1,865 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#if (UNITY_5 || UNITY_5_3_OR_NEWER || UNITY_WSA || UNITY_WP8 || UNITY_WP8_1) +#define IS_UNITY +#endif + +using System; +using System.IO; +using System.Collections.Generic; + +#if WINDOWS_STOREAPP +using System.Threading.Tasks; +using Windows.Storage; +#endif + +namespace Spine { + public class SkeletonJson { + public float Scale { get; set; } + + private AttachmentLoader attachmentLoader; + private List linkedMeshes = new List(); + + public SkeletonJson (params Atlas[] atlasArray) + : this(new AtlasAttachmentLoader(atlasArray)) { + } + + public SkeletonJson (AttachmentLoader attachmentLoader) { + if (attachmentLoader == null) throw new ArgumentNullException("attachmentLoader", "attachmentLoader cannot be null."); + this.attachmentLoader = attachmentLoader; + Scale = 1; + } + + #if !IS_UNITY && WINDOWS_STOREAPP + private async Task ReadFile(string path) { + var folder = Windows.ApplicationModel.Package.Current.InstalledLocation; + var file = await folder.GetFileAsync(path).AsTask().ConfigureAwait(false); + using (var reader = new StreamReader(await file.OpenStreamForReadAsync().ConfigureAwait(false))) { + SkeletonData skeletonData = ReadSkeletonData(reader); + skeletonData.Name = Path.GetFileNameWithoutExtension(path); + return skeletonData; + } + } + + public SkeletonData ReadSkeletonData (string path) { + return this.ReadFile(path).Result; + } + #else + public SkeletonData ReadSkeletonData (string path) { + #if WINDOWS_PHONE + using (var reader = new StreamReader(Microsoft.Xna.Framework.TitleContainer.OpenStream(path))) { + #else + using (var reader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))) { + #endif + SkeletonData skeletonData = ReadSkeletonData(reader); + skeletonData.name = Path.GetFileNameWithoutExtension(path); + return skeletonData; + } + } + #endif + + public SkeletonData ReadSkeletonData (TextReader reader) { + if (reader == null) throw new ArgumentNullException("reader", "reader cannot be null."); + + float scale = this.Scale; + var skeletonData = new SkeletonData(); + + var root = Json.Deserialize(reader) as Dictionary; + if (root == null) throw new Exception("Invalid JSON."); + + // Skeleton. + if (root.ContainsKey("skeleton")) { + var skeletonMap = (Dictionary)root["skeleton"]; + skeletonData.hash = (string)skeletonMap["hash"]; + skeletonData.version = (string)skeletonMap["spine"]; + skeletonData.width = GetFloat(skeletonMap, "width", 0); + skeletonData.height = GetFloat(skeletonMap, "height", 0); + skeletonData.fps = GetFloat(skeletonMap, "fps", 0); + skeletonData.imagesPath = GetString(skeletonMap, "images", null); + } + + // Bones. + foreach (Dictionary boneMap in (List)root["bones"]) { + BoneData parent = null; + if (boneMap.ContainsKey("parent")) { + parent = skeletonData.FindBone((string)boneMap["parent"]); + if (parent == null) + throw new Exception("Parent bone not found: " + boneMap["parent"]); + } + var data = new BoneData(skeletonData.Bones.Count, (string)boneMap["name"], parent); + data.length = GetFloat(boneMap, "length", 0) * scale; + data.x = GetFloat(boneMap, "x", 0) * scale; + data.y = GetFloat(boneMap, "y", 0) * scale; + data.rotation = GetFloat(boneMap, "rotation", 0); + data.scaleX = GetFloat(boneMap, "scaleX", 1); + data.scaleY = GetFloat(boneMap, "scaleY", 1); + data.shearX = GetFloat(boneMap, "shearX", 0); + data.shearY = GetFloat(boneMap, "shearY", 0); + + string tm = GetString(boneMap, "transform", TransformMode.Normal.ToString()); + data.transformMode = (TransformMode)Enum.Parse(typeof(TransformMode), tm, true); + + skeletonData.bones.Add(data); + } + + // Slots. + if (root.ContainsKey("slots")) { + foreach (Dictionary slotMap in (List)root["slots"]) { + var slotName = (string)slotMap["name"]; + var boneName = (string)slotMap["bone"]; + BoneData boneData = skeletonData.FindBone(boneName); + if (boneData == null) throw new Exception("Slot bone not found: " + boneName); + var data = new SlotData(skeletonData.Slots.Count, slotName, boneData); + + if (slotMap.ContainsKey("color")) { + string color = (string)slotMap["color"]; + data.r = ToColor(color, 0); + data.g = ToColor(color, 1); + data.b = ToColor(color, 2); + data.a = ToColor(color, 3); + } + + if (slotMap.ContainsKey("dark")) { + var color2 = (string)slotMap["dark"]; + data.r2 = ToColor(color2, 0, 6); // expectedLength = 6. ie. "RRGGBB" + data.g2 = ToColor(color2, 1, 6); + data.b2 = ToColor(color2, 2, 6); + data.hasSecondColor = true; + } + + data.attachmentName = GetString(slotMap, "attachment", null); + if (slotMap.ContainsKey("blend")) + data.blendMode = (BlendMode)Enum.Parse(typeof(BlendMode), (string)slotMap["blend"], true); + else + data.blendMode = BlendMode.Normal; + skeletonData.slots.Add(data); + } + } + + // IK constraints. + if (root.ContainsKey("ik")) { + foreach (Dictionary constraintMap in (List)root["ik"]) { + IkConstraintData data = new IkConstraintData((string)constraintMap["name"]); + data.order = GetInt(constraintMap, "order", 0); + + foreach (string boneName in (List)constraintMap["bones"]) { + BoneData bone = skeletonData.FindBone(boneName); + if (bone == null) throw new Exception("IK constraint bone not found: " + boneName); + data.bones.Add(bone); + } + + string targetName = (string)constraintMap["target"]; + data.target = skeletonData.FindBone(targetName); + if (data.target == null) throw new Exception("Target bone not found: " + targetName); + + data.bendDirection = GetBoolean(constraintMap, "bendPositive", true) ? 1 : -1; + data.mix = GetFloat(constraintMap, "mix", 1); + + skeletonData.ikConstraints.Add(data); + } + } + + // Transform constraints. + if (root.ContainsKey("transform")) { + foreach (Dictionary constraintMap in (List)root["transform"]) { + TransformConstraintData data = new TransformConstraintData((string)constraintMap["name"]); + data.order = GetInt(constraintMap, "order", 0); + + foreach (string boneName in (List)constraintMap["bones"]) { + BoneData bone = skeletonData.FindBone(boneName); + if (bone == null) throw new Exception("Transform constraint bone not found: " + boneName); + data.bones.Add(bone); + } + + string targetName = (string)constraintMap["target"]; + data.target = skeletonData.FindBone(targetName); + if (data.target == null) throw new Exception("Target bone not found: " + targetName); + + data.local = GetBoolean(constraintMap, "local", false); + data.relative = GetBoolean(constraintMap, "relative", false); + + data.offsetRotation = GetFloat(constraintMap, "rotation", 0); + data.offsetX = GetFloat(constraintMap, "x", 0) * scale; + data.offsetY = GetFloat(constraintMap, "y", 0) * scale; + data.offsetScaleX = GetFloat(constraintMap, "scaleX", 0); + data.offsetScaleY = GetFloat(constraintMap, "scaleY", 0); + data.offsetShearY = GetFloat(constraintMap, "shearY", 0); + + data.rotateMix = GetFloat(constraintMap, "rotateMix", 1); + data.translateMix = GetFloat(constraintMap, "translateMix", 1); + data.scaleMix = GetFloat(constraintMap, "scaleMix", 1); + data.shearMix = GetFloat(constraintMap, "shearMix", 1); + + skeletonData.transformConstraints.Add(data); + } + } + + // Path constraints. + if(root.ContainsKey("path")) { + foreach (Dictionary constraintMap in (List)root["path"]) { + PathConstraintData data = new PathConstraintData((string)constraintMap["name"]); + data.order = GetInt(constraintMap, "order", 0); + + foreach (string boneName in (List)constraintMap["bones"]) { + BoneData bone = skeletonData.FindBone(boneName); + if (bone == null) throw new Exception("Path bone not found: " + boneName); + data.bones.Add(bone); + } + + string targetName = (string)constraintMap["target"]; + data.target = skeletonData.FindSlot(targetName); + if (data.target == null) throw new Exception("Target slot not found: " + targetName); + + data.positionMode = (PositionMode)Enum.Parse(typeof(PositionMode), GetString(constraintMap, "positionMode", "percent"), true); + data.spacingMode = (SpacingMode)Enum.Parse(typeof(SpacingMode), GetString(constraintMap, "spacingMode", "length"), true); + data.rotateMode = (RotateMode)Enum.Parse(typeof(RotateMode), GetString(constraintMap, "rotateMode", "tangent"), true); + data.offsetRotation = GetFloat(constraintMap, "rotation", 0); + data.position = GetFloat(constraintMap, "position", 0); + if (data.positionMode == PositionMode.Fixed) data.position *= scale; + data.spacing = GetFloat(constraintMap, "spacing", 0); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale; + data.rotateMix = GetFloat(constraintMap, "rotateMix", 1); + data.translateMix = GetFloat(constraintMap, "translateMix", 1); + + skeletonData.pathConstraints.Add(data); + } + } + + // Skins. + if (root.ContainsKey("skins")) { + foreach (KeyValuePair skinMap in (Dictionary)root["skins"]) { + var skin = new Skin(skinMap.Key); + foreach (KeyValuePair slotEntry in (Dictionary)skinMap.Value) { + int slotIndex = skeletonData.FindSlotIndex(slotEntry.Key); + foreach (KeyValuePair entry in ((Dictionary)slotEntry.Value)) { + try { + Attachment attachment = ReadAttachment((Dictionary)entry.Value, skin, slotIndex, entry.Key, skeletonData); + if (attachment != null) skin.AddAttachment(slotIndex, entry.Key, attachment); + } catch (Exception e) { + throw new Exception("Error reading attachment: " + entry.Key + ", skin: " + skin, e); + } + } + } + skeletonData.skins.Add(skin); + if (skin.name == "default") skeletonData.defaultSkin = skin; + } + } + + // Linked meshes. + for (int i = 0, n = linkedMeshes.Count; i < n; i++) { + LinkedMesh linkedMesh = linkedMeshes[i]; + Skin skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.FindSkin(linkedMesh.skin); + if (skin == null) throw new Exception("Slot not found: " + linkedMesh.skin); + Attachment parent = skin.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent); + if (parent == null) throw new Exception("Parent mesh not found: " + linkedMesh.parent); + linkedMesh.mesh.ParentMesh = (MeshAttachment)parent; + linkedMesh.mesh.UpdateUVs(); + } + linkedMeshes.Clear(); + + // Events. + if (root.ContainsKey("events")) { + foreach (KeyValuePair entry in (Dictionary)root["events"]) { + var entryMap = (Dictionary)entry.Value; + var data = new EventData(entry.Key); + data.Int = GetInt(entryMap, "int", 0); + data.Float = GetFloat(entryMap, "float", 0); + data.String = GetString(entryMap, "string", string.Empty); + skeletonData.events.Add(data); + } + } + + // Animations. + if (root.ContainsKey("animations")) { + foreach (KeyValuePair entry in (Dictionary)root["animations"]) { + try { + ReadAnimation((Dictionary)entry.Value, entry.Key, skeletonData); + } catch (Exception e) { + throw new Exception("Error reading animation: " + entry.Key, e); + } + } + } + + skeletonData.bones.TrimExcess(); + skeletonData.slots.TrimExcess(); + skeletonData.skins.TrimExcess(); + skeletonData.events.TrimExcess(); + skeletonData.animations.TrimExcess(); + skeletonData.ikConstraints.TrimExcess(); + return skeletonData; + } + + private Attachment ReadAttachment (Dictionary map, Skin skin, int slotIndex, string name, SkeletonData skeletonData) { + float scale = this.Scale; + name = GetString(map, "name", name); + + var typeName = GetString(map, "type", "region"); + if (typeName == "skinnedmesh") typeName = "weightedmesh"; + if (typeName == "weightedmesh") typeName = "mesh"; + if (typeName == "weightedlinkedmesh") typeName = "linkedmesh"; + var type = (AttachmentType)Enum.Parse(typeof(AttachmentType), typeName, true); + + string path = GetString(map, "path", name); + + switch (type) { + case AttachmentType.Region: + RegionAttachment region = attachmentLoader.NewRegionAttachment(skin, name, path); + if (region == null) return null; + region.Path = path; + region.x = GetFloat(map, "x", 0) * scale; + region.y = GetFloat(map, "y", 0) * scale; + region.scaleX = GetFloat(map, "scaleX", 1); + region.scaleY = GetFloat(map, "scaleY", 1); + region.rotation = GetFloat(map, "rotation", 0); + region.width = GetFloat(map, "width", 32) * scale; + region.height = GetFloat(map, "height", 32) * scale; + + if (map.ContainsKey("color")) { + var color = (string)map["color"]; + region.r = ToColor(color, 0); + region.g = ToColor(color, 1); + region.b = ToColor(color, 2); + region.a = ToColor(color, 3); + } + + region.UpdateOffset(); + return region; + case AttachmentType.Boundingbox: + BoundingBoxAttachment box = attachmentLoader.NewBoundingBoxAttachment(skin, name); + if (box == null) return null; + ReadVertices(map, box, GetInt(map, "vertexCount", 0) << 1); + return box; + case AttachmentType.Mesh: + case AttachmentType.Linkedmesh: { + MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); + if (mesh == null) return null; + mesh.Path = path; + + if (map.ContainsKey("color")) { + var color = (string)map["color"]; + mesh.r = ToColor(color, 0); + mesh.g = ToColor(color, 1); + mesh.b = ToColor(color, 2); + mesh.a = ToColor(color, 3); + } + + mesh.Width = GetFloat(map, "width", 0) * scale; + mesh.Height = GetFloat(map, "height", 0) * scale; + + string parent = GetString(map, "parent", null); + if (parent != null) { + mesh.InheritDeform = GetBoolean(map, "deform", true); + linkedMeshes.Add(new LinkedMesh(mesh, GetString(map, "skin", null), slotIndex, parent)); + return mesh; + } + + float[] uvs = GetFloatArray(map, "uvs", 1); + ReadVertices(map, mesh, uvs.Length); + mesh.triangles = GetIntArray(map, "triangles"); + mesh.regionUVs = uvs; + mesh.UpdateUVs(); + + if (map.ContainsKey("hull")) mesh.HullLength = GetInt(map, "hull", 0) * 2; + if (map.ContainsKey("edges")) mesh.Edges = GetIntArray(map, "edges"); + return mesh; + } + case AttachmentType.Path: { + PathAttachment pathAttachment = attachmentLoader.NewPathAttachment(skin, name); + if (pathAttachment == null) return null; + pathAttachment.closed = GetBoolean(map, "closed", false); + pathAttachment.constantSpeed = GetBoolean(map, "constantSpeed", true); + + int vertexCount = GetInt(map, "vertexCount", 0); + ReadVertices(map, pathAttachment, vertexCount << 1); + + // potential BOZO see Java impl + pathAttachment.lengths = GetFloatArray(map, "lengths", scale); + return pathAttachment; + } + case AttachmentType.Point: { + PointAttachment point = attachmentLoader.NewPointAttachment(skin, name); + if (point == null) return null; + point.x = GetFloat(map, "x", 0) * scale; + point.y = GetFloat(map, "y", 0) * scale; + point.rotation = GetFloat(map, "rotation", 0); + + //string color = GetString(map, "color", null); + //if (color != null) point.color = color; + return point; + } + case AttachmentType.Clipping: { + ClippingAttachment clip = attachmentLoader.NewClippingAttachment(skin, name); + if (clip == null) return null; + + string end = GetString(map, "end", null); + if (end != null) { + SlotData slot = skeletonData.FindSlot(end); + if (slot == null) throw new Exception("Clipping end slot not found: " + end); + clip.EndSlot = slot; + } + + ReadVertices(map, clip, GetInt(map, "vertexCount", 0) << 1); + + //string color = GetString(map, "color", null); + // if (color != null) clip.color = color; + return clip; + } + } + return null; + } + + private void ReadVertices (Dictionary map, VertexAttachment attachment, int verticesLength) { + attachment.WorldVerticesLength = verticesLength; + float[] vertices = GetFloatArray(map, "vertices", 1); + float scale = Scale; + if (verticesLength == vertices.Length) { + if (scale != 1) { + for (int i = 0; i < vertices.Length; i++) { + vertices[i] *= scale; + } + } + attachment.vertices = vertices; + return; + } + ExposedList weights = new ExposedList(verticesLength * 3 * 3); + ExposedList bones = new ExposedList(verticesLength * 3); + for (int i = 0, n = vertices.Length; i < n;) { + int boneCount = (int)vertices[i++]; + bones.Add(boneCount); + for (int nn = i + boneCount * 4; i < nn; i += 4) { + bones.Add((int)vertices[i]); + weights.Add(vertices[i + 1] * this.Scale); + weights.Add(vertices[i + 2] * this.Scale); + weights.Add(vertices[i + 3]); + } + } + attachment.bones = bones.ToArray(); + attachment.vertices = weights.ToArray(); + } + + private void ReadAnimation (Dictionary map, string name, SkeletonData skeletonData) { + var scale = this.Scale; + var timelines = new ExposedList(); + float duration = 0; + + // Slot timelines. + if (map.ContainsKey("slots")) { + foreach (KeyValuePair entry in (Dictionary)map["slots"]) { + string slotName = entry.Key; + int slotIndex = skeletonData.FindSlotIndex(slotName); + var timelineMap = (Dictionary)entry.Value; + foreach (KeyValuePair timelineEntry in timelineMap) { + var values = (List)timelineEntry.Value; + var timelineName = (string)timelineEntry.Key; + if (timelineName == "attachment") { + var timeline = new AttachmentTimeline(values.Count); + timeline.slotIndex = slotIndex; + + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float time = (float)valueMap["time"]; + timeline.SetFrame(frameIndex++, time, (string)valueMap["name"]); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[timeline.FrameCount - 1]); + + } else if (timelineName == "color") { + var timeline = new ColorTimeline(values.Count); + timeline.slotIndex = slotIndex; + + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float time = (float)valueMap["time"]; + string c = (string)valueMap["color"]; + timeline.SetFrame(frameIndex, time, ToColor(c, 0), ToColor(c, 1), ToColor(c, 2), ToColor(c, 3)); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * ColorTimeline.ENTRIES]); + + } else if (timelineName == "twoColor") { + var timeline = new TwoColorTimeline(values.Count); + timeline.slotIndex = slotIndex; + + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float time = (float)valueMap["time"]; + string light = (string)valueMap["light"]; + string dark = (string)valueMap["dark"]; + timeline.SetFrame(frameIndex, time, ToColor(light, 0), ToColor(light, 1), ToColor(light, 2), ToColor(light, 3), + ToColor(dark, 0, 6), ToColor(dark, 1, 6), ToColor(dark, 2, 6)); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * TwoColorTimeline.ENTRIES]); + + } else + throw new Exception("Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")"); + } + } + } + + // Bone timelines. + if (map.ContainsKey("bones")) { + foreach (KeyValuePair entry in (Dictionary)map["bones"]) { + string boneName = entry.Key; + int boneIndex = skeletonData.FindBoneIndex(boneName); + if (boneIndex == -1) throw new Exception("Bone not found: " + boneName); + var timelineMap = (Dictionary)entry.Value; + foreach (KeyValuePair timelineEntry in timelineMap) { + var values = (List)timelineEntry.Value; + var timelineName = (string)timelineEntry.Key; + if (timelineName == "rotate") { + var timeline = new RotateTimeline(values.Count); + timeline.boneIndex = boneIndex; + + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + timeline.SetFrame(frameIndex, (float)valueMap["time"], (float)valueMap["angle"]); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * RotateTimeline.ENTRIES]); + + } else if (timelineName == "translate" || timelineName == "scale" || timelineName == "shear") { + TranslateTimeline timeline; + float timelineScale = 1; + if (timelineName == "scale") + timeline = new ScaleTimeline(values.Count); + else if (timelineName == "shear") + timeline = new ShearTimeline(values.Count); + else { + timeline = new TranslateTimeline(values.Count); + timelineScale = scale; + } + timeline.boneIndex = boneIndex; + + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float time = (float)valueMap["time"]; + float x = GetFloat(valueMap, "x", 0); + float y = GetFloat(valueMap, "y", 0); + timeline.SetFrame(frameIndex, time, x * timelineScale, y * timelineScale); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * TranslateTimeline.ENTRIES]); + + } else + throw new Exception("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); + } + } + } + + // IK constraint timelines. + if (map.ContainsKey("ik")) { + foreach (KeyValuePair constraintMap in (Dictionary)map["ik"]) { + IkConstraintData constraint = skeletonData.FindIkConstraint(constraintMap.Key); + var values = (List)constraintMap.Value; + var timeline = new IkConstraintTimeline(values.Count); + timeline.ikConstraintIndex = skeletonData.ikConstraints.IndexOf(constraint); + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float time = (float)valueMap["time"]; + float mix = GetFloat(valueMap, "mix", 1); + bool bendPositive = GetBoolean(valueMap, "bendPositive", true); + timeline.SetFrame(frameIndex, time, mix, bendPositive ? 1 : -1); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * IkConstraintTimeline.ENTRIES]); + } + } + + // Transform constraint timelines. + if (map.ContainsKey("transform")) { + foreach (KeyValuePair constraintMap in (Dictionary)map["transform"]) { + TransformConstraintData constraint = skeletonData.FindTransformConstraint(constraintMap.Key); + var values = (List)constraintMap.Value; + var timeline = new TransformConstraintTimeline(values.Count); + timeline.transformConstraintIndex = skeletonData.transformConstraints.IndexOf(constraint); + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float time = (float)valueMap["time"]; + float rotateMix = GetFloat(valueMap, "rotateMix", 1); + float translateMix = GetFloat(valueMap, "translateMix", 1); + float scaleMix = GetFloat(valueMap, "scaleMix", 1); + float shearMix = GetFloat(valueMap, "shearMix", 1); + timeline.SetFrame(frameIndex, time, rotateMix, translateMix, scaleMix, shearMix); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * TransformConstraintTimeline.ENTRIES]); + } + } + + // Path constraint timelines. + if (map.ContainsKey("paths")) { + foreach (KeyValuePair constraintMap in (Dictionary)map["paths"]) { + int index = skeletonData.FindPathConstraintIndex(constraintMap.Key); + if (index == -1) throw new Exception("Path constraint not found: " + constraintMap.Key); + PathConstraintData data = skeletonData.pathConstraints.Items[index]; + var timelineMap = (Dictionary)constraintMap.Value; + foreach (KeyValuePair timelineEntry in timelineMap) { + var values = (List)timelineEntry.Value; + var timelineName = (string)timelineEntry.Key; + if (timelineName == "position" || timelineName == "spacing") { + PathConstraintPositionTimeline timeline; + float timelineScale = 1; + if (timelineName == "spacing") { + timeline = new PathConstraintSpacingTimeline(values.Count); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) timelineScale = scale; + } + else { + timeline = new PathConstraintPositionTimeline(values.Count); + if (data.positionMode == PositionMode.Fixed) timelineScale = scale; + } + timeline.pathConstraintIndex = index; + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + timeline.SetFrame(frameIndex, (float)valueMap["time"], GetFloat(valueMap, timelineName, 0) * timelineScale); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * PathConstraintPositionTimeline.ENTRIES]); + } + else if (timelineName == "mix") { + PathConstraintMixTimeline timeline = new PathConstraintMixTimeline(values.Count); + timeline.pathConstraintIndex = index; + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + timeline.SetFrame(frameIndex, (float)valueMap["time"], GetFloat(valueMap, "rotateMix", 1), GetFloat(valueMap, "translateMix", 1)); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * PathConstraintMixTimeline.ENTRIES]); + } + } + } + } + + // Deform timelines. + if (map.ContainsKey("deform")) { + foreach (KeyValuePair deformMap in (Dictionary)map["deform"]) { + Skin skin = skeletonData.FindSkin(deformMap.Key); + foreach (KeyValuePair slotMap in (Dictionary)deformMap.Value) { + int slotIndex = skeletonData.FindSlotIndex(slotMap.Key); + if (slotIndex == -1) throw new Exception("Slot not found: " + slotMap.Key); + foreach (KeyValuePair timelineMap in (Dictionary)slotMap.Value) { + var values = (List)timelineMap.Value; + VertexAttachment attachment = (VertexAttachment)skin.GetAttachment(slotIndex, timelineMap.Key); + if (attachment == null) throw new Exception("Deform attachment not found: " + timelineMap.Key); + bool weighted = attachment.bones != null; + float[] vertices = attachment.vertices; + int deformLength = weighted ? vertices.Length / 3 * 2 : vertices.Length; + + var timeline = new DeformTimeline(values.Count); + timeline.slotIndex = slotIndex; + timeline.attachment = attachment; + + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float[] deform; + if (!valueMap.ContainsKey("vertices")) { + deform = weighted ? new float[deformLength] : vertices; + } else { + deform = new float[deformLength]; + int start = GetInt(valueMap, "offset", 0); + float[] verticesValue = GetFloatArray(valueMap, "vertices", 1); + Array.Copy(verticesValue, 0, deform, start, verticesValue.Length); + if (scale != 1) { + for (int i = start, n = i + verticesValue.Length; i < n; i++) + deform[i] *= scale; + } + + if (!weighted) { + for (int i = 0; i < deformLength; i++) + deform[i] += vertices[i]; + } + } + + timeline.SetFrame(frameIndex, (float)valueMap["time"], deform); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[timeline.FrameCount - 1]); + } + } + } + } + + // Draw order timeline. + if (map.ContainsKey("drawOrder") || map.ContainsKey("draworder")) { + var values = (List)map[map.ContainsKey("drawOrder") ? "drawOrder" : "draworder"]; + var timeline = new DrawOrderTimeline(values.Count); + int slotCount = skeletonData.slots.Count; + int frameIndex = 0; + foreach (Dictionary drawOrderMap in values) { + int[] drawOrder = null; + if (drawOrderMap.ContainsKey("offsets")) { + drawOrder = new int[slotCount]; + for (int i = slotCount - 1; i >= 0; i--) + drawOrder[i] = -1; + var offsets = (List)drawOrderMap["offsets"]; + int[] unchanged = new int[slotCount - offsets.Count]; + int originalIndex = 0, unchangedIndex = 0; + foreach (Dictionary offsetMap in offsets) { + int slotIndex = skeletonData.FindSlotIndex((string)offsetMap["slot"]); + if (slotIndex == -1) throw new Exception("Slot not found: " + offsetMap["slot"]); + // Collect unchanged items. + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + // Set changed items. + int index = originalIndex + (int)(float)offsetMap["offset"]; + drawOrder[index] = originalIndex++; + } + // Collect remaining unchanged items. + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + // Fill in unchanged items. + for (int i = slotCount - 1; i >= 0; i--) + if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex]; + } + timeline.SetFrame(frameIndex++, (float)drawOrderMap["time"], drawOrder); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[timeline.FrameCount - 1]); + } + + // Event timeline. + if (map.ContainsKey("events")) { + var eventsMap = (List)map["events"]; + var timeline = new EventTimeline(eventsMap.Count); + int frameIndex = 0; + foreach (Dictionary eventMap in eventsMap) { + EventData eventData = skeletonData.FindEvent((string)eventMap["name"]); + if (eventData == null) throw new Exception("Event not found: " + eventMap["name"]); + var e = new Event((float)eventMap["time"], eventData); + e.Int = GetInt(eventMap, "int", eventData.Int); + e.Float = GetFloat(eventMap, "float", eventData.Float); + e.String = GetString(eventMap, "string", eventData.String); + timeline.SetFrame(frameIndex++, e); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[timeline.FrameCount - 1]); + } + + timelines.TrimExcess(); + skeletonData.animations.Add(new Animation(name, timelines, duration)); + } + + static void ReadCurve (Dictionary valueMap, CurveTimeline timeline, int frameIndex) { + if (!valueMap.ContainsKey("curve")) + return; + Object curveObject = valueMap["curve"]; + if (curveObject.Equals("stepped")) + timeline.SetStepped(frameIndex); + else { + var curve = curveObject as List; + if (curve != null) + timeline.SetCurve(frameIndex, (float)curve[0], (float)curve[1], (float)curve[2], (float)curve[3]); + } + } + + internal class LinkedMesh { + internal string parent, skin; + internal int slotIndex; + internal MeshAttachment mesh; + + public LinkedMesh (MeshAttachment mesh, string skin, int slotIndex, string parent) { + this.mesh = mesh; + this.skin = skin; + this.slotIndex = slotIndex; + this.parent = parent; + } + } + + static float[] GetFloatArray(Dictionary map, string name, float scale) { + var list = (List)map[name]; + var values = new float[list.Count]; + if (scale == 1) { + for (int i = 0, n = list.Count; i < n; i++) + values[i] = (float)list[i]; + } else { + for (int i = 0, n = list.Count; i < n; i++) + values[i] = (float)list[i] * scale; + } + return values; + } + + static int[] GetIntArray(Dictionary map, string name) { + var list = (List)map[name]; + var values = new int[list.Count]; + for (int i = 0, n = list.Count; i < n; i++) + values[i] = (int)(float)list[i]; + return values; + } + + static float GetFloat(Dictionary map, string name, float defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (float)map[name]; + } + + static int GetInt(Dictionary map, string name, int defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (int)(float)map[name]; + } + + static bool GetBoolean(Dictionary map, string name, bool defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (bool)map[name]; + } + + static string GetString(Dictionary map, string name, string defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (string)map[name]; + } + + static float ToColor(string hexString, int colorIndex, int expectedLength = 8) { + if (hexString.Length != expectedLength) + throw new ArgumentException("Color hexidecimal length must be " + expectedLength + ", recieved: " + hexString, "hexString"); + return Convert.ToInt32(hexString.Substring(colorIndex * 2, 2), 16) / (float)255; + } + } +} diff --git a/Assets/Spine/SpineCSharp/Skin.cs b/Assets/Spine/SpineCSharp/Skin.cs new file mode 100644 index 0000000..2e754d3 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Skin.cs @@ -0,0 +1,125 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + /// Stores attachments by slot index and attachment name. + /// See SkeletonData , Skeleton , and + /// Runtime skins in the Spine Runtimes Guide. + /// + public class Skin { + internal string name; + private Dictionary attachments = + new Dictionary(AttachmentKeyTupleComparer.Instance); + + public string Name { get { return name; } } + public Dictionary Attachments { get { return attachments; } } + + public Skin (string name) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.name = name; + } + + /// Adds an attachment to the skin for the specified slot index and name. If the name already exists for the slot, the previous value is replaced. + public void AddAttachment (int slotIndex, string name, Attachment attachment) { + if (attachment == null) throw new ArgumentNullException("attachment", "attachment cannot be null."); + attachments[new AttachmentKeyTuple(slotIndex, name)] = attachment; + } + + /// Returns the attachment for the specified slot index and name, or null. + /// May be null. + public Attachment GetAttachment (int slotIndex, string name) { + Attachment attachment; + attachments.TryGetValue(new AttachmentKeyTuple(slotIndex, name), out attachment); + return attachment; + } + + /// Finds the skin keys for a given slot. The results are added to the passed List(names). + /// The target slotIndex. To find the slot index, use or + /// Found skin key names will be added to this list. + public void FindNamesForSlot (int slotIndex, List names) { + if (names == null) throw new ArgumentNullException("names", "names cannot be null."); + foreach (AttachmentKeyTuple key in attachments.Keys) + if (key.slotIndex == slotIndex) names.Add(key.name); + } + + /// Finds the attachments for a given slot. The results are added to the passed List(Attachment). + /// The target slotIndex. To find the slot index, use or + /// Found Attachments will be added to this list. + public void FindAttachmentsForSlot (int slotIndex, List attachments) { + if (attachments == null) throw new ArgumentNullException("attachments", "attachments cannot be null."); + foreach (KeyValuePair entry in this.attachments) + if (entry.Key.slotIndex == slotIndex) attachments.Add(entry.Value); + } + + override public string ToString () { + return name; + } + + /// Attach all attachments from this skin if the corresponding attachment from the old skin is currently attached. + internal void AttachAll (Skeleton skeleton, Skin oldSkin) { + foreach (KeyValuePair entry in oldSkin.attachments) { + int slotIndex = entry.Key.slotIndex; + Slot slot = skeleton.slots.Items[slotIndex]; + if (slot.Attachment == entry.Value) { + Attachment attachment = GetAttachment(slotIndex, entry.Key.name); + if (attachment != null) slot.Attachment = attachment; + } + } + } + + public struct AttachmentKeyTuple { + public readonly int slotIndex; + public readonly string name; + internal readonly int nameHashCode; + + public AttachmentKeyTuple (int slotIndex, string name) { + this.slotIndex = slotIndex; + this.name = name; + nameHashCode = this.name.GetHashCode(); + } + } + + // Avoids boxing in the dictionary. + class AttachmentKeyTupleComparer : IEqualityComparer { + internal static readonly AttachmentKeyTupleComparer Instance = new AttachmentKeyTupleComparer(); + + bool IEqualityComparer.Equals (AttachmentKeyTuple o1, AttachmentKeyTuple o2) { + return o1.slotIndex == o2.slotIndex && o1.nameHashCode == o2.nameHashCode && string.Equals(o1.name, o2.name, StringComparison.Ordinal); + } + + int IEqualityComparer.GetHashCode (AttachmentKeyTuple o) { + return o.slotIndex; + } + } + } +} diff --git a/Assets/Spine/SpineCSharp/Slot.cs b/Assets/Spine/SpineCSharp/Slot.cs new file mode 100644 index 0000000..6151aa9 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Slot.cs @@ -0,0 +1,100 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class Slot { + internal SlotData data; + internal Bone bone; + internal float r, g, b, a; + internal float r2, g2, b2; + internal bool hasSecondColor; + internal Attachment attachment; + internal float attachmentTime; + internal ExposedList attachmentVertices = new ExposedList(); + + public SlotData Data { get { return data; } } + public Bone Bone { get { return bone; } } + public Skeleton Skeleton { get { return bone.skeleton; } } + public float R { get { return r; } set { r = value; } } + public float G { get { return g; } set { g = value; } } + public float B { get { return b; } set { b = value; } } + public float A { get { return a; } set { a = value; } } + + public float R2 { get { return r2; } set { r2 = value; } } + public float G2 { get { return g2; } set { g2 = value; } } + public float B2 { get { return b2; } set { b2 = value; } } + public bool HasSecondColor { get { return data.hasSecondColor; } set { data.hasSecondColor = value; } } + + /// May be null. + public Attachment Attachment { + get { return attachment; } + set { + if (attachment == value) return; + attachment = value; + attachmentTime = bone.skeleton.time; + attachmentVertices.Clear(false); + } + } + + public float AttachmentTime { + get { return bone.skeleton.time - attachmentTime; } + set { attachmentTime = bone.skeleton.time - value; } + } + + public ExposedList AttachmentVertices { get { return attachmentVertices; } set { attachmentVertices = value; } } + + public Slot (SlotData data, Bone bone) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (bone == null) throw new ArgumentNullException("bone", "bone cannot be null."); + this.data = data; + this.bone = bone; + SetToSetupPose(); + } + + public void SetToSetupPose () { + r = data.r; + g = data.g; + b = data.b; + a = data.a; + if (data.attachmentName == null) + Attachment = null; + else { + attachment = null; + Attachment = bone.skeleton.GetAttachment(data.index, data.attachmentName); + } + } + + override public string ToString () { + return data.name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/SlotData.cs b/Assets/Spine/SpineCSharp/SlotData.cs new file mode 100644 index 0000000..956634d --- /dev/null +++ b/Assets/Spine/SpineCSharp/SlotData.cs @@ -0,0 +1,74 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class SlotData { + internal int index; + internal string name; + internal BoneData boneData; + internal float r = 1, g = 1, b = 1, a = 1; + internal float r2 = 0, g2 = 0, b2 = 0; + internal bool hasSecondColor = false; + internal string attachmentName; + internal BlendMode blendMode; + + public int Index { get { return index; } } + public string Name { get { return name; } } + public BoneData BoneData { get { return boneData; } } + public float R { get { return r; } set { r = value; } } + public float G { get { return g; } set { g = value; } } + public float B { get { return b; } set { b = value; } } + public float A { get { return a; } set { a = value; } } + + public float R2 { get { return r2; } set { r2 = value; } } + public float G2 { get { return g2; } set { g2 = value; } } + public float B2 { get { return b2; } set { b2 = value; } } + public bool HasSecondColor { get { return hasSecondColor; } set { hasSecondColor = value; } } + + /// May be null. + public String AttachmentName { get { return attachmentName; } set { attachmentName = value; } } + public BlendMode BlendMode { get { return blendMode; } set { blendMode = value; } } + + public SlotData (int index, String name, BoneData boneData) { + if (index < 0) throw new ArgumentException ("index must be >= 0.", "index"); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + if (boneData == null) throw new ArgumentNullException("boneData", "boneData cannot be null."); + this.index = index; + this.name = name; + this.boneData = boneData; + } + + override public string ToString () { + return name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/TransformConstraint.cs b/Assets/Spine/SpineCSharp/TransformConstraint.cs new file mode 100644 index 0000000..f220a8a --- /dev/null +++ b/Assets/Spine/SpineCSharp/TransformConstraint.cs @@ -0,0 +1,284 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class TransformConstraint : IConstraint { + internal TransformConstraintData data; + internal ExposedList bones; + internal Bone target; + internal float rotateMix, translateMix, scaleMix, shearMix; + + public TransformConstraintData Data { get { return data; } } + public int Order { get { return data.order; } } + public ExposedList Bones { get { return bones; } } + public Bone Target { get { return target; } set { target = value; } } + public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } + public float TranslateMix { get { return translateMix; } set { translateMix = value; } } + public float ScaleMix { get { return scaleMix; } set { scaleMix = value; } } + public float ShearMix { get { return shearMix; } set { shearMix = value; } } + + public TransformConstraint (TransformConstraintData data, Skeleton skeleton) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); + this.data = data; + rotateMix = data.rotateMix; + translateMix = data.translateMix; + scaleMix = data.scaleMix; + shearMix = data.shearMix; + + bones = new ExposedList(); + foreach (BoneData boneData in data.bones) + bones.Add (skeleton.FindBone (boneData.name)); + + target = skeleton.FindBone(data.target.name); + } + + public void Apply () { + Update(); + } + + public void Update () { + if (data.local) { + if (data.relative) + ApplyRelativeLocal(); + else + ApplyAbsoluteLocal(); + } else { + if (data.relative) + ApplyRelativeWorld(); + else + ApplyAbsoluteWorld(); + } + } + + void ApplyAbsoluteWorld () { + float rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + Bone target = this.target; + float ta = target.a, tb = target.b, tc = target.c, td = target.d; + float degRadReflect = ta * td - tb * tc > 0 ? MathUtils.DegRad : -MathUtils.DegRad; + float offsetRotation = data.offsetRotation * degRadReflect, offsetShearY = data.offsetShearY * degRadReflect; + var bones = this.bones; + for (int i = 0, n = bones.Count; i < n; i++) { + Bone bone = bones.Items[i]; + bool modified = false; + + if (rotateMix != 0) { + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; + float r = MathUtils.Atan2(tc, ta) - MathUtils.Atan2(c, a) + offsetRotation; + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) r += MathUtils.PI2; + r *= rotateMix; + float cos = MathUtils.Cos(r), sin = MathUtils.Sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + modified = true; + } + + if (translateMix != 0) { + float tx, ty; //Vector2 temp = this.temp; + target.LocalToWorld(data.offsetX, data.offsetY, out tx, out ty); //target.localToWorld(temp.set(data.offsetX, data.offsetY)); + bone.worldX += (tx - bone.worldX) * translateMix; + bone.worldY += (ty - bone.worldY) * translateMix; + modified = true; + } + + if (scaleMix > 0) { + float s = (float)Math.Sqrt(bone.a * bone.a + bone.c * bone.c); + //float ts = (float)Math.sqrt(ta * ta + tc * tc); + if (s > 0.00001f) s = (s + ((float)Math.Sqrt(ta * ta + tc * tc) - s + data.offsetScaleX) * scaleMix) / s; + bone.a *= s; + bone.c *= s; + s = (float)Math.Sqrt(bone.b * bone.b + bone.d * bone.d); + //ts = (float)Math.Sqrt(tb * tb + td * td); + if (s > 0.00001f) s = (s + ((float)Math.Sqrt(tb * tb + td * td) - s + data.offsetScaleY) * scaleMix) / s; + bone.b *= s; + bone.d *= s; + modified = true; + } + + if (shearMix > 0) { + float b = bone.b, d = bone.d; + float by = MathUtils.Atan2(d, b); + float r = MathUtils.Atan2(td, tb) - MathUtils.Atan2(tc, ta) - (by - MathUtils.Atan2(bone.c, bone.a)); + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) r += MathUtils.PI2; + r = by + (r + offsetShearY) * shearMix; + float s = (float)Math.Sqrt(b * b + d * d); + bone.b = MathUtils.Cos(r) * s; + bone.d = MathUtils.Sin(r) * s; + modified = true; + } + + if (modified) bone.appliedValid = false; + } + } + + void ApplyRelativeWorld () { + float rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + Bone target = this.target; + float ta = target.a, tb = target.b, tc = target.c, td = target.d; + float degRadReflect = ta * td - tb * tc > 0 ? MathUtils.DegRad : -MathUtils.DegRad; + float offsetRotation = data.offsetRotation * degRadReflect, offsetShearY = data.offsetShearY * degRadReflect; + var bones = this.bones; + for (int i = 0, n = bones.Count; i < n; i++) { + Bone bone = bones.Items[i]; + bool modified = false; + + if (rotateMix != 0) { + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; + float r = MathUtils.Atan2(tc, ta) + offsetRotation; + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) r += MathUtils.PI2; + r *= rotateMix; + float cos = MathUtils.Cos(r), sin = MathUtils.Sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + modified = true; + } + + if (translateMix != 0) { + float tx, ty; //Vector2 temp = this.temp; + target.LocalToWorld(data.offsetX, data.offsetY, out tx, out ty); //target.localToWorld(temp.set(data.offsetX, data.offsetY)); + bone.worldX += tx * translateMix; + bone.worldY += ty * translateMix; + modified = true; + } + + if (scaleMix > 0) { + float s = ((float)Math.Sqrt(ta * ta + tc * tc) - 1 + data.offsetScaleX) * scaleMix + 1; + bone.a *= s; + bone.c *= s; + s = ((float)Math.Sqrt(tb * tb + td * td) - 1 + data.offsetScaleY) * scaleMix + 1; + bone.b *= s; + bone.d *= s; + modified = true; + } + + if (shearMix > 0) { + float r = MathUtils.Atan2(td, tb) - MathUtils.Atan2(tc, ta); + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) r += MathUtils.PI2; + float b = bone.b, d = bone.d; + r = MathUtils.Atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * shearMix; + float s = (float)Math.Sqrt(b * b + d * d); + bone.b = MathUtils.Cos(r) * s; + bone.d = MathUtils.Sin(r) * s; + modified = true; + } + + if (modified) bone.appliedValid = false; + } + } + + void ApplyAbsoluteLocal () { + float rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + Bone target = this.target; + if (!target.appliedValid) target.UpdateAppliedTransform(); + var bonesItems = this.bones.Items; + for (int i = 0, n = this.bones.Count; i < n; i++) { + Bone bone = bonesItems[i]; + if (!bone.appliedValid) bone.UpdateAppliedTransform(); + + float rotation = bone.arotation; + if (rotateMix != 0) { + float r = target.arotation - rotation + data.offsetRotation; + r -= (16384 - (int)(16384.499999999996 - r / 360)) * 360; + rotation += r * rotateMix; + } + + float x = bone.ax, y = bone.ay; + if (translateMix != 0) { + x += (target.ax - x + data.offsetX) * translateMix; + y += (target.ay - y + data.offsetY) * translateMix; + } + + float scaleX = bone.ascaleX, scaleY = bone.ascaleY; + if (scaleMix > 0) { + if (scaleX > 0.00001f) scaleX = (scaleX + (target.ascaleX - scaleX + data.offsetScaleX) * scaleMix) / scaleX; + if (scaleY > 0.00001f) scaleY = (scaleY + (target.ascaleY - scaleY + data.offsetScaleY) * scaleMix) / scaleY; + } + + float shearY = bone.ashearY; + if (shearMix > 0) { + float r = target.ashearY - shearY + data.offsetShearY; + r -= (16384 - (int)(16384.499999999996 - r / 360)) * 360; + bone.shearY += r * shearMix; + } + + bone.UpdateWorldTransform(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); + } + } + + void ApplyRelativeLocal () { + float rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + Bone target = this.target; + if (!target.appliedValid) target.UpdateAppliedTransform(); + var bonesItems = this.bones.Items; + for (int i = 0, n = this.bones.Count; i < n; i++) { + Bone bone = bonesItems[i]; + if (!bone.appliedValid) bone.UpdateAppliedTransform(); + + float rotation = bone.arotation; + if (rotateMix != 0) rotation += (target.arotation + data.offsetRotation) * rotateMix; + + float x = bone.ax, y = bone.ay; + if (translateMix != 0) { + x += (target.ax + data.offsetX) * translateMix; + y += (target.ay + data.offsetY) * translateMix; + } + + float scaleX = bone.ascaleX, scaleY = bone.ascaleY; + if (scaleMix > 0) { + if (scaleX > 0.00001f) scaleX *= ((target.ascaleX - 1 + data.offsetScaleX) * scaleMix) + 1; + if (scaleY > 0.00001f) scaleY *= ((target.ascaleY - 1 + data.offsetScaleY) * scaleMix) + 1; + } + + float shearY = bone.ashearY; + if (shearMix > 0) shearY += (target.ashearY + data.offsetShearY) * shearMix; + + bone.UpdateWorldTransform(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); + } + } + + override public string ToString () { + return data.name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/TransformConstraintData.cs b/Assets/Spine/SpineCSharp/TransformConstraintData.cs new file mode 100644 index 0000000..be0dc1c --- /dev/null +++ b/Assets/Spine/SpineCSharp/TransformConstraintData.cs @@ -0,0 +1,71 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class TransformConstraintData { + internal string name; + internal int order; + internal ExposedList bones = new ExposedList(); + internal BoneData target; + internal float rotateMix, translateMix, scaleMix, shearMix; + internal float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY; + internal bool relative, local; + + public string Name { get { return name; } } + public int Order { get { return order; } set { order = value; } } + public ExposedList Bones { get { return bones; } } + public BoneData Target { get { return target; } set { target = value; } } + public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } + public float TranslateMix { get { return translateMix; } set { translateMix = value; } } + public float ScaleMix { get { return scaleMix; } set { scaleMix = value; } } + public float ShearMix { get { return shearMix; } set { shearMix = value; } } + + public float OffsetRotation { get { return offsetRotation; } set { offsetRotation = value; } } + public float OffsetX { get { return offsetX; } set { offsetX = value; } } + public float OffsetY { get { return offsetY; } set { offsetY = value; } } + public float OffsetScaleX { get { return offsetScaleX; } set { offsetScaleX = value; } } + public float OffsetScaleY { get { return offsetScaleY; } set { offsetScaleY = value; } } + public float OffsetShearY { get { return offsetShearY; } set { offsetShearY = value; } } + + public bool Relative { get { return relative; } set { relative = value; } } + public bool Local { get { return local; } set { local = value; } } + + public TransformConstraintData (string name) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.name = name; + } + + override public string ToString () { + return name; + } + } +} diff --git a/Assets/Spine/SpineCSharp/Triangulator.cs b/Assets/Spine/SpineCSharp/Triangulator.cs new file mode 100644 index 0000000..c4bdb04 --- /dev/null +++ b/Assets/Spine/SpineCSharp/Triangulator.cs @@ -0,0 +1,278 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + internal class Triangulator { + private readonly ExposedList> convexPolygons = new ExposedList>(); + private readonly ExposedList> convexPolygonsIndices = new ExposedList>(); + + private readonly ExposedList indicesArray = new ExposedList(); + private readonly ExposedList isConcaveArray = new ExposedList(); + private readonly ExposedList triangles = new ExposedList(); + + private readonly Pool> polygonPool = new Pool>(); + private readonly Pool> polygonIndicesPool = new Pool>(); + + public ExposedList Triangulate (ExposedList verticesArray) { + var vertices = verticesArray.Items; + int vertexCount = verticesArray.Count >> 1; + + var indicesArray = this.indicesArray; + indicesArray.Clear(); + int[] indices = indicesArray.Resize(vertexCount).Items; + for (int i = 0; i < vertexCount; i++) + indices[i] = i; + + var isConcaveArray = this.isConcaveArray; + bool[] isConcave = isConcaveArray.Resize(vertexCount).Items; + for (int i = 0, n = vertexCount; i < n; ++i) + isConcave[i] = IsConcave(i, vertexCount, vertices, indices); + + var triangles = this.triangles; + triangles.Clear(); + triangles.EnsureCapacity(Math.Max(0, vertexCount - 2) << 2); + + while (vertexCount > 3) { + // Find ear tip. + int previous = vertexCount - 1, i = 0, next = 1; + + // outer: + while (true) { + if (!isConcave[i]) { + int p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1; + float p1x = vertices[p1], p1y = vertices[p1 + 1]; + float p2x = vertices[p2], p2y = vertices[p2 + 1]; + float p3x = vertices[p3], p3y = vertices[p3 + 1]; + for (int ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) { + if (!isConcave[ii]) continue; + int v = indices[ii] << 1; + float vx = vertices[v], vy = vertices[v + 1]; + if (PositiveArea(p3x, p3y, p1x, p1y, vx, vy)) { + if (PositiveArea(p1x, p1y, p2x, p2y, vx, vy)) { + if (PositiveArea(p2x, p2y, p3x, p3y, vx, vy)) goto break_outer; // break outer; + } + } + } + break; + } + break_outer: + + if (next == 0) { + do { + if (!isConcave[i]) break; + i--; + } while (i > 0); + break; + } + + previous = i; + i = next; + next = (next + 1) % vertexCount; + } + + // Cut ear tip. + triangles.Add(indices[(vertexCount + i - 1) % vertexCount]); + triangles.Add(indices[i]); + triangles.Add(indices[(i + 1) % vertexCount]); + indicesArray.RemoveAt(i); + isConcaveArray.RemoveAt(i); + vertexCount--; + + int previousIndex = (vertexCount + i - 1) % vertexCount; + int nextIndex = i == vertexCount ? 0 : i; + isConcave[previousIndex] = IsConcave(previousIndex, vertexCount, vertices, indices); + isConcave[nextIndex] = IsConcave(nextIndex, vertexCount, vertices, indices); + } + + if (vertexCount == 3) { + triangles.Add(indices[2]); + triangles.Add(indices[0]); + triangles.Add(indices[1]); + } + + return triangles; + } + + public ExposedList> Decompose (ExposedList verticesArray, ExposedList triangles) { + var vertices = verticesArray.Items; + var convexPolygons = this.convexPolygons; + for (int i = 0, n = convexPolygons.Count; i < n; i++) { + polygonPool.Free(convexPolygons.Items[i]); + } + convexPolygons.Clear(); + + var convexPolygonsIndices = this.convexPolygonsIndices; + for (int i = 0, n = convexPolygonsIndices.Count; i < n; i++) { + polygonIndicesPool.Free(convexPolygonsIndices.Items[i]); + } + convexPolygonsIndices.Clear(); + + var polygonIndices = polygonIndicesPool.Obtain(); + polygonIndices.Clear(); + + var polygon = polygonPool.Obtain(); + polygon.Clear(); + + // Merge subsequent triangles if they form a triangle fan. + int fanBaseIndex = -1, lastWinding = 0; + int[] trianglesItems = triangles.Items; + for (int i = 0, n = triangles.Count; i < n; i += 3) { + int t1 = trianglesItems[i] << 1, t2 = trianglesItems[i + 1] << 1, t3 = trianglesItems[i + 2] << 1; + float x1 = vertices[t1], y1 = vertices[t1 + 1]; + float x2 = vertices[t2], y2 = vertices[t2 + 1]; + float x3 = vertices[t3], y3 = vertices[t3 + 1]; + + // If the base of the last triangle is the same as this triangle, check if they form a convex polygon (triangle fan). + var merged = false; + if (fanBaseIndex == t1) { + int o = polygon.Count - 4; + float[] p = polygon.Items; + int winding1 = Winding(p[o], p[o + 1], p[o + 2], p[o + 3], x3, y3); + int winding2 = Winding(x3, y3, p[0], p[1], p[2], p[3]); + if (winding1 == lastWinding && winding2 == lastWinding) { + polygon.Add(x3); + polygon.Add(y3); + polygonIndices.Add(t3); + merged = true; + } + } + + // Otherwise make this triangle the new base. + if (!merged) { + if (polygon.Count > 0) { + convexPolygons.Add(polygon); + convexPolygonsIndices.Add(polygonIndices); + } else { + polygonPool.Free(polygon); + polygonIndicesPool.Free(polygonIndices); + } + polygon = polygonPool.Obtain(); + polygon.Clear(); + polygon.Add(x1); + polygon.Add(y1); + polygon.Add(x2); + polygon.Add(y2); + polygon.Add(x3); + polygon.Add(y3); + polygonIndices = polygonIndicesPool.Obtain(); + polygonIndices.Clear(); + polygonIndices.Add(t1); + polygonIndices.Add(t2); + polygonIndices.Add(t3); + lastWinding = Winding(x1, y1, x2, y2, x3, y3); + fanBaseIndex = t1; + } + } + + if (polygon.Count > 0) { + convexPolygons.Add(polygon); + convexPolygonsIndices.Add(polygonIndices); + } + + // Go through the list of polygons and try to merge the remaining triangles with the found triangle fans. + for (int i = 0, n = convexPolygons.Count; i < n; i++) { + polygonIndices = convexPolygonsIndices.Items[i]; + if (polygonIndices.Count == 0) continue; + int firstIndex = polygonIndices.Items[0]; + int lastIndex = polygonIndices.Items[polygonIndices.Count - 1]; + + polygon = convexPolygons.Items[i]; + int o = polygon.Count - 4; + float[] p = polygon.Items; + float prevPrevX = p[o], prevPrevY = p[o + 1]; + float prevX = p[o + 2], prevY = p[o + 3]; + float firstX = p[0], firstY = p[1]; + float secondX = p[2], secondY = p[3]; + int winding = Winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY); + + for (int ii = 0; ii < n; ii++) { + if (ii == i) continue; + var otherIndices = convexPolygonsIndices.Items[ii]; + if (otherIndices.Count != 3) continue; + int otherFirstIndex = otherIndices.Items[0]; + int otherSecondIndex = otherIndices.Items[1]; + int otherLastIndex = otherIndices.Items[2]; + + var otherPoly = convexPolygons.Items[ii]; + float x3 = otherPoly.Items[otherPoly.Count - 2], y3 = otherPoly.Items[otherPoly.Count - 1]; + + if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex) continue; + int winding1 = Winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3); + int winding2 = Winding(x3, y3, firstX, firstY, secondX, secondY); + if (winding1 == winding && winding2 == winding) { + otherPoly.Clear(); + otherIndices.Clear(); + polygon.Add(x3); + polygon.Add(y3); + polygonIndices.Add(otherLastIndex); + prevPrevX = prevX; + prevPrevY = prevY; + prevX = x3; + prevY = y3; + ii = 0; + } + } + } + + // Remove empty polygons that resulted from the merge step above. + for (int i = convexPolygons.Count - 1; i >= 0; i--) { + polygon = convexPolygons.Items[i]; + if (polygon.Count == 0) { + convexPolygons.RemoveAt(i); + polygonPool.Free(polygon); + polygonIndices = convexPolygonsIndices.Items[i]; + convexPolygonsIndices.RemoveAt(i); + polygonIndicesPool.Free(polygonIndices); + } + } + + return convexPolygons; + } + + static private bool IsConcave (int index, int vertexCount, float[] vertices, int[] indices) { + int previous = indices[(vertexCount + index - 1) % vertexCount] << 1; + int current = indices[index] << 1; + int next = indices[(index + 1) % vertexCount] << 1; + return !PositiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], + vertices[next + 1]); + } + + static private bool PositiveArea (float p1x, float p1y, float p2x, float p2y, float p3x, float p3y) { + return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0; + } + + static private int Winding (float p1x, float p1y, float p2x, float p2y, float p3x, float p3y) { + float px = p2x - p1x, py = p2y - p1y; + return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1; + } + } +} diff --git a/Assets/Standard Assets/Editor.meta b/Assets/Standard Assets/Editor.meta new file mode 100644 index 0000000..f37ba4d --- /dev/null +++ b/Assets/Standard Assets/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8f7308500f322e644817ccfc3e0a17a5 +folderAsset: yes +timeCreated: 1436977287 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Standard Assets/Editor/ImageEffects.meta b/Assets/Standard Assets/Editor/ImageEffects.meta new file mode 100644 index 0000000..1dfb536 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 225198e07aaae3547a6d1f6e7177555f +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/AntialiasingEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/AntialiasingEditor.cs new file mode 100644 index 0000000..795b9d8 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/AntialiasingEditor.cs @@ -0,0 +1,75 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor(typeof (Antialiasing))] + public class AntialiasingEditor : Editor + { + private SerializedObject serObj; + + private SerializedProperty mode; + + private SerializedProperty showGeneratedNormals; + private SerializedProperty offsetScale; + private SerializedProperty blurRadius; + private SerializedProperty dlaaSharp; + + private SerializedProperty edgeThresholdMin; + private SerializedProperty edgeThreshold; + private SerializedProperty edgeSharpness; + + + private void OnEnable() + { + serObj = new SerializedObject(target); + + mode = serObj.FindProperty("mode"); + + showGeneratedNormals = serObj.FindProperty("showGeneratedNormals"); + offsetScale = serObj.FindProperty("offsetScale"); + blurRadius = serObj.FindProperty("blurRadius"); + dlaaSharp = serObj.FindProperty("dlaaSharp"); + + edgeThresholdMin = serObj.FindProperty("edgeThresholdMin"); + edgeThreshold = serObj.FindProperty("edgeThreshold"); + edgeSharpness = serObj.FindProperty("edgeSharpness"); + } + + + public override void OnInspectorGUI() + { + serObj.Update(); + + GUILayout.Label("Luminance based fullscreen antialiasing", EditorStyles.miniBoldLabel); + + EditorGUILayout.PropertyField(mode, new GUIContent("Technique")); + + Material mat = (target as Antialiasing).CurrentAAMaterial(); + if (null == mat && (target as Antialiasing).enabled) + { + EditorGUILayout.HelpBox("This AA technique is currently not supported. Choose a different technique or disable the effect and use MSAA instead.", MessageType.Warning); + } + + if (mode.enumValueIndex == (int) AAMode.NFAA) + { + EditorGUILayout.PropertyField(offsetScale, new GUIContent("Edge Detect Ofs")); + EditorGUILayout.PropertyField(blurRadius, new GUIContent("Blur Radius")); + EditorGUILayout.PropertyField(showGeneratedNormals, new GUIContent("Show Normals")); + } + else if (mode.enumValueIndex == (int) AAMode.DLAA) + { + EditorGUILayout.PropertyField(dlaaSharp, new GUIContent("Sharp")); + } + else if (mode.enumValueIndex == (int) AAMode.FXAA3Console) + { + EditorGUILayout.PropertyField(edgeThresholdMin, new GUIContent("Edge Min Threshhold")); + EditorGUILayout.PropertyField(edgeThreshold, new GUIContent("Edge Threshhold")); + EditorGUILayout.PropertyField(edgeSharpness, new GUIContent("Edge Sharpness")); + } + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/AntialiasingEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/AntialiasingEditor.cs.meta new file mode 100644 index 0000000..bbf3d2e --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/AntialiasingEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ba15fa37442517749a3c4640a4ad4054 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/BloomAndFlaresEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/BloomAndFlaresEditor.cs new file mode 100644 index 0000000..b4bd1bb --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/BloomAndFlaresEditor.cs @@ -0,0 +1,161 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(BloomAndFlares))] + class BloomAndFlaresEditor : Editor + { + SerializedProperty tweakMode; + SerializedProperty screenBlendMode; + + SerializedObject serObj; + + SerializedProperty hdr; + SerializedProperty sepBlurSpread; + SerializedProperty useSrcAlphaAsMask; + + SerializedProperty bloomIntensity; + SerializedProperty bloomthreshold; + SerializedProperty bloomBlurIterations; + + SerializedProperty lensflares; + + SerializedProperty hollywoodFlareBlurIterations; + + SerializedProperty lensflareMode; + SerializedProperty hollyStretchWidth; + SerializedProperty lensflareIntensity; + SerializedProperty lensflarethreshold; + SerializedProperty flareColorA; + SerializedProperty flareColorB; + SerializedProperty flareColorC; + SerializedProperty flareColorD; + + SerializedProperty lensFlareVignetteMask; + + void OnEnable () { + serObj = new SerializedObject (target); + + screenBlendMode = serObj.FindProperty("screenBlendMode"); + hdr = serObj.FindProperty("hdr"); + + sepBlurSpread = serObj.FindProperty("sepBlurSpread"); + useSrcAlphaAsMask = serObj.FindProperty("useSrcAlphaAsMask"); + + bloomIntensity = serObj.FindProperty("bloomIntensity"); + bloomthreshold = serObj.FindProperty("bloomThreshold"); + bloomBlurIterations = serObj.FindProperty("bloomBlurIterations"); + + lensflares = serObj.FindProperty("lensflares"); + + lensflareMode = serObj.FindProperty("lensflareMode"); + hollywoodFlareBlurIterations = serObj.FindProperty("hollywoodFlareBlurIterations"); + hollyStretchWidth = serObj.FindProperty("hollyStretchWidth"); + lensflareIntensity = serObj.FindProperty("lensflareIntensity"); + lensflarethreshold = serObj.FindProperty("lensflareThreshold"); + flareColorA = serObj.FindProperty("flareColorA"); + flareColorB = serObj.FindProperty("flareColorB"); + flareColorC = serObj.FindProperty("flareColorC"); + flareColorD = serObj.FindProperty("flareColorD"); + lensFlareVignetteMask = serObj.FindProperty("lensFlareVignetteMask"); + + tweakMode = serObj.FindProperty("tweakMode"); + } + + + public override void OnInspectorGUI () { + serObj.Update(); + + GUILayout.Label("HDR " + (hdr.enumValueIndex == 0 ? "auto detected, " : (hdr.enumValueIndex == 1 ? "forced on, " : "disabled, ")) + (useSrcAlphaAsMask.floatValue < 0.1f ? " ignoring alpha channel glow information" : " using alpha channel glow information"), EditorStyles.miniBoldLabel); + + EditorGUILayout.PropertyField (tweakMode, new GUIContent("Tweak mode")); + EditorGUILayout.PropertyField (screenBlendMode, new GUIContent("Blend mode")); + EditorGUILayout.PropertyField (hdr, new GUIContent("HDR")); + + // display info text when screen blend mode cannot be used + Camera cam = (target as BloomAndFlares).GetComponent(); + if (cam != null) { +#if UNITY_5_6_OR_NEWER + if (screenBlendMode.enumValueIndex==0 && ((cam.allowHDR && hdr.enumValueIndex==0) || (hdr.enumValueIndex==1))) { +#else + if (screenBlendMode.enumValueIndex==0 && ((cam.hdr && hdr.enumValueIndex==0) || (hdr.enumValueIndex==1))) { +#endif + EditorGUILayout.HelpBox("Screen blend is not supported in HDR. Using 'Add' instead.", MessageType.Info); + } + } + + if (1 == tweakMode.intValue) + EditorGUILayout.PropertyField (lensflares, new GUIContent("Cast lens flares")); + + EditorGUILayout.Separator (); + + EditorGUILayout.PropertyField (bloomIntensity, new GUIContent("Intensity")); + bloomthreshold.floatValue = EditorGUILayout.Slider ("threshold", bloomthreshold.floatValue, -0.05f, 4.0f); + bloomBlurIterations.intValue = EditorGUILayout.IntSlider ("Blur iterations", bloomBlurIterations.intValue, 1, 4); + sepBlurSpread.floatValue = EditorGUILayout.Slider ("Blur spread", sepBlurSpread.floatValue, 0.1f, 10.0f); + + if (1 == tweakMode.intValue) + useSrcAlphaAsMask.floatValue = EditorGUILayout.Slider (new GUIContent("Use alpha mask", "Make alpha channel define glowiness"), useSrcAlphaAsMask.floatValue, 0.0f, 1.0f); + else + useSrcAlphaAsMask.floatValue = 0.0f; + + if (1 == tweakMode.intValue) { + EditorGUILayout.Separator (); + + if (lensflares.boolValue) { + + // further lens flare tweakings + if (0 != tweakMode.intValue) + EditorGUILayout.PropertyField (lensflareMode, new GUIContent("Lens flare mode")); + else + lensflareMode.enumValueIndex = 0; + + EditorGUILayout.PropertyField(lensFlareVignetteMask, new GUIContent("Lens flare mask", "This mask is needed to prevent lens flare artifacts")); + + EditorGUILayout.PropertyField (lensflareIntensity, new GUIContent("Local intensity")); + lensflarethreshold.floatValue = EditorGUILayout.Slider ("Local threshold", lensflarethreshold.floatValue, 0.0f, 1.0f); + + if (lensflareMode.intValue == 0) { + // ghosting + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorA, new GUIContent("1st Color")); + EditorGUILayout.PropertyField (flareColorB, new GUIContent("2nd Color")); + EditorGUILayout.EndHorizontal (); + + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorC, new GUIContent("3rd Color")); + EditorGUILayout.PropertyField (flareColorD, new GUIContent("4th Color")); + EditorGUILayout.EndHorizontal (); + } + else if (lensflareMode.intValue == 1) { + // hollywood + EditorGUILayout.PropertyField (hollyStretchWidth, new GUIContent("Stretch width")); + hollywoodFlareBlurIterations.intValue = EditorGUILayout.IntSlider ("Blur iterations", hollywoodFlareBlurIterations.intValue, 1, 4); + + EditorGUILayout.PropertyField (flareColorA, new GUIContent("Tint Color")); + } + else if (lensflareMode.intValue == 2) { + // both + EditorGUILayout.PropertyField (hollyStretchWidth, new GUIContent("Stretch width")); + hollywoodFlareBlurIterations.intValue = EditorGUILayout.IntSlider ("Blur iterations", hollywoodFlareBlurIterations.intValue, 1, 4); + + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorA, new GUIContent("1st Color")); + EditorGUILayout.PropertyField (flareColorB, new GUIContent("2nd Color")); + EditorGUILayout.EndHorizontal (); + + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorC, new GUIContent("3rd Color")); + EditorGUILayout.PropertyField (flareColorD, new GUIContent("4th Color")); + EditorGUILayout.EndHorizontal (); + } + } + } else + lensflares.boolValue = false; // disable lens flares in simple tweak mode + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/BloomAndFlaresEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/BloomAndFlaresEditor.cs.meta new file mode 100644 index 0000000..a4f4e00 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/BloomAndFlaresEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4deca87cb459d1642ac8f734856ca84e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/BloomEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/BloomEditor.cs new file mode 100644 index 0000000..bbfd428 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/BloomEditor.cs @@ -0,0 +1,166 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(Bloom))] + class BloomEditor : Editor + { + SerializedProperty tweakMode; + SerializedProperty screenBlendMode; + + SerializedObject serObj; + + SerializedProperty hdr; + SerializedProperty quality; + SerializedProperty sepBlurSpread; + + SerializedProperty bloomIntensity; + SerializedProperty bloomThresholdColor; + SerializedProperty bloomThreshold; + SerializedProperty bloomBlurIterations; + + SerializedProperty hollywoodFlareBlurIterations; + + SerializedProperty lensflareMode; + SerializedProperty hollyStretchWidth; + SerializedProperty lensflareIntensity; + SerializedProperty flareRotation; + SerializedProperty lensFlareSaturation; + SerializedProperty lensflareThreshold; + SerializedProperty flareColorA; + SerializedProperty flareColorB; + SerializedProperty flareColorC; + SerializedProperty flareColorD; + + SerializedProperty lensFlareVignetteMask; + + void OnEnable () { + serObj = new SerializedObject (target); + + screenBlendMode = serObj.FindProperty("screenBlendMode"); + hdr = serObj.FindProperty("hdr"); + quality = serObj.FindProperty("quality"); + + sepBlurSpread = serObj.FindProperty("sepBlurSpread"); + + bloomIntensity = serObj.FindProperty("bloomIntensity"); + bloomThreshold = serObj.FindProperty("bloomThreshold"); + bloomThresholdColor = serObj.FindProperty("bloomThresholdColor"); + bloomBlurIterations = serObj.FindProperty("bloomBlurIterations"); + + lensflareMode = serObj.FindProperty("lensflareMode"); + hollywoodFlareBlurIterations = serObj.FindProperty("hollywoodFlareBlurIterations"); + hollyStretchWidth = serObj.FindProperty("hollyStretchWidth"); + lensflareIntensity = serObj.FindProperty("lensflareIntensity"); + lensflareThreshold = serObj.FindProperty("lensflareThreshold"); + lensFlareSaturation = serObj.FindProperty("lensFlareSaturation"); + flareRotation = serObj.FindProperty("flareRotation"); + flareColorA = serObj.FindProperty("flareColorA"); + flareColorB = serObj.FindProperty("flareColorB"); + flareColorC = serObj.FindProperty("flareColorC"); + flareColorD = serObj.FindProperty("flareColorD"); + lensFlareVignetteMask = serObj.FindProperty("lensFlareVignetteMask"); + + tweakMode = serObj.FindProperty("tweakMode"); + } + + + public override void OnInspectorGUI () { + serObj.Update(); + + EditorGUILayout.LabelField("Glow and Lens Flares for bright screen pixels", EditorStyles.miniLabel); + + EditorGUILayout.PropertyField (quality, new GUIContent("Quality", "High quality preserves high frequencies with bigger blurs and uses a better blending and down-/upsampling")); + + EditorGUILayout.Separator (); + + EditorGUILayout.PropertyField (tweakMode, new GUIContent("Mode")); + EditorGUILayout.PropertyField (screenBlendMode, new GUIContent("Blend")); + EditorGUILayout.PropertyField (hdr, new GUIContent("HDR")); + + EditorGUILayout.Separator (); + + // display info text when screen blend mode cannot be used + Camera cam = (target as Bloom).GetComponent(); + if (cam != null) { +#if UNITY_5_6_OR_NEWER + if (screenBlendMode.enumValueIndex==0 && ((cam.allowHDR && hdr.enumValueIndex==0) || (hdr.enumValueIndex==1))) { +#else + if (screenBlendMode.enumValueIndex==0 && ((cam.hdr && hdr.enumValueIndex==0) || (hdr.enumValueIndex==1))) { +#endif + EditorGUILayout.HelpBox("Screen blend is not supported in HDR. Using 'Add' instead.", MessageType.Info); + } + } + + EditorGUILayout.PropertyField (bloomIntensity, new GUIContent("Intensity")); + bloomThreshold.floatValue = EditorGUILayout.Slider ("Threshold", bloomThreshold.floatValue, -0.05f, 4.0f); + if (1 == tweakMode.intValue) { + EditorGUILayout.PropertyField(bloomThresholdColor, new GUIContent(" RGB Threshold")); + } + EditorGUILayout.Separator (); + + bloomBlurIterations.intValue = EditorGUILayout.IntSlider ("Blur Iterations", bloomBlurIterations.intValue, 1, 4); + sepBlurSpread.floatValue = EditorGUILayout.Slider (" Sample Distance", sepBlurSpread.floatValue, 0.1f, 10.0f); + EditorGUILayout.Separator (); + + if (1 == tweakMode.intValue) { + // further lens flare tweakings + if (0 != tweakMode.intValue) + EditorGUILayout.PropertyField (lensflareMode, new GUIContent("Lens Flares")); + else + lensflareMode.enumValueIndex = 0; + + EditorGUILayout.PropertyField (lensflareIntensity, new GUIContent(" Local Intensity", "0 disables lens flares entirely (optimization)")); + lensflareThreshold.floatValue = EditorGUILayout.Slider ("Threshold", lensflareThreshold.floatValue, 0.0f, 4.0f); + + if (Mathf.Abs(lensflareIntensity.floatValue) > Mathf.Epsilon) { + if (lensflareMode.intValue == 0) { + // ghosting + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorA, new GUIContent(" 1st Color")); + EditorGUILayout.PropertyField (flareColorB, new GUIContent(" 2nd Color")); + EditorGUILayout.EndHorizontal (); + + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorC, new GUIContent(" 3rd Color")); + EditorGUILayout.PropertyField (flareColorD, new GUIContent(" 4th Color")); + EditorGUILayout.EndHorizontal (); + } + else if (lensflareMode.intValue == 1) { + // hollywood + EditorGUILayout.PropertyField (hollyStretchWidth, new GUIContent(" Stretch width")); + EditorGUILayout.PropertyField (flareRotation, new GUIContent( " Rotation")); + hollywoodFlareBlurIterations.intValue = EditorGUILayout.IntSlider (" Blur Iterations", hollywoodFlareBlurIterations.intValue, 1, 4); + + EditorGUILayout.PropertyField (lensFlareSaturation, new GUIContent(" Saturation")); + EditorGUILayout.PropertyField (flareColorA, new GUIContent(" Tint Color")); + } + else if (lensflareMode.intValue == 2) { + // both + EditorGUILayout.PropertyField (hollyStretchWidth, new GUIContent(" Stretch width")); + hollywoodFlareBlurIterations.intValue = EditorGUILayout.IntSlider (" Blur Iterations", hollywoodFlareBlurIterations.intValue, 1, 4); + + EditorGUILayout.PropertyField (lensFlareSaturation, new GUIContent(" Saturation")); + + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorA, new GUIContent(" 1st Color")); + EditorGUILayout.PropertyField (flareColorB, new GUIContent(" 2nd Color")); + EditorGUILayout.EndHorizontal (); + + EditorGUILayout.BeginHorizontal (); + EditorGUILayout.PropertyField (flareColorC, new GUIContent(" 3rd Color")); + EditorGUILayout.PropertyField (flareColorD, new GUIContent(" 4th Color")); + EditorGUILayout.EndHorizontal (); + } + + EditorGUILayout.PropertyField(lensFlareVignetteMask, new GUIContent(" Mask", "This mask is needed to prevent lens flare artifacts")); + + } + } + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/BloomEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/BloomEditor.cs.meta new file mode 100644 index 0000000..ad4d3b3 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/BloomEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 43fcc28c40e404d4eabfc88b1dbda7b5 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/CameraMotionBlurEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/CameraMotionBlurEditor.cs new file mode 100644 index 0000000..bc1f5ff --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/CameraMotionBlurEditor.cs @@ -0,0 +1,99 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(CameraMotionBlur))] + class CameraMotionBlurEditor : Editor + { + SerializedObject serObj; + + SerializedProperty filterType; + SerializedProperty preview; + SerializedProperty previewScale; + SerializedProperty movementScale; + SerializedProperty jitter; + SerializedProperty rotationScale; + SerializedProperty maxVelocity; + SerializedProperty minVelocity; + SerializedProperty velocityScale; + SerializedProperty velocityDownsample; + SerializedProperty noiseTexture; + SerializedProperty showVelocity; + SerializedProperty showVelocityScale; + SerializedProperty excludeLayers; + + void OnEnable () { + serObj = new SerializedObject (target); + + filterType = serObj.FindProperty ("filterType"); + + preview = serObj.FindProperty ("preview"); + previewScale = serObj.FindProperty ("previewScale"); + + movementScale = serObj.FindProperty ("movementScale"); + rotationScale = serObj.FindProperty ("rotationScale"); + + maxVelocity = serObj.FindProperty ("maxVelocity"); + minVelocity = serObj.FindProperty ("minVelocity"); + + jitter = serObj.FindProperty ("jitter"); + + excludeLayers = serObj.FindProperty ("excludeLayers"); + + velocityScale = serObj.FindProperty ("velocityScale"); + velocityDownsample = serObj.FindProperty ("velocityDownsample"); + + noiseTexture = serObj.FindProperty ("noiseTexture"); + } + + + public override void OnInspectorGUI () { + serObj.Update (); + + EditorGUILayout.LabelField("Simulates camera based motion blur", EditorStyles.miniLabel); + + EditorGUILayout.PropertyField (filterType, new GUIContent("Technique")); + if (filterType.enumValueIndex == 3 && !(target as CameraMotionBlur).Dx11Support()) { + EditorGUILayout.HelpBox("DX11 mode not supported (need shader model 5)", MessageType.Info); + } + EditorGUILayout.PropertyField (velocityScale, new GUIContent(" Velocity Scale")); + if (filterType.enumValueIndex >= 2) { + EditorGUILayout.LabelField(" Tile size used during reconstruction filter:", EditorStyles.miniLabel); + EditorGUILayout.Slider(maxVelocity, 2.0f, 10.0f, new GUIContent(" Velocity Max")); + } + else + EditorGUILayout.Slider (maxVelocity, 2.0f, 10.0f, new GUIContent(" Velocity Max")); + EditorGUILayout.Slider(minVelocity, 0.0f, 10.0f, new GUIContent(" Velocity Min")); + + EditorGUILayout.Separator (); + + EditorGUILayout.LabelField("Technique Specific"); + + if (filterType.enumValueIndex == 0) { + // portal style motion blur + EditorGUILayout.PropertyField (rotationScale, new GUIContent(" Camera Rotation")); + EditorGUILayout.PropertyField (movementScale, new GUIContent(" Camera Movement")); + } + else { + // "plausible" blur or cheap, local blur + EditorGUILayout.PropertyField (excludeLayers, new GUIContent(" Exclude Layers")); + EditorGUILayout.PropertyField (velocityDownsample, new GUIContent(" Velocity Downsample")); + velocityDownsample.intValue = velocityDownsample.intValue < 1 ? 1 : velocityDownsample.intValue; + if (filterType.enumValueIndex >= 2) { // only display jitter for reconstruction + EditorGUILayout.PropertyField (noiseTexture, new GUIContent(" Sample Jitter")); + EditorGUILayout.Slider (jitter, 0.0f, 10.0f, new GUIContent(" Jitter Strength")); + } + } + + EditorGUILayout.Separator (); + + EditorGUILayout.PropertyField (preview, new GUIContent("Preview")); + if (preview.boolValue) + EditorGUILayout.PropertyField (previewScale, new GUIContent("")); + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/CameraMotionBlurEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/CameraMotionBlurEditor.cs.meta new file mode 100644 index 0000000..af66969 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/CameraMotionBlurEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 80cbbe1c107bf5e43a96347d3dfc2658 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionCurvesEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionCurvesEditor.cs new file mode 100644 index 0000000..f37adb0 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionCurvesEditor.cs @@ -0,0 +1,124 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(ColorCorrectionCurves))] + class ColorCorrectionCurvesEditor : Editor { + SerializedObject serObj; + + SerializedProperty mode; + + SerializedProperty redChannel; + SerializedProperty greenChannel; + SerializedProperty blueChannel; + + SerializedProperty useDepthCorrection; + + SerializedProperty depthRedChannel; + SerializedProperty depthGreenChannel; + SerializedProperty depthBlueChannel; + + SerializedProperty zCurveChannel; + + SerializedProperty saturation; + + SerializedProperty selectiveCc; + SerializedProperty selectiveFromColor; + SerializedProperty selectiveToColor; + + private bool applyCurveChanges = false; + + void OnEnable () { + serObj = new SerializedObject (target); + + mode = serObj.FindProperty ("mode"); + + saturation = serObj.FindProperty ("saturation"); + + redChannel = serObj.FindProperty ("redChannel"); + greenChannel = serObj.FindProperty ("greenChannel"); + blueChannel = serObj.FindProperty ("blueChannel"); + + useDepthCorrection = serObj.FindProperty ("useDepthCorrection"); + + zCurveChannel = serObj.FindProperty ("zCurve"); + + depthRedChannel = serObj.FindProperty ("depthRedChannel"); + depthGreenChannel = serObj.FindProperty ("depthGreenChannel"); + depthBlueChannel = serObj.FindProperty ("depthBlueChannel"); + + serObj.ApplyModifiedProperties (); + + selectiveCc = serObj.FindProperty ("selectiveCc"); + selectiveFromColor = serObj.FindProperty ("selectiveFromColor"); + selectiveToColor = serObj.FindProperty ("selectiveToColor"); + } + + void CurveGui ( string name, SerializedProperty animationCurve, Color color) { + // @NOTE: EditorGUILayout.CurveField is buggy and flickers, using PropertyField for now + //animationCurve.animationCurveValue = EditorGUILayout.CurveField (GUIContent (name), animationCurve.animationCurveValue, color, Rect (0.0f,0.0f,1.0f,1.0f)); + EditorGUILayout.PropertyField (animationCurve, new GUIContent (name)); + if (GUI.changed) + applyCurveChanges = true; + } + + void BeginCurves () { + applyCurveChanges = false; + } + + void ApplyCurves () { + if (applyCurveChanges) { + serObj.ApplyModifiedProperties (); + (serObj.targetObject as ColorCorrectionCurves).gameObject.SendMessage ("UpdateTextures"); + } + } + + + public override void OnInspectorGUI () { + serObj.Update (); + + GUILayout.Label ("Use curves to tweak RGB channel colors", EditorStyles.miniBoldLabel); + + saturation.floatValue = EditorGUILayout.Slider( "Saturation", saturation.floatValue, 0.0f, 5.0f); + + EditorGUILayout.PropertyField (mode, new GUIContent ("Mode")); + EditorGUILayout.Separator (); + + BeginCurves (); + + CurveGui (" Red", redChannel, Color.red); + CurveGui (" Green", greenChannel, Color.green); + CurveGui (" Blue", blueChannel, Color.blue); + + EditorGUILayout.Separator (); + + if (mode.intValue > 0) + useDepthCorrection.boolValue = true; + else + useDepthCorrection.boolValue = false; + + if (useDepthCorrection.boolValue) { + CurveGui (" Red (depth)", depthRedChannel, Color.red); + CurveGui (" Green (depth)", depthGreenChannel, Color.green); + CurveGui (" Blue (depth)", depthBlueChannel, Color.blue); + EditorGUILayout.Separator (); + CurveGui (" Blend Curve", zCurveChannel, Color.grey); + } + + EditorGUILayout.Separator (); + EditorGUILayout.PropertyField (selectiveCc, new GUIContent ("Selective")); + if (selectiveCc.boolValue) { + EditorGUILayout.PropertyField (selectiveFromColor, new GUIContent (" Key")); + EditorGUILayout.PropertyField (selectiveToColor, new GUIContent (" Target")); + } + + + ApplyCurves (); + + if (!applyCurveChanges) + serObj.ApplyModifiedProperties (); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionCurvesEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionCurvesEditor.cs.meta new file mode 100644 index 0000000..b1c7fa3 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionCurvesEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a4a9489f73e4f0344ab3fc97bdf5170b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionLookupEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionLookupEditor.cs new file mode 100644 index 0000000..4d6c4bc --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionLookupEditor.cs @@ -0,0 +1,90 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(ColorCorrectionLookup))] + class ColorCorrectionLookupEditor : Editor + { + SerializedObject serObj; + + void OnEnable () { + serObj = new SerializedObject (target); + } + + private Texture2D tempClutTex2D; + + + public override void OnInspectorGUI () { + serObj.Update (); + + EditorGUILayout.LabelField("Converts textures into color lookup volumes (for grading)", EditorStyles.miniLabel); + + //EditorGUILayout.LabelField("Change Lookup Texture (LUT):"); + //EditorGUILayout.BeginHorizontal (); + //Rect r = GUILayoutUtility.GetAspectRect(1.0ff); + + Rect r; Texture2D t; + + //EditorGUILayout.Space(); + tempClutTex2D = EditorGUILayout.ObjectField (" Based on", tempClutTex2D, typeof(Texture2D), false) as Texture2D; + if (tempClutTex2D == null) { + t = AssetDatabase.LoadMainAssetAtPath(((ColorCorrectionLookup)target).basedOnTempTex) as Texture2D; + if (t) tempClutTex2D = t; + } + + Texture2D tex = tempClutTex2D; + + if (tex && (target as ColorCorrectionLookup).basedOnTempTex != AssetDatabase.GetAssetPath(tex)) + { + EditorGUILayout.Separator(); + if (!(target as ColorCorrectionLookup).ValidDimensions(tex)) + { + EditorGUILayout.HelpBox ("Invalid texture dimensions!\nPick another texture or adjust dimension to e.g. 256x16.", MessageType.Warning); + } + else if (GUILayout.Button ("Convert and Apply")) + { + string path = AssetDatabase.GetAssetPath (tex); + TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter; + bool doImport = textureImporter.isReadable == false; + if (textureImporter.mipmapEnabled == true) { + doImport = true; + } + if (textureImporter.textureCompression != TextureImporterCompression.Uncompressed) { + doImport = true; + } + + if (doImport) + { + textureImporter.isReadable = true; + textureImporter.mipmapEnabled = false; + textureImporter.textureCompression = TextureImporterCompression.Uncompressed; + AssetDatabase.ImportAsset (path, ImportAssetOptions.ForceUpdate); + //tex = AssetDatabase.LoadMainAssetAtPath(path); + } + + (target as ColorCorrectionLookup).Convert(tex, path); + } + } + + if ((target as ColorCorrectionLookup).basedOnTempTex != "") + { + EditorGUILayout.HelpBox("Using " + (target as ColorCorrectionLookup).basedOnTempTex, MessageType.Info); + t = AssetDatabase.LoadMainAssetAtPath(((ColorCorrectionLookup)target).basedOnTempTex) as Texture2D; + if (t) { + r = GUILayoutUtility.GetLastRect(); + r = GUILayoutUtility.GetRect(r.width, 20); + r.x += r.width * 0.05f/2.0f; + r.width *= 0.95f; + GUI.DrawTexture (r, t); + GUILayoutUtility.GetRect(r.width, 4); + } + } + + //EditorGUILayout.EndHorizontal (); + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionLookupEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionLookupEditor.cs.meta new file mode 100644 index 0000000..9286d0e --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/ColorCorrectionLookupEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 66c17be95fbf398439ea09f8892a8b43 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/CreaseShadingEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/CreaseShadingEditor.cs new file mode 100644 index 0000000..da5d62d --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/CreaseShadingEditor.cs @@ -0,0 +1,60 @@ +using System; +using UnityEditor; +using UnityEditor.AnimatedValues; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor(typeof(CreaseShading))] + class CreaseShadingEditor : Editor { + SerializedObject serObj; + + SerializedProperty m_intensity; + SerializedProperty m_softness; + SerializedProperty m_spread; + + AnimBool m_showSoftnessWarning = new AnimBool(); + AnimBool m_showSpreadWarning = new AnimBool(); + + private bool softnessWarningValue { get { return m_softness.intValue > 4; } } + private bool spreadWarningValue { get { return m_spread.floatValue > 4; } } + + void OnEnable () { + serObj = new SerializedObject (target); + + m_intensity = serObj.FindProperty("intensity"); + m_softness = serObj.FindProperty("softness"); + m_spread = serObj.FindProperty("spread"); + + m_showSoftnessWarning.valueChanged.AddListener(Repaint); + m_showSpreadWarning.valueChanged.AddListener(Repaint); + + m_showSoftnessWarning.value = softnessWarningValue; + m_showSpreadWarning.value = spreadWarningValue; + } + + public override void OnInspectorGUI () { + serObj.Update (); + + EditorGUILayout.Slider(m_intensity, -5.0f, 5.0f, new GUIContent("Intensity")); + + EditorGUILayout.IntSlider(m_softness, 0, 15, new GUIContent("Softness")); + m_showSoftnessWarning.target = softnessWarningValue; + if (EditorGUILayout.BeginFadeGroup(m_showSoftnessWarning.faded)) + { + EditorGUILayout.HelpBox("High Softness value might reduce performance.", MessageType.Warning, false); + } + EditorGUILayout.EndFadeGroup(); + + EditorGUILayout.Slider(m_spread, 0.0f, 50.0f, new GUIContent("Spread")); + m_showSpreadWarning.target = spreadWarningValue; + if (EditorGUILayout.BeginFadeGroup(m_showSpreadWarning.faded)) + { + EditorGUILayout.HelpBox("High Spread value might introduce visual artifacts.", MessageType.Warning, false); + } + EditorGUILayout.EndFadeGroup(); + + serObj.ApplyModifiedProperties (); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/CreaseShadingEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/CreaseShadingEditor.cs.meta new file mode 100644 index 0000000..50c7d7f --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/CreaseShadingEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6788af605d2f1244789565913bb4e7f6 +timeCreated: 1434032656 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldDeprecatedEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldDeprecatedEditor.cs new file mode 100644 index 0000000..b1e5b84 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldDeprecatedEditor.cs @@ -0,0 +1,149 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(DepthOfFieldDeprecated))] + class DepthOfFieldDeprecatedEditor : Editor + { + SerializedObject serObj; + + SerializedProperty simpleTweakMode; + + SerializedProperty focalPoint; + SerializedProperty smoothness; + + SerializedProperty focalSize; + + SerializedProperty focalZDistance; + SerializedProperty focalStartCurve; + SerializedProperty focalEndCurve; + + SerializedProperty visualizeCoc; + + SerializedProperty resolution; + SerializedProperty quality; + + SerializedProperty objectFocus; + + SerializedProperty bokeh; + SerializedProperty bokehScale; + SerializedProperty bokehIntensity; + SerializedProperty bokehThresholdLuminance; + SerializedProperty bokehThresholdContrast; + SerializedProperty bokehDownsample; + SerializedProperty bokehTexture; + SerializedProperty bokehDestination; + + SerializedProperty bluriness; + SerializedProperty maxBlurSpread; + SerializedProperty foregroundBlurExtrude; + + void OnEnable () { + serObj = new SerializedObject (target); + + simpleTweakMode = serObj.FindProperty ("simpleTweakMode"); + + // simple tweak mode + focalPoint = serObj.FindProperty ("focalPoint"); + smoothness = serObj.FindProperty ("smoothness"); + + // complex tweak mode + focalZDistance = serObj.FindProperty ("focalZDistance"); + focalStartCurve = serObj.FindProperty ("focalZStartCurve"); + focalEndCurve = serObj.FindProperty ("focalZEndCurve"); + focalSize = serObj.FindProperty ("focalSize"); + + visualizeCoc = serObj.FindProperty ("visualize"); + + objectFocus = serObj.FindProperty ("objectFocus"); + + resolution = serObj.FindProperty ("resolution"); + quality = serObj.FindProperty ("quality"); + bokehThresholdContrast = serObj.FindProperty ("bokehThresholdContrast"); + bokehThresholdLuminance = serObj.FindProperty ("bokehThresholdLuminance"); + + bokeh = serObj.FindProperty ("bokeh"); + bokehScale = serObj.FindProperty ("bokehScale"); + bokehIntensity = serObj.FindProperty ("bokehIntensity"); + bokehDownsample = serObj.FindProperty ("bokehDownsample"); + bokehTexture = serObj.FindProperty ("bokehTexture"); + bokehDestination = serObj.FindProperty ("bokehDestination"); + + bluriness = serObj.FindProperty ("bluriness"); + maxBlurSpread = serObj.FindProperty ("maxBlurSpread"); + foregroundBlurExtrude = serObj.FindProperty ("foregroundBlurExtrude"); + } + + + public override void OnInspectorGUI () { + serObj.Update (); + + GameObject go = (target as DepthOfFieldDeprecated).gameObject; + + if (!go) + return; + + if (!go.GetComponent()) + return; + + if (simpleTweakMode.boolValue) + GUILayout.Label ("Current: "+go.GetComponent().name+", near "+go.GetComponent().nearClipPlane+", far: "+go.GetComponent().farClipPlane+", focal: "+focalPoint.floatValue, EditorStyles.miniBoldLabel); + else + GUILayout.Label ("Current: "+go.GetComponent().name+", near "+go.GetComponent().nearClipPlane+", far: "+go.GetComponent().farClipPlane+", focal: "+focalZDistance.floatValue, EditorStyles.miniBoldLabel); + + EditorGUILayout.PropertyField (resolution, new GUIContent("Resolution")); + EditorGUILayout.PropertyField (quality, new GUIContent("Quality")); + + EditorGUILayout.PropertyField (simpleTweakMode, new GUIContent("Simple tweak")); + EditorGUILayout.PropertyField (visualizeCoc, new GUIContent("Visualize focus")); + EditorGUILayout.PropertyField (bokeh, new GUIContent("Enable bokeh")); + + + EditorGUILayout.Separator (); + + GUILayout.Label ("Focal Settings", EditorStyles.boldLabel); + + if (simpleTweakMode.boolValue) { + focalPoint.floatValue = EditorGUILayout.Slider ("Focal distance", focalPoint.floatValue, go.GetComponent().nearClipPlane, go.GetComponent().farClipPlane); + EditorGUILayout.PropertyField (objectFocus, new GUIContent("Transform")); + EditorGUILayout.PropertyField (smoothness, new GUIContent("Smoothness")); + focalSize.floatValue = EditorGUILayout.Slider ("Focal size", focalSize.floatValue, 0.0f, (go.GetComponent().farClipPlane - go.GetComponent().nearClipPlane)); + } + else { + focalZDistance.floatValue = EditorGUILayout.Slider ("Distance", focalZDistance.floatValue, go.GetComponent().nearClipPlane, go.GetComponent().farClipPlane); + EditorGUILayout.PropertyField (objectFocus, new GUIContent("Transform")); + focalSize.floatValue = EditorGUILayout.Slider ("Size", focalSize.floatValue, 0.0f, (go.GetComponent().farClipPlane - go.GetComponent().nearClipPlane)); + focalStartCurve.floatValue = EditorGUILayout.Slider ("Start curve", focalStartCurve.floatValue, 0.05f, 20.0f); + focalEndCurve.floatValue = EditorGUILayout.Slider ("End curve", focalEndCurve.floatValue, 0.05f, 20.0f); + } + + EditorGUILayout.Separator (); + + GUILayout.Label ("Blur (Fore- and Background)", EditorStyles.boldLabel); + EditorGUILayout.PropertyField (bluriness, new GUIContent("Blurriness")); + EditorGUILayout.PropertyField (maxBlurSpread, new GUIContent("Blur spread")); + + if (quality.enumValueIndex > 0) { + EditorGUILayout.PropertyField (foregroundBlurExtrude, new GUIContent("Foreground size")); + } + + EditorGUILayout.Separator (); + + if (bokeh.boolValue) { + EditorGUILayout.Separator (); + GUILayout.Label ("Bokeh Settings", EditorStyles.boldLabel); + EditorGUILayout.PropertyField (bokehDestination, new GUIContent("Destination")); + bokehIntensity.floatValue = EditorGUILayout.Slider ("Intensity", bokehIntensity.floatValue, 0.0f, 1.0f); + bokehThresholdLuminance.floatValue = EditorGUILayout.Slider ("Min luminance", bokehThresholdLuminance.floatValue, 0.0f, 0.99f); + bokehThresholdContrast.floatValue = EditorGUILayout.Slider ("Min contrast", bokehThresholdContrast.floatValue, 0.0f, 0.25f); + bokehDownsample.intValue = EditorGUILayout.IntSlider ("Downsample", bokehDownsample.intValue, 1, 3); + bokehScale.floatValue = EditorGUILayout.Slider ("Size scale", bokehScale.floatValue, 0.0f, 20.0f); + EditorGUILayout.PropertyField (bokehTexture , new GUIContent("Texture mask")); + } + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldDeprecatedEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldDeprecatedEditor.cs.meta new file mode 100644 index 0000000..cf22631 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldDeprecatedEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 943c59645eb905144a0990b57e13a6f9 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldEditor.cs new file mode 100644 index 0000000..acd7aca --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldEditor.cs @@ -0,0 +1,161 @@ +using System; +using UnityEditor; +using UnityEditor.AnimatedValues; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor(typeof(DepthOfField))] + class DepthOfFieldEditor : Editor + { + SerializedObject serObj; + + SerializedProperty visualizeFocus; + SerializedProperty focalLength; + SerializedProperty focalSize; + SerializedProperty aperture; + SerializedProperty focalTransform; + SerializedProperty maxBlurSize; + SerializedProperty highResolution; + + SerializedProperty blurType; + SerializedProperty blurSampleCount; + + SerializedProperty nearBlur; + SerializedProperty foregroundOverlap; + + SerializedProperty dx11BokehThreshold; + SerializedProperty dx11SpawnHeuristic; + SerializedProperty dx11BokehTexture; + SerializedProperty dx11BokehScale; + SerializedProperty dx11BokehIntensity; + + AnimBool showFocalDistance = new AnimBool(); + AnimBool showDiscBlurSettings = new AnimBool(); + AnimBool showDX11BlurSettings = new AnimBool(); + AnimBool showNearBlurOverlapSize = new AnimBool(); + + bool useFocalDistance { get { return focalTransform.objectReferenceValue == null; } } + bool useDiscBlur { get { return blurType.enumValueIndex < 1; } } + bool useDX11Blur { get { return blurType.enumValueIndex > 0; } } + bool useNearBlur { get { return nearBlur.boolValue; } } + + + void OnEnable() + { + serObj = new SerializedObject(target); + + visualizeFocus = serObj.FindProperty("visualizeFocus"); + + focalLength = serObj.FindProperty("focalLength"); + focalSize = serObj.FindProperty("focalSize"); + aperture = serObj.FindProperty("aperture"); + focalTransform = serObj.FindProperty("focalTransform"); + maxBlurSize = serObj.FindProperty("maxBlurSize"); + highResolution = serObj.FindProperty("highResolution"); + + blurType = serObj.FindProperty("blurType"); + blurSampleCount = serObj.FindProperty("blurSampleCount"); + + nearBlur = serObj.FindProperty("nearBlur"); + foregroundOverlap = serObj.FindProperty("foregroundOverlap"); + + dx11BokehThreshold = serObj.FindProperty("dx11BokehThreshold"); + dx11SpawnHeuristic = serObj.FindProperty("dx11SpawnHeuristic"); + dx11BokehTexture = serObj.FindProperty("dx11BokehTexture"); + dx11BokehScale = serObj.FindProperty("dx11BokehScale"); + dx11BokehIntensity = serObj.FindProperty("dx11BokehIntensity"); + + InitializedAnimBools(); + } + + void InitializedAnimBools() + { + showFocalDistance.valueChanged.AddListener(Repaint); + showFocalDistance.value = useFocalDistance; + + showDiscBlurSettings.valueChanged.AddListener(Repaint); + showDiscBlurSettings.value = useDiscBlur; + + showDX11BlurSettings.valueChanged.AddListener(Repaint); + showDX11BlurSettings.value = useDX11Blur; + + showNearBlurOverlapSize.valueChanged.AddListener(Repaint); + showNearBlurOverlapSize.value = useNearBlur; + } + + + void UpdateAnimBoolTargets() + { + showFocalDistance.target = useFocalDistance; + showDiscBlurSettings.target = useDiscBlur; + showDX11BlurSettings.target = useDX11Blur; + showNearBlurOverlapSize.target = useNearBlur; + } + + + public override void OnInspectorGUI() + { + serObj.Update(); + + UpdateAnimBoolTargets(); + + EditorGUILayout.LabelField("Simulates camera lens defocus", EditorStyles.miniLabel); + + GUILayout.Label("Focal Settings"); + EditorGUILayout.PropertyField(visualizeFocus, new GUIContent(" Visualize")); + EditorGUILayout.PropertyField(focalTransform, new GUIContent(" Focus on Transform")); + + if (EditorGUILayout.BeginFadeGroup(showFocalDistance.faded)) + { + EditorGUILayout.PropertyField(focalLength, new GUIContent(" Focal Distance")); + } + EditorGUILayout.EndFadeGroup(); + + EditorGUILayout.Slider(focalSize, 0.0f, 2.0f, new GUIContent(" Focal Size")); + EditorGUILayout.Slider(aperture, 0.0f, 1.0f, new GUIContent(" Aperture")); + + EditorGUILayout.Separator(); + + EditorGUILayout.PropertyField(blurType, new GUIContent("Defocus Type")); + + if (!(target as DepthOfField).Dx11Support() && blurType.enumValueIndex > 0) + { + EditorGUILayout.HelpBox("DX11 mode not supported (need shader model 5)", MessageType.Info); + } + + if (EditorGUILayout.BeginFadeGroup(showDiscBlurSettings.faded)) + { + EditorGUILayout.PropertyField(blurSampleCount, new GUIContent(" Sample Count")); + } + EditorGUILayout.EndFadeGroup(); + + EditorGUILayout.Slider(maxBlurSize, 0.1f, 2.0f, new GUIContent(" Max Blur Distance")); + EditorGUILayout.PropertyField(highResolution, new GUIContent(" High Resolution")); + + EditorGUILayout.Separator(); + + EditorGUILayout.PropertyField(nearBlur, new GUIContent("Near Blur")); + if (EditorGUILayout.BeginFadeGroup(showNearBlurOverlapSize.faded)) + { + EditorGUILayout.Slider(foregroundOverlap, 0.1f, 2.0f, new GUIContent(" Overlap Size")); + } + EditorGUILayout.EndFadeGroup(); + + EditorGUILayout.Separator(); + + if (EditorGUILayout.BeginFadeGroup(showDX11BlurSettings.faded)) + { + GUILayout.Label("DX11 Bokeh Settings"); + EditorGUILayout.PropertyField(dx11BokehTexture, new GUIContent(" Bokeh Texture")); + EditorGUILayout.Slider(dx11BokehScale, 0.0f, 50.0f, new GUIContent(" Bokeh Scale")); + EditorGUILayout.Slider(dx11BokehIntensity, 0.0f, 100.0f, new GUIContent(" Bokeh Intensity")); + EditorGUILayout.Slider(dx11BokehThreshold, 0.0f, 1.0f, new GUIContent(" Min Luminance")); + EditorGUILayout.Slider(dx11SpawnHeuristic, 0.01f, 1.0f, new GUIContent(" Spawn Heuristic")); + } + EditorGUILayout.EndFadeGroup(); + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldEditor.cs.meta new file mode 100644 index 0000000..8d85a2e --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/DepthOfFieldEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 427fdf36119bab44a9131abd19b90f57 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/EdgeDetectionEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/EdgeDetectionEditor.cs new file mode 100644 index 0000000..9d2d7a5 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/EdgeDetectionEditor.cs @@ -0,0 +1,72 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(EdgeDetection))] + class EdgeDetectionEditor : Editor + { + SerializedObject serObj; + + SerializedProperty mode; + SerializedProperty sensitivityDepth; + SerializedProperty sensitivityNormals; + + SerializedProperty lumThreshold; + + SerializedProperty edgesOnly; + SerializedProperty edgesOnlyBgColor; + + SerializedProperty edgeExp; + SerializedProperty sampleDist; + + + void OnEnable () { + serObj = new SerializedObject (target); + + mode = serObj.FindProperty("mode"); + + sensitivityDepth = serObj.FindProperty("sensitivityDepth"); + sensitivityNormals = serObj.FindProperty("sensitivityNormals"); + + lumThreshold = serObj.FindProperty("lumThreshold"); + + edgesOnly = serObj.FindProperty("edgesOnly"); + edgesOnlyBgColor = serObj.FindProperty("edgesOnlyBgColor"); + + edgeExp = serObj.FindProperty("edgeExp"); + sampleDist = serObj.FindProperty("sampleDist"); + } + + + public override void OnInspectorGUI () { + serObj.Update (); + + GUILayout.Label("Detects spatial differences and converts into black outlines", EditorStyles.miniBoldLabel); + EditorGUILayout.PropertyField (mode, new GUIContent("Mode")); + + if (mode.intValue < 2) { + EditorGUILayout.PropertyField (sensitivityDepth, new GUIContent(" Depth Sensitivity")); + EditorGUILayout.PropertyField (sensitivityNormals, new GUIContent(" Normals Sensitivity")); + } + else if (mode.intValue < 4) { + EditorGUILayout.PropertyField (edgeExp, new GUIContent(" Edge Exponent")); + } + else { + // lum based mode + EditorGUILayout.PropertyField (lumThreshold, new GUIContent(" Luminance Threshold")); + } + + EditorGUILayout.PropertyField (sampleDist, new GUIContent(" Sample Distance")); + + EditorGUILayout.Separator (); + + GUILayout.Label ("Background Options"); + edgesOnly.floatValue = EditorGUILayout.Slider (" Edges only", edgesOnly.floatValue, 0.0f, 1.0f); + EditorGUILayout.PropertyField (edgesOnlyBgColor, new GUIContent (" Color")); + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/EdgeDetectionEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/EdgeDetectionEditor.cs.meta new file mode 100644 index 0000000..3ec10ca --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/EdgeDetectionEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b5f1618d14cd80f4da910f00b04af37f +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/NoiseAndGrainEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/NoiseAndGrainEditor.cs new file mode 100644 index 0000000..5b31336 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/NoiseAndGrainEditor.cs @@ -0,0 +1,111 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof( NoiseAndGrain))] + class NoiseAndGrainEditor : Editor + { + SerializedObject serObj; + + SerializedProperty intensityMultiplier; + SerializedProperty generalIntensity; + SerializedProperty blackIntensity; + SerializedProperty whiteIntensity; + SerializedProperty midGrey; + + SerializedProperty dx11Grain; + SerializedProperty softness; + SerializedProperty monochrome; + + SerializedProperty intensities; + SerializedProperty tiling; + SerializedProperty monochromeTiling; + + SerializedProperty noiseTexture; + SerializedProperty filterMode; + + void OnEnable () { + serObj = new SerializedObject (target); + + intensityMultiplier = serObj.FindProperty("intensityMultiplier"); + generalIntensity = serObj.FindProperty("generalIntensity"); + blackIntensity = serObj.FindProperty("blackIntensity"); + whiteIntensity = serObj.FindProperty("whiteIntensity"); + midGrey = serObj.FindProperty("midGrey"); + + dx11Grain = serObj.FindProperty("dx11Grain"); + softness = serObj.FindProperty("softness"); + monochrome = serObj.FindProperty("monochrome"); + + intensities = serObj.FindProperty("intensities"); + tiling = serObj.FindProperty("tiling"); + monochromeTiling = serObj.FindProperty("monochromeTiling"); + + noiseTexture = serObj.FindProperty("noiseTexture"); + filterMode = serObj.FindProperty("filterMode"); + } + + + public override void OnInspectorGUI () { + serObj.Update(); + + EditorGUILayout.LabelField("Overlays animated noise patterns", EditorStyles.miniLabel); + + EditorGUILayout.PropertyField(dx11Grain, new GUIContent("DirectX 11 Grain")); + + if (dx11Grain.boolValue && !(target as NoiseAndGrain).Dx11Support()) { + EditorGUILayout.HelpBox("DX11 mode not supported (need DX11 GPU and enable DX11 in PlayerSettings)", MessageType.Info); + } + + EditorGUILayout.PropertyField(monochrome, new GUIContent("Monochrome")); + + EditorGUILayout.Separator(); + + EditorGUILayout.Slider(intensityMultiplier, 0.0f, 10.0f, new GUIContent("Intensity Multiplier")); + EditorGUILayout.Slider(generalIntensity, 0.0f, 1.0f, new GUIContent(" General")); + EditorGUILayout.Slider(blackIntensity, 0.0f, 1.0f, new GUIContent(" Black Boost")); + EditorGUILayout.Slider(whiteIntensity, 0.0f, 1.0f, new GUIContent(" White Boost")); + midGrey.floatValue = EditorGUILayout.Slider( new GUIContent(" Mid Grey (for Boost)"), midGrey.floatValue, 0.0f, 1.0f); + if (monochrome.boolValue == false) { + Color c = new Color(intensities.vector3Value.x,intensities.vector3Value.y,intensities.vector3Value.z,1.0f); + c = EditorGUILayout.ColorField(new GUIContent(" Color Weights"), c); + intensities.vector3Value = new Vector3(c.r, c.g, c.b); + } + + if (!dx11Grain.boolValue) { + EditorGUILayout.Separator(); + + EditorGUILayout.LabelField("Noise Shape"); + EditorGUILayout.PropertyField(noiseTexture, new GUIContent(" Texture")); + EditorGUILayout.PropertyField(filterMode, new GUIContent(" Filter")); + } + else { + EditorGUILayout.Separator(); + EditorGUILayout.LabelField("Noise Shape"); + } + + softness.floatValue = EditorGUILayout.Slider( new GUIContent(" Softness"),softness.floatValue, 0.0f, 0.99f); + + if (!dx11Grain.boolValue) { + EditorGUILayout.Separator(); + EditorGUILayout.LabelField("Advanced"); + + if (monochrome.boolValue == false) + { + Vector3 temp = tiling.vector3Value; + temp.x = EditorGUILayout.FloatField(new GUIContent(" Tiling (Red)"), tiling.vector3Value.x); + temp.y = EditorGUILayout.FloatField(new GUIContent(" Tiling (Green)"), tiling.vector3Value.y); + temp.z = EditorGUILayout.FloatField(new GUIContent(" Tiling (Blue)"), tiling.vector3Value.z); + tiling.vector3Value = temp; + } + else { + EditorGUILayout.PropertyField(monochromeTiling, new GUIContent(" Tiling")); + } + } + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/NoiseAndGrainEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/NoiseAndGrainEditor.cs.meta new file mode 100644 index 0000000..1ca666a --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/NoiseAndGrainEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: abd63abcc46fbcb4588164b671b52d3b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/SunShaftsEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/SunShaftsEditor.cs new file mode 100644 index 0000000..51deae7 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/SunShaftsEditor.cs @@ -0,0 +1,105 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(SunShafts))] + class SunShaftsEditor : Editor + { + SerializedObject serObj; + + SerializedProperty sunTransform; + SerializedProperty radialBlurIterations; + SerializedProperty sunColor; + SerializedProperty sunThreshold; + SerializedProperty sunShaftBlurRadius; + SerializedProperty sunShaftIntensity; + SerializedProperty useDepthTexture; + SerializedProperty resolution; + SerializedProperty screenBlendMode; + SerializedProperty maxRadius; + + void OnEnable () { + serObj = new SerializedObject (target); + + screenBlendMode = serObj.FindProperty("screenBlendMode"); + + sunTransform = serObj.FindProperty("sunTransform"); + sunColor = serObj.FindProperty("sunColor"); + sunThreshold = serObj.FindProperty("sunThreshold"); + + sunShaftBlurRadius = serObj.FindProperty("sunShaftBlurRadius"); + radialBlurIterations = serObj.FindProperty("radialBlurIterations"); + + sunShaftIntensity = serObj.FindProperty("sunShaftIntensity"); + + resolution = serObj.FindProperty("resolution"); + + maxRadius = serObj.FindProperty("maxRadius"); + + useDepthTexture = serObj.FindProperty("useDepthTexture"); + } + + + public override void OnInspectorGUI () { + serObj.Update (); + + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.PropertyField (useDepthTexture, new GUIContent ("Rely on Z Buffer?")); + if ((target as SunShafts).GetComponent()) + GUILayout.Label("Current camera mode: "+ (target as SunShafts).GetComponent().depthTextureMode, EditorStyles.miniBoldLabel); + + EditorGUILayout.EndHorizontal(); + + // depth buffer need + /* + bool newVal = useDepthTexture.boolValue; + if (newVal != oldVal) { + if (newVal) + (target as SunShafts).camera.depthTextureMode |= DepthTextureMode.Depth; + else + (target as SunShafts).camera.depthTextureMode &= ~DepthTextureMode.Depth; + } + */ + + EditorGUILayout.PropertyField (resolution, new GUIContent("Resolution")); + EditorGUILayout.PropertyField (screenBlendMode, new GUIContent("Blend mode")); + + EditorGUILayout.Separator (); + + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.PropertyField (sunTransform, new GUIContent("Shafts caster", "Chose a transform that acts as a root point for the produced sun shafts")); + if ((target as SunShafts).sunTransform && (target as SunShafts).GetComponent()) { + if (GUILayout.Button("Center on " + (target as SunShafts).GetComponent().name)) { + if (EditorUtility.DisplayDialog ("Move sun shafts source?", "The SunShafts caster named "+ (target as SunShafts).sunTransform.name +"\n will be centered along "+(target as SunShafts).GetComponent().name+". Are you sure? ", "Please do", "Don't")) { + Ray ray = (target as SunShafts).GetComponent().ViewportPointToRay(new Vector3(0.5f,0.5f,0)); + (target as SunShafts).sunTransform.position = ray.origin + ray.direction * 500.0f; + (target as SunShafts).sunTransform.LookAt ((target as SunShafts).transform); + } + } + } + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Separator (); + + EditorGUILayout.PropertyField (sunThreshold, new GUIContent ("Threshold color")); + EditorGUILayout.PropertyField (sunColor, new GUIContent ("Shafts color")); + maxRadius.floatValue = 1.0f - EditorGUILayout.Slider ("Distance falloff", 1.0f - maxRadius.floatValue, 0.1f, 1.0f); + + EditorGUILayout.Separator (); + + sunShaftBlurRadius.floatValue = EditorGUILayout.Slider ("Blur size", sunShaftBlurRadius.floatValue, 1.0f, 10.0f); + radialBlurIterations.intValue = EditorGUILayout.IntSlider ("Blur iterations", radialBlurIterations.intValue, 1, 3); + + EditorGUILayout.Separator (); + + EditorGUILayout.PropertyField (sunShaftIntensity, new GUIContent("Intensity")); + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/SunShaftsEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/SunShaftsEditor.cs.meta new file mode 100644 index 0000000..b8d901f --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/SunShaftsEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 54f6f6313f2aecc4d81035ec0031e313 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/TonemappingEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/TonemappingEditor.cs new file mode 100644 index 0000000..302bf9a --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/TonemappingEditor.cs @@ -0,0 +1,85 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(Tonemapping))] + class TonemappingEditor : Editor + { + SerializedObject serObj; + + SerializedProperty type; + + // CURVE specific parameter + SerializedProperty remapCurve; + + SerializedProperty exposureAdjustment; + + // REINHARD specific parameter + SerializedProperty middleGrey; + SerializedProperty white; + SerializedProperty adaptionSpeed; + SerializedProperty adaptiveTextureSize; + + void OnEnable () { + serObj = new SerializedObject (target); + + type = serObj.FindProperty ("type"); + remapCurve = serObj.FindProperty ("remapCurve"); + exposureAdjustment = serObj.FindProperty ("exposureAdjustment"); + middleGrey = serObj.FindProperty ("middleGrey"); + white = serObj.FindProperty ("white"); + adaptionSpeed = serObj.FindProperty ("adaptionSpeed"); + adaptiveTextureSize = serObj.FindProperty("adaptiveTextureSize"); + } + + + public override void OnInspectorGUI () { + serObj.Update (); + + GUILayout.Label("Mapping HDR to LDR ranges since 1982", EditorStyles.miniLabel); + + Camera cam = (target as Tonemapping).GetComponent(); + if (cam != null) { +#if UNITY_5_6_OR_NEWER + if (!cam.allowHDR) { +#else + if (!cam.hdr) { +#endif + EditorGUILayout.HelpBox("The camera is not HDR enabled. This will likely break the Tonemapper.", MessageType.Warning); + } + else if (!(target as Tonemapping).validRenderTextureFormat) { + EditorGUILayout.HelpBox("The input to Tonemapper is not in HDR. Make sure that all effects prior to this are executed in HDR.", MessageType.Warning); + } + } + + EditorGUILayout.PropertyField (type, new GUIContent ("Technique")); + + if (type.enumValueIndex == (int) Tonemapping.TonemapperType.UserCurve) { + EditorGUILayout.PropertyField (remapCurve, new GUIContent ("Remap curve", "Specify the mapping of luminances yourself")); + } else if (type.enumValueIndex == (int) Tonemapping.TonemapperType.SimpleReinhard) { + EditorGUILayout.PropertyField (exposureAdjustment, new GUIContent ("Exposure", "Exposure adjustment")); + } else if (type.enumValueIndex == (int) Tonemapping.TonemapperType.Hable) { + EditorGUILayout.PropertyField (exposureAdjustment, new GUIContent ("Exposure", "Exposure adjustment")); + } else if (type.enumValueIndex == (int) Tonemapping.TonemapperType.Photographic) { + EditorGUILayout.PropertyField (exposureAdjustment, new GUIContent ("Exposure", "Exposure adjustment")); + } else if (type.enumValueIndex == (int) Tonemapping.TonemapperType.OptimizedHejiDawson) { + EditorGUILayout.PropertyField (exposureAdjustment, new GUIContent ("Exposure", "Exposure adjustment")); + } else if (type.enumValueIndex == (int) Tonemapping.TonemapperType.AdaptiveReinhard) { + EditorGUILayout.PropertyField (middleGrey, new GUIContent ("Middle grey", "Middle grey defines the average luminance thus brightening or darkening the entire image.")); + EditorGUILayout.PropertyField (white, new GUIContent ("White", "Smallest luminance value that will be mapped to white")); + EditorGUILayout.PropertyField (adaptionSpeed, new GUIContent ("Adaption Speed", "Speed modifier for the automatic adaption")); + EditorGUILayout.PropertyField (adaptiveTextureSize, new GUIContent ("Texture size", "Defines the amount of downsamples needed.")); + } else if (type.enumValueIndex == (int) Tonemapping.TonemapperType.AdaptiveReinhardAutoWhite) { + EditorGUILayout.PropertyField (middleGrey, new GUIContent ("Middle grey", "Middle grey defines the average luminance thus brightening or darkening the entire image.")); + EditorGUILayout.PropertyField (adaptionSpeed, new GUIContent ("Adaption Speed", "Speed modifier for the automatic adaption")); + EditorGUILayout.PropertyField (adaptiveTextureSize, new GUIContent ("Texture size", "Defines the amount of downsamples needed.")); + } + + GUILayout.Label("All following effects will use LDR color buffers", EditorStyles.miniBoldLabel); + + serObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/TonemappingEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/TonemappingEditor.cs.meta new file mode 100644 index 0000000..40c242a --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/TonemappingEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0f7cab214f141f642b87a5bdbd14653e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Editor/ImageEffects/VignetteAndChromaticAberrationEditor.cs b/Assets/Standard Assets/Editor/ImageEffects/VignetteAndChromaticAberrationEditor.cs new file mode 100644 index 0000000..7ccec20 --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/VignetteAndChromaticAberrationEditor.cs @@ -0,0 +1,62 @@ +using System; +using UnityEditor; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [CustomEditor (typeof(VignetteAndChromaticAberration))] + class VignetteAndChromaticAberrationEditor : Editor + { + private SerializedObject m_SerObj; + private SerializedProperty m_Mode; + private SerializedProperty m_Intensity; // intensity == 0 disables pre pass (optimization) + private SerializedProperty m_ChromaticAberration; + private SerializedProperty m_AxialAberration; + private SerializedProperty m_Blur; // blur == 0 disables blur pass (optimization) + private SerializedProperty m_BlurSpread; + private SerializedProperty m_BlurDistance; + private SerializedProperty m_LuminanceDependency; + + + void OnEnable () + { + m_SerObj = new SerializedObject (target); + m_Mode = m_SerObj.FindProperty ("mode"); + m_Intensity = m_SerObj.FindProperty ("intensity"); + m_ChromaticAberration = m_SerObj.FindProperty ("chromaticAberration"); + m_AxialAberration = m_SerObj.FindProperty ("axialAberration"); + m_Blur = m_SerObj.FindProperty ("blur"); + m_BlurSpread = m_SerObj.FindProperty ("blurSpread"); + m_LuminanceDependency = m_SerObj.FindProperty ("luminanceDependency"); + m_BlurDistance = m_SerObj.FindProperty ("blurDistance"); + } + + + public override void OnInspectorGUI () + { + m_SerObj.Update (); + + EditorGUILayout.LabelField("Simulates the common lens artifacts 'Vignette' and 'Aberration'", EditorStyles.miniLabel); + + EditorGUILayout.Slider(m_Intensity, 0.0f, 1.0f, new GUIContent("Vignetting")); + EditorGUILayout.Slider(m_Blur, 0.0f, 1.0f, new GUIContent(" Blurred Corners")); + if (m_Blur.floatValue>0.0f) + EditorGUILayout.Slider(m_BlurSpread, 0.0f, 1.0f, new GUIContent(" Blur Distance")); + + EditorGUILayout.Separator (); + + EditorGUILayout.PropertyField (m_Mode, new GUIContent("Aberration")); + if (m_Mode.intValue>0) + { + EditorGUILayout.Slider(m_ChromaticAberration, 0.0f, 5.0f, new GUIContent(" Tangential Aberration")); + EditorGUILayout.Slider(m_AxialAberration, 0.0f, 5.0f, new GUIContent(" Axial Aberration")); + m_LuminanceDependency.floatValue = EditorGUILayout.Slider(" Contrast Dependency", m_LuminanceDependency.floatValue, 0.001f, 1.0f); + m_BlurDistance.floatValue = EditorGUILayout.Slider(" Blur Distance", m_BlurDistance.floatValue, 0.001f, 5.0f); + } + else + EditorGUILayout.PropertyField (m_ChromaticAberration, new GUIContent(" Chromatic Aberration")); + + m_SerObj.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/Standard Assets/Editor/ImageEffects/VignetteAndChromaticAberrationEditor.cs.meta b/Assets/Standard Assets/Editor/ImageEffects/VignetteAndChromaticAberrationEditor.cs.meta new file mode 100644 index 0000000..278b4eb --- /dev/null +++ b/Assets/Standard Assets/Editor/ImageEffects/VignetteAndChromaticAberrationEditor.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 08126bf2baa528c4cb9c60340a24e5d6 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects.meta b/Assets/Standard Assets/Effects.meta new file mode 100644 index 0000000..fc4ec9c --- /dev/null +++ b/Assets/Standard Assets/Effects.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 115d1f9d9bd29064ab981e57c8fc8cdf +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects.meta b/Assets/Standard Assets/Effects/ImageEffects.meta new file mode 100644 index 0000000..5b717ba --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: d6e0c95a128e14227939c51b5d9ad74e +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts.meta new file mode 100644 index 0000000..0ca768e --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: cd3e1490c3d9a7a498538315414d5129 +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Antialiasing.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Antialiasing.cs new file mode 100644 index 0000000..fdecc11 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Antialiasing.cs @@ -0,0 +1,177 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + public enum AAMode + { + FXAA2 = 0, + FXAA3Console = 1, + FXAA1PresetA = 2, + FXAA1PresetB = 3, + NFAA = 4, + SSAA = 5, + DLAA = 6, + } + + [ExecuteInEditMode] + [RequireComponent(typeof (Camera))] + [AddComponentMenu("Image Effects/Other/Antialiasing")] + public class Antialiasing : PostEffectsBase + { + public AAMode mode = AAMode.FXAA3Console; + + public bool showGeneratedNormals = false; + public float offsetScale = 0.2f; + public float blurRadius = 18.0f; + + public float edgeThresholdMin = 0.05f; + public float edgeThreshold = 0.2f; + public float edgeSharpness = 4.0f; + + public bool dlaaSharp = false; + + public Shader ssaaShader; + private Material ssaa; + public Shader dlaaShader; + private Material dlaa; + public Shader nfaaShader; + private Material nfaa; + public Shader shaderFXAAPreset2; + private Material materialFXAAPreset2; + public Shader shaderFXAAPreset3; + private Material materialFXAAPreset3; + public Shader shaderFXAAII; + private Material materialFXAAII; + public Shader shaderFXAAIII; + private Material materialFXAAIII; + + + public Material CurrentAAMaterial() + { + Material returnValue = null; + + switch (mode) + { + case AAMode.FXAA3Console: + returnValue = materialFXAAIII; + break; + case AAMode.FXAA2: + returnValue = materialFXAAII; + break; + case AAMode.FXAA1PresetA: + returnValue = materialFXAAPreset2; + break; + case AAMode.FXAA1PresetB: + returnValue = materialFXAAPreset3; + break; + case AAMode.NFAA: + returnValue = nfaa; + break; + case AAMode.SSAA: + returnValue = ssaa; + break; + case AAMode.DLAA: + returnValue = dlaa; + break; + default: + returnValue = null; + break; + } + + return returnValue; + } + + + public override bool CheckResources() + { + CheckSupport(false); + + materialFXAAPreset2 = CreateMaterial(shaderFXAAPreset2, materialFXAAPreset2); + materialFXAAPreset3 = CreateMaterial(shaderFXAAPreset3, materialFXAAPreset3); + materialFXAAII = CreateMaterial(shaderFXAAII, materialFXAAII); + materialFXAAIII = CreateMaterial(shaderFXAAIII, materialFXAAIII); + nfaa = CreateMaterial(nfaaShader, nfaa); + ssaa = CreateMaterial(ssaaShader, ssaa); + dlaa = CreateMaterial(dlaaShader, dlaa); + + if (!ssaaShader.isSupported) + { + NotSupported(); + ReportAutoDisable(); + } + + return isSupported; + } + + + public void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (CheckResources() == false) + { + Graphics.Blit(source, destination); + return; + } + + // ---------------------------------------------------------------- + // FXAA antialiasing modes + + if (mode == AAMode.FXAA3Console && (materialFXAAIII != null)) + { + materialFXAAIII.SetFloat("_EdgeThresholdMin", edgeThresholdMin); + materialFXAAIII.SetFloat("_EdgeThreshold", edgeThreshold); + materialFXAAIII.SetFloat("_EdgeSharpness", edgeSharpness); + + Graphics.Blit(source, destination, materialFXAAIII); + } + else if (mode == AAMode.FXAA1PresetB && (materialFXAAPreset3 != null)) + { + Graphics.Blit(source, destination, materialFXAAPreset3); + } + else if (mode == AAMode.FXAA1PresetA && materialFXAAPreset2 != null) + { + source.anisoLevel = 4; + Graphics.Blit(source, destination, materialFXAAPreset2); + source.anisoLevel = 0; + } + else if (mode == AAMode.FXAA2 && materialFXAAII != null) + { + Graphics.Blit(source, destination, materialFXAAII); + } + else if (mode == AAMode.SSAA && ssaa != null) + { + // ---------------------------------------------------------------- + // SSAA antialiasing + Graphics.Blit(source, destination, ssaa); + } + else if (mode == AAMode.DLAA && dlaa != null) + { + // ---------------------------------------------------------------- + // DLAA antialiasing + + source.anisoLevel = 0; + RenderTexture interim = RenderTexture.GetTemporary(source.width, source.height); + Graphics.Blit(source, interim, dlaa, 0); + Graphics.Blit(interim, destination, dlaa, dlaaSharp ? 2 : 1); + RenderTexture.ReleaseTemporary(interim); + } + else if (mode == AAMode.NFAA && nfaa != null) + { + // ---------------------------------------------------------------- + // nfaa antialiasing + + source.anisoLevel = 0; + + nfaa.SetFloat("_OffsetScale", offsetScale); + nfaa.SetFloat("_BlurRadius", blurRadius); + + Graphics.Blit(source, destination, nfaa, showGeneratedNormals ? 1 : 0); + } + else + { + // none of the AA is supported, fallback to a simple blit + Graphics.Blit(source, destination); + } + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Antialiasing.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Antialiasing.cs.meta new file mode 100644 index 0000000..6284674 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Antialiasing.cs.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 646b5bc27a658f447b1d929fd5ffbd70 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - ssaaShader: {fileID: 4800000, guid: b3728d1488b02490cbd196c7941bf1f8, type: 3} + - dlaaShader: {fileID: 4800000, guid: 017ca72b9e8a749058d13ebd527e98fa, type: 3} + - nfaaShader: {fileID: 4800000, guid: ce0cb2621f6d84e21a87414e471a3cce, type: 3} + - shaderFXAAPreset2: {fileID: 4800000, guid: 6f1418cffd12146f2a83be795f6fa5a7, type: 3} + - shaderFXAAPreset3: {fileID: 4800000, guid: c182fa94a5a0a4c02870641efcd38cd5, type: 3} + - shaderFXAAII: {fileID: 4800000, guid: cd5b323dcc592457790ff18b528f5e67, type: 3} + - shaderFXAAIII: {fileID: 4800000, guid: c547503fff0e8482ea5793727057041c, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Bloom.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Bloom.cs new file mode 100644 index 0000000..e98eac7 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Bloom.cs @@ -0,0 +1,362 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Bloom and Glow/Bloom")] + public class Bloom : PostEffectsBase + { + public enum LensFlareStyle + { + Ghosting = 0, + Anamorphic = 1, + Combined = 2, + } + + public enum TweakMode + { + Basic = 0, + Complex = 1, + } + + public enum HDRBloomMode + { + Auto = 0, + On = 1, + Off = 2, + } + + public enum BloomScreenBlendMode + { + Screen = 0, + Add = 1, + } + + public enum BloomQuality + { + Cheap = 0, + High = 1, + } + + public TweakMode tweakMode = 0; + public BloomScreenBlendMode screenBlendMode = BloomScreenBlendMode.Add; + + public HDRBloomMode hdr = HDRBloomMode.Auto; + private bool doHdr = false; + public float sepBlurSpread = 2.5f; + + public BloomQuality quality = BloomQuality.High; + + public float bloomIntensity = 0.5f; + public float bloomThreshold = 0.5f; + public Color bloomThresholdColor = Color.white; + public int bloomBlurIterations = 2; + + public int hollywoodFlareBlurIterations = 2; + public float flareRotation = 0.0f; + public LensFlareStyle lensflareMode = (LensFlareStyle) 1; + public float hollyStretchWidth = 2.5f; + public float lensflareIntensity = 0.0f; + public float lensflareThreshold = 0.3f; + public float lensFlareSaturation = 0.75f; + public Color flareColorA = new Color (0.4f, 0.4f, 0.8f, 0.75f); + public Color flareColorB = new Color (0.4f, 0.8f, 0.8f, 0.75f); + public Color flareColorC = new Color (0.8f, 0.4f, 0.8f, 0.75f); + public Color flareColorD = new Color (0.8f, 0.4f, 0.0f, 0.75f); + public Texture2D lensFlareVignetteMask; + + public Shader lensFlareShader; + private Material lensFlareMaterial; + + public Shader screenBlendShader; + private Material screenBlend; + + public Shader blurAndFlaresShader; + private Material blurAndFlaresMaterial; + + public Shader brightPassFilterShader; + private Material brightPassFilterMaterial; + + + public override bool CheckResources () + { + CheckSupport (false); + + screenBlend = CheckShaderAndCreateMaterial (screenBlendShader, screenBlend); + lensFlareMaterial = CheckShaderAndCreateMaterial(lensFlareShader,lensFlareMaterial); + blurAndFlaresMaterial = CheckShaderAndCreateMaterial (blurAndFlaresShader, blurAndFlaresMaterial); + brightPassFilterMaterial = CheckShaderAndCreateMaterial(brightPassFilterShader, brightPassFilterMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + public void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources()==false) + { + Graphics.Blit (source, destination); + return; + } + + // screen blend is not supported when HDR is enabled (will cap values) + + doHdr = false; + if (hdr == HDRBloomMode.Auto) +#if UNITY_5_6_OR_NEWER + doHdr = source.format == RenderTextureFormat.ARGBHalf && GetComponent().allowHDR; +#else + doHdr = source.format == RenderTextureFormat.ARGBHalf && GetComponent().hdr; +#endif + else { + doHdr = hdr == HDRBloomMode.On; + } + + doHdr = doHdr && supportHDRTextures; + + BloomScreenBlendMode realBlendMode = screenBlendMode; + if (doHdr) + realBlendMode = BloomScreenBlendMode.Add; + + var rtFormat= (doHdr) ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.Default; + var rtW2= source.width/2; + var rtH2= source.height/2; + var rtW4= source.width/4; + var rtH4= source.height/4; + + float widthOverHeight = (1.0f * source.width) / (1.0f * source.height); + float oneOverBaseSize = 1.0f / 512.0f; + + // downsample + RenderTexture quarterRezColor = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat); + RenderTexture halfRezColorDown = RenderTexture.GetTemporary (rtW2, rtH2, 0, rtFormat); + if (quality > BloomQuality.Cheap) { + Graphics.Blit (source, halfRezColorDown, screenBlend, 2); + RenderTexture rtDown4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat); + Graphics.Blit (halfRezColorDown, rtDown4, screenBlend, 2); + Graphics.Blit (rtDown4, quarterRezColor, screenBlend, 6); + RenderTexture.ReleaseTemporary(rtDown4); + } + else { + Graphics.Blit (source, halfRezColorDown); + Graphics.Blit (halfRezColorDown, quarterRezColor, screenBlend, 6); + } + RenderTexture.ReleaseTemporary (halfRezColorDown); + + // cut colors (thresholding) + RenderTexture secondQuarterRezColor = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat); + BrightFilter (bloomThreshold * bloomThresholdColor, quarterRezColor, secondQuarterRezColor); + + // blurring + + if (bloomBlurIterations < 1) bloomBlurIterations = 1; + else if (bloomBlurIterations > 10) bloomBlurIterations = 10; + + for (int iter = 0; iter < bloomBlurIterations; iter++) + { + float spreadForPass = (1.0f + (iter * 0.25f)) * sepBlurSpread; + + // vertical blur + RenderTexture blur4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat); + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 (0.0f, spreadForPass * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (secondQuarterRezColor, blur4, blurAndFlaresMaterial, 4); + RenderTexture.ReleaseTemporary(secondQuarterRezColor); + secondQuarterRezColor = blur4; + + // horizontal blur + blur4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat); + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 ((spreadForPass / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit (secondQuarterRezColor, blur4, blurAndFlaresMaterial, 4); + RenderTexture.ReleaseTemporary (secondQuarterRezColor); + secondQuarterRezColor = blur4; + + if (quality > BloomQuality.Cheap) + { + if (iter == 0) + { + Graphics.SetRenderTarget(quarterRezColor); + GL.Clear(false, true, Color.black); // Clear to avoid RT restore + Graphics.Blit (secondQuarterRezColor, quarterRezColor); + } + else + { + quarterRezColor.MarkRestoreExpected(); // using max blending, RT restore expected + Graphics.Blit (secondQuarterRezColor, quarterRezColor, screenBlend, 10); + } + } + } + + if (quality > BloomQuality.Cheap) + { + Graphics.SetRenderTarget(secondQuarterRezColor); + GL.Clear(false, true, Color.black); // Clear to avoid RT restore + Graphics.Blit (quarterRezColor, secondQuarterRezColor, screenBlend, 6); + } + + // lens flares: ghosting, anamorphic or both (ghosted anamorphic flares) + + if (lensflareIntensity > Mathf.Epsilon) + { + + RenderTexture rtFlares4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat); + + if (lensflareMode == 0) + { + // ghosting only + + BrightFilter (lensflareThreshold, secondQuarterRezColor, rtFlares4); + + if (quality > BloomQuality.Cheap) + { + // smooth a little + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 (0.0f, (1.5f) / (1.0f * quarterRezColor.height), 0.0f, 0.0f)); + Graphics.SetRenderTarget(quarterRezColor); + GL.Clear(false, true, Color.black); // Clear to avoid RT restore + Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 4); + + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 ((1.5f) / (1.0f * quarterRezColor.width), 0.0f, 0.0f, 0.0f)); + Graphics.SetRenderTarget(rtFlares4); + GL.Clear(false, true, Color.black); // Clear to avoid RT restore + Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 4); + } + + // no ugly edges! + Vignette (0.975f, rtFlares4, rtFlares4); + BlendFlares (rtFlares4, secondQuarterRezColor); + } + else + { + + //Vignette (0.975ff, rtFlares4, rtFlares4); + //DrawBorder(rtFlares4, screenBlend, 8); + + float flareXRot = 1.0f * Mathf.Cos(flareRotation); + float flareyRot = 1.0f * Mathf.Sin(flareRotation); + + float stretchWidth = (hollyStretchWidth * 1.0f / widthOverHeight) * oneOverBaseSize; + + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 (flareXRot, flareyRot, 0.0f, 0.0f)); + blurAndFlaresMaterial.SetVector ("_Threshhold", new Vector4 (lensflareThreshold, 1.0f, 0.0f, 0.0f)); + blurAndFlaresMaterial.SetVector ("_TintColor", new Vector4 (flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * flareColorA.a * lensflareIntensity); + blurAndFlaresMaterial.SetFloat ("_Saturation", lensFlareSaturation); + + // "pre and cut" + quarterRezColor.DiscardContents(); + Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 2); + // "post" + rtFlares4.DiscardContents(); + Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 3); + + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 (flareXRot * stretchWidth, flareyRot * stretchWidth, 0.0f, 0.0f)); + // stretch 1st + blurAndFlaresMaterial.SetFloat ("_StretchWidth", hollyStretchWidth); + quarterRezColor.DiscardContents(); + Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 1); + // stretch 2nd + blurAndFlaresMaterial.SetFloat ("_StretchWidth", hollyStretchWidth * 2.0f); + rtFlares4.DiscardContents(); + Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 1); + // stretch 3rd + blurAndFlaresMaterial.SetFloat ("_StretchWidth", hollyStretchWidth * 4.0f); + quarterRezColor.DiscardContents(); + Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 1); + + // additional blur passes + for (int iter = 0; iter < hollywoodFlareBlurIterations; iter++) + { + stretchWidth = (hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize; + + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 (stretchWidth * flareXRot, stretchWidth * flareyRot, 0.0f, 0.0f)); + rtFlares4.DiscardContents(); + Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 4); + + blurAndFlaresMaterial.SetVector ("_Offsets", new Vector4 (stretchWidth * flareXRot, stretchWidth * flareyRot, 0.0f, 0.0f)); + quarterRezColor.DiscardContents(); + Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 4); + } + + if (lensflareMode == (LensFlareStyle) 1) + // anamorphic lens flares + AddTo (1.0f, quarterRezColor, secondQuarterRezColor); + else + { + // "combined" lens flares + + Vignette (1.0f, quarterRezColor, rtFlares4); + BlendFlares (rtFlares4, quarterRezColor); + AddTo (1.0f, quarterRezColor, secondQuarterRezColor); + } + } + RenderTexture.ReleaseTemporary (rtFlares4); + } + + int blendPass = (int) realBlendMode; + //if (Mathf.Abs(chromaticBloom) < Mathf.Epsilon) + // blendPass += 4; + + screenBlend.SetFloat ("_Intensity", bloomIntensity); + screenBlend.SetTexture ("_ColorBuffer", source); + + if (quality > BloomQuality.Cheap) + { + RenderTexture halfRezColorUp = RenderTexture.GetTemporary (rtW2, rtH2, 0, rtFormat); + Graphics.Blit (secondQuarterRezColor, halfRezColorUp); + Graphics.Blit (halfRezColorUp, destination, screenBlend, blendPass); + RenderTexture.ReleaseTemporary (halfRezColorUp); + } + else + Graphics.Blit (secondQuarterRezColor, destination, screenBlend, blendPass); + + RenderTexture.ReleaseTemporary (quarterRezColor); + RenderTexture.ReleaseTemporary (secondQuarterRezColor); + } + + private void AddTo (float intensity_, RenderTexture from, RenderTexture to) + { + screenBlend.SetFloat ("_Intensity", intensity_); + to.MarkRestoreExpected(); // additive blending, RT restore expected + Graphics.Blit (from, to, screenBlend, 9); + } + + private void BlendFlares (RenderTexture from, RenderTexture to) + { + lensFlareMaterial.SetVector ("colorA", new Vector4 (flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * lensflareIntensity); + lensFlareMaterial.SetVector ("colorB", new Vector4 (flareColorB.r, flareColorB.g, flareColorB.b, flareColorB.a) * lensflareIntensity); + lensFlareMaterial.SetVector ("colorC", new Vector4 (flareColorC.r, flareColorC.g, flareColorC.b, flareColorC.a) * lensflareIntensity); + lensFlareMaterial.SetVector ("colorD", new Vector4 (flareColorD.r, flareColorD.g, flareColorD.b, flareColorD.a) * lensflareIntensity); + to.MarkRestoreExpected(); // additive blending, RT restore expected + Graphics.Blit (from, to, lensFlareMaterial); + } + + private void BrightFilter (float thresh, RenderTexture from, RenderTexture to) + { + brightPassFilterMaterial.SetVector ("_Threshhold", new Vector4 (thresh, thresh, thresh, thresh)); + Graphics.Blit (from, to, brightPassFilterMaterial, 0); + } + + private void BrightFilter (Color threshColor, RenderTexture from, RenderTexture to) + { + brightPassFilterMaterial.SetVector ("_Threshhold", threshColor); + Graphics.Blit (from, to, brightPassFilterMaterial, 1); + } + + private void Vignette (float amount, RenderTexture from, RenderTexture to) + { + if (lensFlareVignetteMask) + { + screenBlend.SetTexture ("_ColorBuffer", lensFlareVignetteMask); + to.MarkRestoreExpected(); // using blending, RT restore expected + Graphics.Blit (from == to ? null : from, to, screenBlend, from == to ? 7 : 3); + } + else if (from != to) + { + Graphics.SetRenderTarget (to); + GL.Clear(false, true, Color.black); // clear destination to avoid RT restore + Graphics.Blit (from, to); + } + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Bloom.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Bloom.cs.meta new file mode 100644 index 0000000..edcd45d --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Bloom.cs.meta @@ -0,0 +1,17 @@ +fileFormatVersion: 2 +guid: 7fceaeb339b971b429c4cc600acabd13 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - lensFlareVignetteMask: {fileID: 2800000, guid: 95ef4804fe0be4c999ddaa383536cde8, + type: 3} + - lensFlareShader: {fileID: 4800000, guid: 459fe69d2f6d74ddb92f04dbf45a866b, type: 3} + - screenBlendShader: {fileID: 4800000, guid: 7856cbff0a0ca45c787d5431eb805bb0, type: 3} + - blurAndFlaresShader: {fileID: 4800000, guid: be6e39cf196f146d5be72fbefb18ed75, + type: 3} + - brightPassFilterShader: {fileID: 4800000, guid: 0aeaa4cb29f5d4e9c8455f04c8575c8c, + type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomAndFlares.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomAndFlares.cs new file mode 100644 index 0000000..4cb19e4 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomAndFlares.cs @@ -0,0 +1,318 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + public enum LensflareStyle34 + { + Ghosting = 0, + Anamorphic = 1, + Combined = 2, + } + + public enum TweakMode34 + { + Basic = 0, + Complex = 1, + } + + public enum HDRBloomMode + { + Auto = 0, + On = 1, + Off = 2, + } + + public enum BloomScreenBlendMode + { + Screen = 0, + Add = 1, + } + + [ExecuteInEditMode] + [RequireComponent(typeof(Camera))] + [AddComponentMenu("Image Effects/Bloom and Glow/BloomAndFlares (3.5, Deprecated)")] + public class BloomAndFlares : PostEffectsBase + { + public TweakMode34 tweakMode = 0; + public BloomScreenBlendMode screenBlendMode = BloomScreenBlendMode.Add; + + public HDRBloomMode hdr = HDRBloomMode.Auto; + private bool doHdr = false; + public float sepBlurSpread = 1.5f; + public float useSrcAlphaAsMask = 0.5f; + + public float bloomIntensity = 1.0f; + public float bloomThreshold = 0.5f; + public int bloomBlurIterations = 2; + + public bool lensflares = false; + public int hollywoodFlareBlurIterations = 2; + public LensflareStyle34 lensflareMode = (LensflareStyle34)1; + public float hollyStretchWidth = 3.5f; + public float lensflareIntensity = 1.0f; + public float lensflareThreshold = 0.3f; + public Color flareColorA = new Color(0.4f, 0.4f, 0.8f, 0.75f); + public Color flareColorB = new Color(0.4f, 0.8f, 0.8f, 0.75f); + public Color flareColorC = new Color(0.8f, 0.4f, 0.8f, 0.75f); + public Color flareColorD = new Color(0.8f, 0.4f, 0.0f, 0.75f); + public Texture2D lensFlareVignetteMask; + + public Shader lensFlareShader; + private Material lensFlareMaterial; + + public Shader vignetteShader; + private Material vignetteMaterial; + + public Shader separableBlurShader; + private Material separableBlurMaterial; + + public Shader addBrightStuffOneOneShader; + private Material addBrightStuffBlendOneOneMaterial; + + public Shader screenBlendShader; + private Material screenBlend; + + public Shader hollywoodFlaresShader; + private Material hollywoodFlaresMaterial; + + public Shader brightPassFilterShader; + private Material brightPassFilterMaterial; + + + public override bool CheckResources() + { + CheckSupport(false); + + screenBlend = CheckShaderAndCreateMaterial(screenBlendShader, screenBlend); + lensFlareMaterial = CheckShaderAndCreateMaterial(lensFlareShader, lensFlareMaterial); + vignetteMaterial = CheckShaderAndCreateMaterial(vignetteShader, vignetteMaterial); + separableBlurMaterial = CheckShaderAndCreateMaterial(separableBlurShader, separableBlurMaterial); + addBrightStuffBlendOneOneMaterial = CheckShaderAndCreateMaterial(addBrightStuffOneOneShader, addBrightStuffBlendOneOneMaterial); + hollywoodFlaresMaterial = CheckShaderAndCreateMaterial(hollywoodFlaresShader, hollywoodFlaresMaterial); + brightPassFilterMaterial = CheckShaderAndCreateMaterial(brightPassFilterShader, brightPassFilterMaterial); + + if (!isSupported) + ReportAutoDisable(); + return isSupported; + } + + void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (CheckResources() == false) + { + Graphics.Blit(source, destination); + return; + } + + // screen blend is not supported when HDR is enabled (will cap values) + + doHdr = false; + if (hdr == HDRBloomMode.Auto) +#if UNITY_5_6_OR_NEWER + doHdr = source.format == RenderTextureFormat.ARGBHalf && GetComponent().allowHDR; +#else + doHdr = source.format == RenderTextureFormat.ARGBHalf && GetComponent().hdr; +#endif + else + { + doHdr = hdr == HDRBloomMode.On; + } + + doHdr = doHdr && supportHDRTextures; + + BloomScreenBlendMode realBlendMode = screenBlendMode; + if (doHdr) + realBlendMode = BloomScreenBlendMode.Add; + + var rtFormat = (doHdr) ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.Default; + RenderTexture halfRezColor = RenderTexture.GetTemporary(source.width / 2, source.height / 2, 0, rtFormat); + RenderTexture quarterRezColor = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, rtFormat); + RenderTexture secondQuarterRezColor = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, rtFormat); + RenderTexture thirdQuarterRezColor = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, rtFormat); + + float widthOverHeight = (1.0f * source.width) / (1.0f * source.height); + float oneOverBaseSize = 1.0f / 512.0f; + + // downsample + + Graphics.Blit(source, halfRezColor, screenBlend, 2); // <- 2 is stable downsample + Graphics.Blit(halfRezColor, quarterRezColor, screenBlend, 2); // <- 2 is stable downsample + + RenderTexture.ReleaseTemporary(halfRezColor); + + // cut colors (thresholding) + + BrightFilter(bloomThreshold, useSrcAlphaAsMask, quarterRezColor, secondQuarterRezColor); + quarterRezColor.DiscardContents(); + + // blurring + + if (bloomBlurIterations < 1) bloomBlurIterations = 1; + + for (int iter = 0; iter < bloomBlurIterations; iter++) + { + float spreadForPass = (1.0f + (iter * 0.5f)) * sepBlurSpread; + separableBlurMaterial.SetVector("offsets", new Vector4(0.0f, spreadForPass * oneOverBaseSize, 0.0f, 0.0f)); + + RenderTexture src = iter == 0 ? secondQuarterRezColor : quarterRezColor; + Graphics.Blit(src, thirdQuarterRezColor, separableBlurMaterial); + src.DiscardContents(); + + separableBlurMaterial.SetVector("offsets", new Vector4((spreadForPass / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit(thirdQuarterRezColor, quarterRezColor, separableBlurMaterial); + thirdQuarterRezColor.DiscardContents(); + } + + // lens flares: ghosting, anamorphic or a combination + + if (lensflares) + { + + if (lensflareMode == 0) + { + + BrightFilter(lensflareThreshold, 0.0f, quarterRezColor, thirdQuarterRezColor); + quarterRezColor.DiscardContents(); + + // smooth a little, this needs to be resolution dependent + /* + separableBlurMaterial.SetVector ("offsets", Vector4 (0.0ff, (2.0ff) / (1.0ff * quarterRezColor.height), 0.0ff, 0.0ff)); + Graphics.Blit (thirdQuarterRezColor, secondQuarterRezColor, separableBlurMaterial); + separableBlurMaterial.SetVector ("offsets", Vector4 ((2.0ff) / (1.0ff * quarterRezColor.width), 0.0ff, 0.0ff, 0.0ff)); + Graphics.Blit (secondQuarterRezColor, thirdQuarterRezColor, separableBlurMaterial); + */ + // no ugly edges! + + Vignette(0.975f, thirdQuarterRezColor, secondQuarterRezColor); + thirdQuarterRezColor.DiscardContents(); + + BlendFlares(secondQuarterRezColor, quarterRezColor); + secondQuarterRezColor.DiscardContents(); + } + + // (b) hollywood/anamorphic flares? + + else + { + + // thirdQuarter has the brightcut unblurred colors + // quarterRezColor is the blurred, brightcut buffer that will end up as bloom + + hollywoodFlaresMaterial.SetVector("_threshold", new Vector4(lensflareThreshold, 1.0f / (1.0f - lensflareThreshold), 0.0f, 0.0f)); + hollywoodFlaresMaterial.SetVector("tintColor", new Vector4(flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * flareColorA.a * lensflareIntensity); + Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, hollywoodFlaresMaterial, 2); + thirdQuarterRezColor.DiscardContents(); + + Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, hollywoodFlaresMaterial, 3); + secondQuarterRezColor.DiscardContents(); + + hollywoodFlaresMaterial.SetVector("offsets", new Vector4((sepBlurSpread * 1.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + hollywoodFlaresMaterial.SetFloat("stretchWidth", hollyStretchWidth); + Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, hollywoodFlaresMaterial, 1); + thirdQuarterRezColor.DiscardContents(); + + hollywoodFlaresMaterial.SetFloat("stretchWidth", hollyStretchWidth * 2.0f); + Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, hollywoodFlaresMaterial, 1); + secondQuarterRezColor.DiscardContents(); + + hollywoodFlaresMaterial.SetFloat("stretchWidth", hollyStretchWidth * 4.0f); + Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, hollywoodFlaresMaterial, 1); + thirdQuarterRezColor.DiscardContents(); + + if (lensflareMode == (LensflareStyle34)1) + { + for (int itera = 0; itera < hollywoodFlareBlurIterations; itera++) + { + separableBlurMaterial.SetVector("offsets", new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, separableBlurMaterial); + secondQuarterRezColor.DiscardContents(); + + separableBlurMaterial.SetVector("offsets", new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, separableBlurMaterial); + thirdQuarterRezColor.DiscardContents(); + } + + AddTo(1.0f, secondQuarterRezColor, quarterRezColor); + secondQuarterRezColor.DiscardContents(); + } + else + { + + // (c) combined + + for (int ix = 0; ix < hollywoodFlareBlurIterations; ix++) + { + separableBlurMaterial.SetVector("offsets", new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, separableBlurMaterial); + secondQuarterRezColor.DiscardContents(); + + separableBlurMaterial.SetVector("offsets", new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, separableBlurMaterial); + thirdQuarterRezColor.DiscardContents(); + } + + Vignette(1.0f, secondQuarterRezColor, thirdQuarterRezColor); + secondQuarterRezColor.DiscardContents(); + + BlendFlares(thirdQuarterRezColor, secondQuarterRezColor); + thirdQuarterRezColor.DiscardContents(); + + AddTo(1.0f, secondQuarterRezColor, quarterRezColor); + secondQuarterRezColor.DiscardContents(); + } + } + } + + // screen blend bloom results to color buffer + + screenBlend.SetFloat("_Intensity", bloomIntensity); + screenBlend.SetTexture("_ColorBuffer", source); + Graphics.Blit(quarterRezColor, destination, screenBlend, (int)realBlendMode); + + RenderTexture.ReleaseTemporary(quarterRezColor); + RenderTexture.ReleaseTemporary(secondQuarterRezColor); + RenderTexture.ReleaseTemporary(thirdQuarterRezColor); + } + + private void AddTo(float intensity_, RenderTexture from, RenderTexture to) + { + addBrightStuffBlendOneOneMaterial.SetFloat("_Intensity", intensity_); + Graphics.Blit(from, to, addBrightStuffBlendOneOneMaterial); + } + + private void BlendFlares(RenderTexture from, RenderTexture to) + { + lensFlareMaterial.SetVector("colorA", new Vector4(flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * lensflareIntensity); + lensFlareMaterial.SetVector("colorB", new Vector4(flareColorB.r, flareColorB.g, flareColorB.b, flareColorB.a) * lensflareIntensity); + lensFlareMaterial.SetVector("colorC", new Vector4(flareColorC.r, flareColorC.g, flareColorC.b, flareColorC.a) * lensflareIntensity); + lensFlareMaterial.SetVector("colorD", new Vector4(flareColorD.r, flareColorD.g, flareColorD.b, flareColorD.a) * lensflareIntensity); + Graphics.Blit(from, to, lensFlareMaterial); + } + + private void BrightFilter(float thresh, float useAlphaAsMask, RenderTexture from, RenderTexture to) + { + if (doHdr) + brightPassFilterMaterial.SetVector("threshold", new Vector4(thresh, 1.0f, 0.0f, 0.0f)); + else + brightPassFilterMaterial.SetVector("threshold", new Vector4(thresh, 1.0f / (1.0f - thresh), 0.0f, 0.0f)); + brightPassFilterMaterial.SetFloat("useSrcAlphaAsMask", useAlphaAsMask); + Graphics.Blit(from, to, brightPassFilterMaterial); + } + + private void Vignette(float amount, RenderTexture from, RenderTexture to) + { + if (lensFlareVignetteMask) + { + screenBlend.SetTexture("_ColorBuffer", lensFlareVignetteMask); + Graphics.Blit(from, to, screenBlend, 3); + } + else + { + vignetteMaterial.SetFloat("vignetteIntensity", amount); + Graphics.Blit(from, to, vignetteMaterial); + } + } + + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomAndFlares.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomAndFlares.cs.meta new file mode 100644 index 0000000..d3b3c7b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomAndFlares.cs.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 02536f33053638549ab5c50ff3ecc0de +MonoImporter: + serializedVersion: 2 + defaultReferences: + - lensFlareVignetteMask: {fileID: 2800000, guid: 95ef4804fe0be4c999ddaa383536cde8, + type: 3} + - lensFlareShader: {fileID: 4800000, guid: 459fe69d2f6d74ddb92f04dbf45a866b, type: 3} + - vignetteShader: {fileID: 4800000, guid: 627943dc7a9a74286b70a4f694a0acd5, type: 3} + - separableBlurShader: {fileID: 4800000, guid: a9df009a214e24a5ebbf271595f8d5b6, + type: 3} + - addBrightStuffOneOneShader: {fileID: 4800000, guid: f7898d203e9b94c0dbe2bf9dd5cb32c0, + type: 3} + - screenBlendShader: {fileID: 4800000, guid: 53b3960ee3d3d4a5caa8d5473d120187, type: 3} + - hollywoodFlaresShader: {fileID: 4800000, guid: e2baf3cae8edc4daf94c9adc2154be00, + type: 3} + - brightPassFilterShader: {fileID: 4800000, guid: 186c4c0d31e314f049595dcbaf4ca129, + type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomOptimized.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomOptimized.cs new file mode 100644 index 0000000..f7d9251 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomOptimized.cs @@ -0,0 +1,109 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Bloom and Glow/Bloom (Optimized)")] + public class BloomOptimized : PostEffectsBase + { + + public enum Resolution + { + Low = 0, + High = 1, + } + + public enum BlurType + { + Standard = 0, + Sgx = 1, + } + + [Range(0.0f, 1.5f)] + public float threshold = 0.25f; + [Range(0.0f, 2.5f)] + public float intensity = 0.75f; + + [Range(0.25f, 5.5f)] + public float blurSize = 1.0f; + + Resolution resolution = Resolution.Low; + [Range(1, 4)] + public int blurIterations = 1; + + public BlurType blurType= BlurType.Standard; + + public Shader fastBloomShader = null; + private Material fastBloomMaterial = null; + + + public override bool CheckResources () + { + CheckSupport (false); + + fastBloomMaterial = CheckShaderAndCreateMaterial (fastBloomShader, fastBloomMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnDisable () + { + if (fastBloomMaterial) + DestroyImmediate (fastBloomMaterial); + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources() == false) + { + Graphics.Blit (source, destination); + return; + } + + int divider = resolution == Resolution.Low ? 4 : 2; + float widthMod = resolution == Resolution.Low ? 0.5f : 1.0f; + + fastBloomMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod, 0.0f, threshold, intensity)); + source.filterMode = FilterMode.Bilinear; + + var rtW= source.width/divider; + var rtH= source.height/divider; + + // downsample + RenderTexture rt = RenderTexture.GetTemporary (rtW, rtH, 0, source.format); + rt.filterMode = FilterMode.Bilinear; + Graphics.Blit (source, rt, fastBloomMaterial, 1); + + var passOffs= blurType == BlurType.Standard ? 0 : 2; + + for(int i = 0; i < blurIterations; i++) + { + fastBloomMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod + (i*1.0f), 0.0f, threshold, intensity)); + + // vertical blur + RenderTexture rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format); + rt2.filterMode = FilterMode.Bilinear; + Graphics.Blit (rt, rt2, fastBloomMaterial, 2 + passOffs); + RenderTexture.ReleaseTemporary (rt); + rt = rt2; + + // horizontal blur + rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format); + rt2.filterMode = FilterMode.Bilinear; + Graphics.Blit (rt, rt2, fastBloomMaterial, 3 + passOffs); + RenderTexture.ReleaseTemporary (rt); + rt = rt2; + } + + fastBloomMaterial.SetTexture ("_Bloom", rt); + + Graphics.Blit (source, destination, fastBloomMaterial, 0); + + RenderTexture.ReleaseTemporary (rt); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomOptimized.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomOptimized.cs.meta new file mode 100644 index 0000000..68dcfc1 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BloomOptimized.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4975a6e437fc3b149a8cd508ce5bdd69 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - fastBloomShader: {fileID: 4800000, guid: 68a00c837b82e4c6d92e7da765dc5f1d, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Blur.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Blur.cs new file mode 100644 index 0000000..1db8a3f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Blur.cs @@ -0,0 +1,108 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Blur/Blur")] + public class Blur : MonoBehaviour + { + /// Blur iterations - larger number means more blur. + [Range(0,10)] + public int iterations = 3; + + /// Blur spread for each iteration. Lower values + /// give better looking blur, but require more iterations to + /// get large blurs. Value is usually between 0.5 and 1.0. + [Range(0.0f,1.0f)] + public float blurSpread = 0.6f; + + + // -------------------------------------------------------- + // The blur iteration shader. + // Basically it just takes 4 texture samples and averages them. + // By applying it repeatedly and spreading out sample locations + // we get a Gaussian blur approximation. + + public Shader blurShader = null; + + static Material m_Material = null; + protected Material material { + get { + if (m_Material == null) { + m_Material = new Material(blurShader); + m_Material.hideFlags = HideFlags.DontSave; + } + return m_Material; + } + } + + protected void OnDisable() { + if ( m_Material ) { + DestroyImmediate( m_Material ); + } + } + + // -------------------------------------------------------- + + protected void Start() + { + // Disable if we don't support image effects + if (!SystemInfo.supportsImageEffects) { + enabled = false; + return; + } + // Disable if the shader can't run on the users graphics card + if (!blurShader || !material.shader.isSupported) { + enabled = false; + return; + } + } + + // Performs one blur iteration. + public void FourTapCone (RenderTexture source, RenderTexture dest, int iteration) + { + float off = 0.5f + iteration*blurSpread; + Graphics.BlitMultiTap (source, dest, material, + new Vector2(-off, -off), + new Vector2(-off, off), + new Vector2( off, off), + new Vector2( off, -off) + ); + } + + // Downsamples the texture to a quarter resolution. + private void DownSample4x (RenderTexture source, RenderTexture dest) + { + float off = 1.0f; + Graphics.BlitMultiTap (source, dest, material, + new Vector2(-off, -off), + new Vector2(-off, off), + new Vector2( off, off), + new Vector2( off, -off) + ); + } + + // Called by the camera to apply the image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) { + int rtW = source.width/4; + int rtH = source.height/4; + RenderTexture buffer = RenderTexture.GetTemporary(rtW, rtH, 0); + + // Copy source to the 4x4 smaller texture. + DownSample4x (source, buffer); + + // Blur the small texture + for(int i = 0; i < iterations; i++) + { + RenderTexture buffer2 = RenderTexture.GetTemporary(rtW, rtH, 0); + FourTapCone (buffer, buffer2, i); + RenderTexture.ReleaseTemporary(buffer); + buffer = buffer2; + } + Graphics.Blit(buffer, destination); + + RenderTexture.ReleaseTemporary(buffer); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Blur.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Blur.cs.meta new file mode 100644 index 0000000..c4bb7e7 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Blur.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 34382083ad114a07d000fbfb8d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - blurShader: {fileID: 4800000, guid: 57e6deea7c2924e22a5138e2b70bb4dc, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/BlurOptimized.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BlurOptimized.cs new file mode 100644 index 0000000..c922dbe --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BlurOptimized.cs @@ -0,0 +1,93 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Blur/Blur (Optimized)")] + public class BlurOptimized : PostEffectsBase + { + + [Range(0, 2)] + public int downsample = 1; + + public enum BlurType { + StandardGauss = 0, + SgxGauss = 1, + } + + [Range(0.0f, 10.0f)] + public float blurSize = 3.0f; + + [Range(1, 4)] + public int blurIterations = 2; + + public BlurType blurType= BlurType.StandardGauss; + + public Shader blurShader = null; + private Material blurMaterial = null; + + + public override bool CheckResources () { + CheckSupport (false); + + blurMaterial = CheckShaderAndCreateMaterial (blurShader, blurMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + public void OnDisable () { + if (blurMaterial) + DestroyImmediate (blurMaterial); + } + + public void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (CheckResources() == false) { + Graphics.Blit (source, destination); + return; + } + + float widthMod = 1.0f / (1.0f * (1<> downsample; + int rtH = source.height >> downsample; + + // downsample + RenderTexture rt = RenderTexture.GetTemporary (rtW, rtH, 0, source.format); + + rt.filterMode = FilterMode.Bilinear; + Graphics.Blit (source, rt, blurMaterial, 0); + + var passOffs= blurType == BlurType.StandardGauss ? 0 : 2; + + for(int i = 0; i < blurIterations; i++) { + float iterationOffs = (i*1.0f); + blurMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod + iterationOffs, -blurSize * widthMod - iterationOffs, 0.0f, 0.0f)); + + // vertical blur + RenderTexture rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format); + rt2.filterMode = FilterMode.Bilinear; + Graphics.Blit (rt, rt2, blurMaterial, 1 + passOffs); + RenderTexture.ReleaseTemporary (rt); + rt = rt2; + + // horizontal blur + rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format); + rt2.filterMode = FilterMode.Bilinear; + Graphics.Blit (rt, rt2, blurMaterial, 2 + passOffs); + RenderTexture.ReleaseTemporary (rt); + rt = rt2; + } + + Graphics.Blit (rt, destination); + + RenderTexture.ReleaseTemporary (rt); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/BlurOptimized.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BlurOptimized.cs.meta new file mode 100644 index 0000000..47ca17b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/BlurOptimized.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7fc6bde01469c7b4badee5362f191d96 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - blurShader: {fileID: 4800000, guid: f9d5fa183cd6b45eeb1491f74863cd91, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/CameraMotionBlur.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CameraMotionBlur.cs new file mode 100644 index 0000000..b9cba5d --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CameraMotionBlur.cs @@ -0,0 +1,408 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Camera/Camera Motion Blur") ] + public class CameraMotionBlur : PostEffectsBase + { + // make sure to match this to MAX_RADIUS in shader ('k' in paper) + static float MAX_RADIUS = 10.0f; + + public enum MotionBlurFilter { + CameraMotion = 0, // global screen blur based on cam motion + LocalBlur = 1, // cheap blur, no dilation or scattering + Reconstruction = 2, // advanced filter (simulates scattering) as in plausible motion blur paper + ReconstructionDX11 = 3, // advanced filter (simulates scattering) as in plausible motion blur paper + ReconstructionDisc = 4, // advanced filter using scaled poisson disc sampling + } + + // settings + public MotionBlurFilter filterType = MotionBlurFilter.Reconstruction; + public bool preview = false; // show how blur would look like in action ... + public Vector3 previewScale = Vector3.one; // ... given this movement vector + + // params + public float movementScale = 0.0f; + public float rotationScale = 1.0f; + public float maxVelocity = 8.0f; // maximum velocity in pixels + public float minVelocity = 0.1f; // minimum velocity in pixels + public float velocityScale = 0.375f; // global velocity scale + public float softZDistance = 0.005f; // for z overlap check softness (reconstruction filter only) + public int velocityDownsample = 1; // low resolution velocity buffer? (optimization) + public LayerMask excludeLayers = 0; + private GameObject tmpCam = null; + + // resources + public Shader shader; + public Shader dx11MotionBlurShader; + public Shader replacementClear; + + private Material motionBlurMaterial = null; + private Material dx11MotionBlurMaterial = null; + + public Texture2D noiseTexture = null; + public float jitter = 0.05f; + + // (internal) debug + public bool showVelocity = false; + public float showVelocityScale = 1.0f; + + // camera transforms + private Matrix4x4 currentViewProjMat; + private Matrix4x4[] currentStereoViewProjMat; + private Matrix4x4 prevViewProjMat; + private Matrix4x4[] prevStereoViewProjMat; + private int prevFrameCount; + private bool wasActive; + // shortcuts to calculate global blur direction when using 'CameraMotion' + private Vector3 prevFrameForward = Vector3.forward; + private Vector3 prevFrameUp = Vector3.up; + private Vector3 prevFramePos = Vector3.zero; + private Camera _camera; + + + private void CalculateViewProjection () { + Matrix4x4 viewMat = _camera.worldToCameraMatrix; + Matrix4x4 projMat = GL.GetGPUProjectionMatrix (_camera.projectionMatrix, true); + currentViewProjMat = projMat * viewMat; + + if(_camera.stereoEnabled) + { + for (int eye = 0; eye < 2; ++eye) + { + Matrix4x4 stereoViewMat = _camera.GetStereoViewMatrix(eye == 0 ? Camera.StereoscopicEye.Left : Camera.StereoscopicEye.Right); + Matrix4x4 stereoProjMat = _camera.GetStereoProjectionMatrix(eye == 0 ? Camera.StereoscopicEye.Left : Camera.StereoscopicEye.Right); + stereoProjMat = GL.GetGPUProjectionMatrix(stereoProjMat, true); + currentStereoViewProjMat[eye] = stereoProjMat * stereoViewMat; + } + } + } + + + new void Start () { + CheckResources (); + + if (_camera == null) + _camera = GetComponent(); + + wasActive = gameObject.activeInHierarchy; + currentStereoViewProjMat = new Matrix4x4[2]; + prevStereoViewProjMat = new Matrix4x4[2]; + CalculateViewProjection (); + Remember (); + wasActive = false; // hack to fake position/rotation update and prevent bad blurs + } + + void OnEnable () { + + if (_camera == null) + _camera = GetComponent(); + + _camera.depthTextureMode |= DepthTextureMode.Depth; + } + + void OnDisable () { + if (null != motionBlurMaterial) { + DestroyImmediate (motionBlurMaterial); + motionBlurMaterial = null; + } + if (null != dx11MotionBlurMaterial) { + DestroyImmediate (dx11MotionBlurMaterial); + dx11MotionBlurMaterial = null; + } + if (null != tmpCam) { + DestroyImmediate (tmpCam); + tmpCam = null; + } + } + + + public override bool CheckResources () { + CheckSupport (true, true); // depth & hdr needed + motionBlurMaterial = CheckShaderAndCreateMaterial (shader, motionBlurMaterial); + + if (supportDX11 && filterType == MotionBlurFilter.ReconstructionDX11) { + dx11MotionBlurMaterial = CheckShaderAndCreateMaterial (dx11MotionBlurShader, dx11MotionBlurMaterial); + } + + if (!isSupported) + ReportAutoDisable (); + + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (false == CheckResources ()) { + Graphics.Blit (source, destination); + return; + } + + if (filterType == MotionBlurFilter.CameraMotion) + StartFrame (); + + // use if possible new RG format ... fallback to half otherwise + var rtFormat= SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.RGHalf) ? RenderTextureFormat.RGHalf : RenderTextureFormat.ARGBHalf; + + // get temp textures + RenderTexture velBuffer = RenderTexture.GetTemporary (divRoundUp (source.width, velocityDownsample), divRoundUp (source.height, velocityDownsample), 0, rtFormat); + int tileWidth = 1; + int tileHeight = 1; + maxVelocity = Mathf.Max (2.0f, maxVelocity); + + float _maxVelocity = maxVelocity; // calculate 'k' + // note: 's' is hardcoded in shaders except for DX11 path + + // auto DX11 fallback! + bool fallbackFromDX11 = filterType == MotionBlurFilter.ReconstructionDX11 && dx11MotionBlurMaterial == null; + + if (filterType == MotionBlurFilter.Reconstruction || fallbackFromDX11 || filterType == MotionBlurFilter.ReconstructionDisc) { + maxVelocity = Mathf.Min (maxVelocity, MAX_RADIUS); + tileWidth = divRoundUp (velBuffer.width, (int) maxVelocity); + tileHeight = divRoundUp (velBuffer.height, (int) maxVelocity); + _maxVelocity = velBuffer.width/tileWidth; + } + else { + tileWidth = divRoundUp (velBuffer.width, (int) maxVelocity); + tileHeight = divRoundUp (velBuffer.height, (int) maxVelocity); + _maxVelocity = velBuffer.width/tileWidth; + } + + RenderTexture tileMax = RenderTexture.GetTemporary (tileWidth, tileHeight, 0, rtFormat); + RenderTexture neighbourMax = RenderTexture.GetTemporary (tileWidth, tileHeight, 0, rtFormat); + velBuffer.filterMode = FilterMode.Point; + tileMax.filterMode = FilterMode.Point; + neighbourMax.filterMode = FilterMode.Point; + if (noiseTexture) noiseTexture.filterMode = FilterMode.Point; + source.wrapMode = TextureWrapMode.Clamp; + velBuffer.wrapMode = TextureWrapMode.Clamp; + neighbourMax.wrapMode = TextureWrapMode.Clamp; + tileMax.wrapMode = TextureWrapMode.Clamp; + + // calc correct viewprj matrix + CalculateViewProjection (); + + // just started up? + if (gameObject.activeInHierarchy && !wasActive) { + Remember (); + } + wasActive = gameObject.activeInHierarchy; + + // matrices + Matrix4x4 invViewPrj = Matrix4x4.Inverse (currentViewProjMat); + motionBlurMaterial.SetMatrix ("_InvViewProj", invViewPrj); + motionBlurMaterial.SetMatrix ("_PrevViewProj", prevViewProjMat); + motionBlurMaterial.SetMatrix ("_ToPrevViewProjCombined", prevViewProjMat * invViewPrj); + if(_camera.stereoEnabled) + { + Matrix4x4[] invStereoViewPrj = new Matrix4x4[2]; + invStereoViewPrj[0] = Matrix4x4.Inverse(currentStereoViewProjMat[0]); + invStereoViewPrj[1] = Matrix4x4.Inverse(currentStereoViewProjMat[1]); + + Matrix4x4 combined = prevStereoViewProjMat[0] * invStereoViewPrj[0]; + motionBlurMaterial.SetMatrix("_StereoToPrevViewProjCombined0", combined); + motionBlurMaterial.SetMatrix("_StereoToPrevViewProjCombined1", prevStereoViewProjMat[1] * invStereoViewPrj[1]); + } + + motionBlurMaterial.SetFloat ("_MaxVelocity", _maxVelocity); + motionBlurMaterial.SetFloat ("_MaxRadiusOrKInPaper", _maxVelocity); + motionBlurMaterial.SetFloat ("_MinVelocity", minVelocity); + motionBlurMaterial.SetFloat ("_VelocityScale", velocityScale); + motionBlurMaterial.SetFloat ("_Jitter", jitter); + + // texture samplers + motionBlurMaterial.SetTexture ("_NoiseTex", noiseTexture); + motionBlurMaterial.SetTexture ("_VelTex", velBuffer); + motionBlurMaterial.SetTexture ("_NeighbourMaxTex", neighbourMax); + motionBlurMaterial.SetTexture ("_TileTexDebug", tileMax); + + if (preview) { + // generate an artificial 'previous' matrix to simulate blur look + Matrix4x4 viewMat = _camera.worldToCameraMatrix; + Matrix4x4 offset = Matrix4x4.identity; + offset.SetTRS(previewScale * 0.3333f, Quaternion.identity, Vector3.one); // using only translation + Matrix4x4 projMat = GL.GetGPUProjectionMatrix (_camera.projectionMatrix, true); + prevViewProjMat = projMat * offset * viewMat; + motionBlurMaterial.SetMatrix ("_PrevViewProj", prevViewProjMat); + motionBlurMaterial.SetMatrix ("_ToPrevViewProjCombined", prevViewProjMat * invViewPrj); + } + + if (filterType == MotionBlurFilter.CameraMotion) + { + // build blur vector to be used in shader to create a global blur direction + Vector4 blurVector = Vector4.zero; + + float lookUpDown = Vector3.Dot (transform.up, Vector3.up); + Vector3 distanceVector = prevFramePos-transform.position; + + float distMag = distanceVector.magnitude; + + float farHeur = 1.0f; + + // pitch (vertical) + farHeur = (Vector3.Angle (transform.up, prevFrameUp) / _camera.fieldOfView) * (source.width * 0.75f); + blurVector.x = rotationScale * farHeur;//Mathf.Clamp01((1.0ff-Vector3.Dot(transform.up, prevFrameUp))); + + // yaw #1 (horizontal, faded by pitch) + farHeur = (Vector3.Angle (transform.forward, prevFrameForward) / _camera.fieldOfView) * (source.width * 0.75f); + blurVector.y = rotationScale * lookUpDown * farHeur;//Mathf.Clamp01((1.0ff-Vector3.Dot(transform.forward, prevFrameForward))); + + // yaw #2 (when looking down, faded by 1-pitch) + farHeur = (Vector3.Angle (transform.forward, prevFrameForward) / _camera.fieldOfView) * (source.width * 0.75f); + blurVector.z = rotationScale * (1.0f- lookUpDown) * farHeur;//Mathf.Clamp01((1.0ff-Vector3.Dot(transform.forward, prevFrameForward))); + + if (distMag > Mathf.Epsilon && movementScale > Mathf.Epsilon) { + // forward (probably most important) + blurVector.w = movementScale * (Vector3.Dot (transform.forward, distanceVector) ) * (source.width * 0.5f); + // jump (maybe scale down further) + blurVector.x += movementScale * (Vector3.Dot (transform.up, distanceVector) ) * (source.width * 0.5f); + // strafe (maybe scale down further) + blurVector.y += movementScale * (Vector3.Dot (transform.right, distanceVector) ) * (source.width * 0.5f); + } + + if (preview) // crude approximation + motionBlurMaterial.SetVector ("_BlurDirectionPacked", new Vector4 (previewScale.y, previewScale.x, 0.0f, previewScale.z) * 0.5f * _camera.fieldOfView); + else + motionBlurMaterial.SetVector ("_BlurDirectionPacked", blurVector); + } + else { + // generate velocity buffer + Graphics.Blit (source, velBuffer, motionBlurMaterial, 0); + + // patch up velocity buffer: + + // exclude certain layers (e.g. skinned objects as we cant really support that atm) + + Camera cam = null; + if (excludeLayers.value != 0)// || dynamicLayers.value) + cam = GetTmpCam (); + + if (cam && excludeLayers.value != 0 && replacementClear && replacementClear.isSupported) { + cam.targetTexture = velBuffer; + cam.cullingMask = excludeLayers; + cam.RenderWithShader (replacementClear, ""); + } + } + + if (!preview && Time.frameCount != prevFrameCount) { + // remember current transformation data for next frame + prevFrameCount = Time.frameCount; + Remember (); + } + + source.filterMode = FilterMode.Bilinear; + + // debug vel buffer: + if (showVelocity) { + // generate tile max and neighbour max + //Graphics.Blit (velBuffer, tileMax, motionBlurMaterial, 2); + //Graphics.Blit (tileMax, neighbourMax, motionBlurMaterial, 3); + motionBlurMaterial.SetFloat ("_DisplayVelocityScale", showVelocityScale); + Graphics.Blit (velBuffer, destination, motionBlurMaterial, 1); + } + else { + if (filterType == MotionBlurFilter.ReconstructionDX11 && !fallbackFromDX11) { + // need to reset some parameters for dx11 shader + dx11MotionBlurMaterial.SetFloat ("_MinVelocity", minVelocity); + dx11MotionBlurMaterial.SetFloat ("_VelocityScale", velocityScale); + dx11MotionBlurMaterial.SetFloat ("_Jitter", jitter); + + // texture samplers + dx11MotionBlurMaterial.SetTexture ("_NoiseTex", noiseTexture); + dx11MotionBlurMaterial.SetTexture ("_VelTex", velBuffer); + dx11MotionBlurMaterial.SetTexture ("_NeighbourMaxTex", neighbourMax); + + dx11MotionBlurMaterial.SetFloat ("_SoftZDistance", Mathf.Max(0.00025f, softZDistance) ); + dx11MotionBlurMaterial.SetFloat ("_MaxRadiusOrKInPaper", _maxVelocity); + + // generate tile max and neighbour max + Graphics.Blit (velBuffer, tileMax, dx11MotionBlurMaterial, 0); + Graphics.Blit (tileMax, neighbourMax, dx11MotionBlurMaterial, 1); + + // final blur + Graphics.Blit (source, destination, dx11MotionBlurMaterial, 2); + } + else if (filterType == MotionBlurFilter.Reconstruction || fallbackFromDX11) { + // 'reconstructing' properly integrated color + motionBlurMaterial.SetFloat ("_SoftZDistance", Mathf.Max(0.00025f, softZDistance) ); + + // generate tile max and neighbour max + Graphics.Blit (velBuffer, tileMax, motionBlurMaterial, 2); + Graphics.Blit (tileMax, neighbourMax, motionBlurMaterial, 3); + + // final blur + Graphics.Blit (source, destination, motionBlurMaterial, 4); + } + else if (filterType == MotionBlurFilter.CameraMotion) { + // orange box style motion blur + Graphics.Blit (source, destination, motionBlurMaterial, 6); + } + else if (filterType == MotionBlurFilter.ReconstructionDisc) { + // dof style motion blur defocuing and ellipse around the princical blur direction + // 'reconstructing' properly integrated color + motionBlurMaterial.SetFloat ("_SoftZDistance", Mathf.Max(0.00025f, softZDistance) ); + + // generate tile max and neighbour max + Graphics.Blit (velBuffer, tileMax, motionBlurMaterial, 2); + Graphics.Blit (tileMax, neighbourMax, motionBlurMaterial, 3); + + Graphics.Blit (source, destination, motionBlurMaterial, 7); + } + else { + // simple & fast blur (low quality): just blurring along velocity + Graphics.Blit (source, destination, motionBlurMaterial, 5); + } + } + + // cleanup + RenderTexture.ReleaseTemporary (velBuffer); + RenderTexture.ReleaseTemporary (tileMax); + RenderTexture.ReleaseTemporary (neighbourMax); + } + + void Remember () { + prevViewProjMat = currentViewProjMat; + prevFrameForward = transform.forward; + prevFrameUp = transform.up; + prevFramePos = transform.position; + prevStereoViewProjMat[0] = currentStereoViewProjMat[0]; + prevStereoViewProjMat[1] = currentStereoViewProjMat[1]; + } + + Camera GetTmpCam () { + if (tmpCam == null) { + string name = "_" + _camera.name + "_MotionBlurTmpCam"; + GameObject go = GameObject.Find (name); + if (null == go) // couldn't find, recreate + tmpCam = new GameObject (name, typeof (Camera)); + else + tmpCam = go; + } + + tmpCam.hideFlags = HideFlags.DontSave; + tmpCam.transform.position = _camera.transform.position; + tmpCam.transform.rotation = _camera.transform.rotation; + tmpCam.transform.localScale = _camera.transform.localScale; + tmpCam.GetComponent().CopyFrom(_camera); + + tmpCam.GetComponent().enabled = false; + tmpCam.GetComponent().depthTextureMode = DepthTextureMode.None; + tmpCam.GetComponent().clearFlags = CameraClearFlags.Nothing; + + return tmpCam.GetComponent(); + } + + void StartFrame () { + // take only x% of positional changes into account (camera motion) + // TODO: possibly do the same for rotational part + prevFramePos = Vector3.Slerp(prevFramePos, transform.position, 0.75f); + } + + static int divRoundUp (int x, int d) + { + return (x + d - 1) / d; + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/CameraMotionBlur.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CameraMotionBlur.cs.meta new file mode 100644 index 0000000..ef18200 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CameraMotionBlur.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 97e9b95cf609d96409b6c40519432957 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: 85a88efa8c871af4a9d17c64791b6f4f, type: 3} + - dx11MotionBlurShader: {fileID: 4800000, guid: f1b13d7a80660504a858ea24cfa418c6, + type: 3} + - replacementClear: {fileID: 4800000, guid: 7699c5fbfa27745a1abe111ab7bf9785, type: 3} + - noiseTexture: {fileID: 2800000, guid: 31f5a8611c4ed1245b18456206e798dc, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionCurves.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionCurves.cs new file mode 100644 index 0000000..0425da9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionCurves.cs @@ -0,0 +1,181 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu ("Image Effects/Color Adjustments/Color Correction (Curves, Saturation)")] + public class ColorCorrectionCurves : PostEffectsBase + { + public enum ColorCorrectionMode + { + Simple = 0, + Advanced = 1 + } + + public AnimationCurve redChannel = new AnimationCurve(new Keyframe(0f,0f), new Keyframe(1f,1f)); + public AnimationCurve greenChannel = new AnimationCurve(new Keyframe(0f,0f), new Keyframe(1f,1f)); + public AnimationCurve blueChannel = new AnimationCurve(new Keyframe(0f,0f), new Keyframe(1f,1f)); + + public bool useDepthCorrection = false; + + public AnimationCurve zCurve = new AnimationCurve(new Keyframe(0f,0f), new Keyframe(1f,1f)); + public AnimationCurve depthRedChannel = new AnimationCurve(new Keyframe(0f,0f), new Keyframe(1f,1f)); + public AnimationCurve depthGreenChannel = new AnimationCurve(new Keyframe(0f,0f), new Keyframe(1f,1f)); + public AnimationCurve depthBlueChannel = new AnimationCurve(new Keyframe(0f,0f), new Keyframe(1f,1f)); + + private Material ccMaterial; + private Material ccDepthMaterial; + private Material selectiveCcMaterial; + + private Texture2D rgbChannelTex; + private Texture2D rgbDepthChannelTex; + private Texture2D zCurveTex; + + public float saturation = 1.0f; + + public bool selectiveCc = false; + + public Color selectiveFromColor = Color.white; + public Color selectiveToColor = Color.white; + + public ColorCorrectionMode mode; + + public bool updateTextures = true; + + public Shader colorCorrectionCurvesShader = null; + public Shader simpleColorCorrectionCurvesShader = null; + public Shader colorCorrectionSelectiveShader = null; + + private bool updateTexturesOnStartup = true; + + + new void Start () + { + base.Start (); + updateTexturesOnStartup = true; + } + + void Awake () { } + + + public override bool CheckResources () + { + CheckSupport (mode == ColorCorrectionMode.Advanced); + + ccMaterial = CheckShaderAndCreateMaterial (simpleColorCorrectionCurvesShader, ccMaterial); + ccDepthMaterial = CheckShaderAndCreateMaterial (colorCorrectionCurvesShader, ccDepthMaterial); + selectiveCcMaterial = CheckShaderAndCreateMaterial (colorCorrectionSelectiveShader, selectiveCcMaterial); + + if (!rgbChannelTex) + rgbChannelTex = new Texture2D (256, 4, TextureFormat.ARGB32, false, true); + if (!rgbDepthChannelTex) + rgbDepthChannelTex = new Texture2D (256, 4, TextureFormat.ARGB32, false, true); + if (!zCurveTex) + zCurveTex = new Texture2D (256, 1, TextureFormat.ARGB32, false, true); + + rgbChannelTex.hideFlags = HideFlags.DontSave; + rgbDepthChannelTex.hideFlags = HideFlags.DontSave; + zCurveTex.hideFlags = HideFlags.DontSave; + + rgbChannelTex.wrapMode = TextureWrapMode.Clamp; + rgbDepthChannelTex.wrapMode = TextureWrapMode.Clamp; + zCurveTex.wrapMode = TextureWrapMode.Clamp; + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + public void UpdateParameters () + { + CheckResources(); // textures might not be created if we're tweaking UI while disabled + + if (redChannel != null && greenChannel != null && blueChannel != null) + { + for (float i = 0.0f; i <= 1.0f; i += 1.0f / 255.0f) + { + float rCh = Mathf.Clamp (redChannel.Evaluate(i), 0.0f, 1.0f); + float gCh = Mathf.Clamp (greenChannel.Evaluate(i), 0.0f, 1.0f); + float bCh = Mathf.Clamp (blueChannel.Evaluate(i), 0.0f, 1.0f); + + rgbChannelTex.SetPixel ((int) Mathf.Floor(i*255.0f), 0, new Color(rCh,rCh,rCh) ); + rgbChannelTex.SetPixel ((int) Mathf.Floor(i*255.0f), 1, new Color(gCh,gCh,gCh) ); + rgbChannelTex.SetPixel ((int) Mathf.Floor(i*255.0f), 2, new Color(bCh,bCh,bCh) ); + + float zC = Mathf.Clamp (zCurve.Evaluate(i), 0.0f,1.0f); + + zCurveTex.SetPixel ((int) Mathf.Floor(i*255.0f), 0, new Color(zC,zC,zC) ); + + rCh = Mathf.Clamp (depthRedChannel.Evaluate(i), 0.0f,1.0f); + gCh = Mathf.Clamp (depthGreenChannel.Evaluate(i), 0.0f,1.0f); + bCh = Mathf.Clamp (depthBlueChannel.Evaluate(i), 0.0f,1.0f); + + rgbDepthChannelTex.SetPixel ((int) Mathf.Floor(i*255.0f), 0, new Color(rCh,rCh,rCh) ); + rgbDepthChannelTex.SetPixel ((int) Mathf.Floor(i*255.0f), 1, new Color(gCh,gCh,gCh) ); + rgbDepthChannelTex.SetPixel ((int) Mathf.Floor(i*255.0f), 2, new Color(bCh,bCh,bCh) ); + } + + rgbChannelTex.Apply (); + rgbDepthChannelTex.Apply (); + zCurveTex.Apply (); + } + } + + void UpdateTextures () + { + UpdateParameters (); + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources()==false) + { + Graphics.Blit (source, destination); + return; + } + + if (updateTexturesOnStartup) + { + UpdateParameters (); + updateTexturesOnStartup = false; + } + + if (useDepthCorrection) + GetComponent().depthTextureMode |= DepthTextureMode.Depth; + + RenderTexture renderTarget2Use = destination; + + if (selectiveCc) + { + renderTarget2Use = RenderTexture.GetTemporary (source.width, source.height); + } + + if (useDepthCorrection) + { + ccDepthMaterial.SetTexture ("_RgbTex", rgbChannelTex); + ccDepthMaterial.SetTexture ("_ZCurve", zCurveTex); + ccDepthMaterial.SetTexture ("_RgbDepthTex", rgbDepthChannelTex); + ccDepthMaterial.SetFloat ("_Saturation", saturation); + + Graphics.Blit (source, renderTarget2Use, ccDepthMaterial); + } + else + { + ccMaterial.SetTexture ("_RgbTex", rgbChannelTex); + ccMaterial.SetFloat ("_Saturation", saturation); + + Graphics.Blit (source, renderTarget2Use, ccMaterial); + } + + if (selectiveCc) + { + selectiveCcMaterial.SetColor ("selColor", selectiveFromColor); + selectiveCcMaterial.SetColor ("targetColor", selectiveToColor); + Graphics.Blit (renderTarget2Use, destination, selectiveCcMaterial); + + RenderTexture.ReleaseTemporary (renderTarget2Use); + } + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionCurves.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionCurves.cs.meta new file mode 100644 index 0000000..e60e166 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionCurves.cs.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 1fd999d1b2cf94a45a5b0a47ce074bef +MonoImporter: + serializedVersion: 2 + defaultReferences: + - colorCorrectionCurvesShader: {fileID: 4800000, guid: 62bcade1028c24ca1a39760ed84b9487, + type: 3} + - simpleColorCorrectionCurvesShader: {fileID: 4800000, guid: 438ddd58d82c84d9eb1fdc56111702e1, + type: 3} + - colorCorrectionSelectiveShader: {fileID: 4800000, guid: e515e0f94cefc4c0db54b45cba621544, + type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionLookup.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionLookup.cs new file mode 100644 index 0000000..e85bb59 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionLookup.cs @@ -0,0 +1,130 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu ("Image Effects/Color Adjustments/Color Correction (3D Lookup Texture)")] + public class ColorCorrectionLookup : PostEffectsBase + { + public Shader shader; + private Material material; + + // serialize this instead of having another 2d texture ref'ed + public Texture3D converted3DLut = null; + public string basedOnTempTex = ""; + + + public override bool CheckResources () { + CheckSupport (false); + + material = CheckShaderAndCreateMaterial (shader, material); + + if (!isSupported || !SystemInfo.supports3DTextures) + ReportAutoDisable (); + return isSupported; + } + + void OnDisable () { + if (material) { + DestroyImmediate (material); + material = null; + } + } + + void OnDestroy () { + if (converted3DLut) + DestroyImmediate (converted3DLut); + converted3DLut = null; + } + + public void SetIdentityLut () { + int dim = 16; + var newC = new Color[dim*dim*dim]; + float oneOverDim = 1.0f / (1.0f * dim - 1.0f); + + for(int i = 0; i < dim; i++) { + for(int j = 0; j < dim; j++) { + for(int k = 0; k < dim; k++) { + newC[i + (j*dim) + (k*dim*dim)] = new Color((i*1.0f)*oneOverDim, (j*1.0f)*oneOverDim, (k*1.0f)*oneOverDim, 1.0f); + } + } + } + + if (converted3DLut) + DestroyImmediate (converted3DLut); + converted3DLut = new Texture3D (dim, dim, dim, TextureFormat.ARGB32, false); + converted3DLut.SetPixels (newC); + converted3DLut.Apply (); + basedOnTempTex = ""; + } + + public bool ValidDimensions ( Texture2D tex2d) { + if (!tex2d) return false; + int h = tex2d.height; + if (h != Mathf.FloorToInt(Mathf.Sqrt(tex2d.width))) { + return false; + } + return true; + } + + public void Convert ( Texture2D temp2DTex, string path) { + + // conversion fun: the given 2D texture needs to be of the format + // w * h, wheras h is the 'depth' (or 3d dimension 'dim') and w = dim * dim + + if (temp2DTex) { + int dim = temp2DTex.width * temp2DTex.height; + dim = temp2DTex.height; + + if (!ValidDimensions(temp2DTex)) { + Debug.LogWarning ("The given 2D texture " + temp2DTex.name + " cannot be used as a 3D LUT."); + basedOnTempTex = ""; + return; + } + + var c = temp2DTex.GetPixels(); + var newC = new Color[c.Length]; + + for(int i = 0; i < dim; i++) { + for(int j = 0; j < dim; j++) { + for(int k = 0; k < dim; k++) { + int j_ = dim-j-1; + newC[i + (j*dim) + (k*dim*dim)] = c[k*dim+i+j_*dim*dim]; + } + } + } + + if (converted3DLut) + DestroyImmediate (converted3DLut); + converted3DLut = new Texture3D (dim, dim, dim, TextureFormat.ARGB32, false); + converted3DLut.SetPixels (newC); + converted3DLut.Apply (); + basedOnTempTex = path; + } + else { + // error, something went terribly wrong + Debug.LogError ("Couldn't color correct with 3D LUT texture. Image Effect will be disabled."); + } + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (CheckResources () == false || !SystemInfo.supports3DTextures) { + Graphics.Blit (source, destination); + return; + } + + if (converted3DLut == null) { + SetIdentityLut (); + } + + int lutSize = converted3DLut.width; + converted3DLut.wrapMode = TextureWrapMode.Clamp; + material.SetFloat("_Scale", (lutSize - 1) / (1.0f*lutSize)); + material.SetFloat("_Offset", 1.0f / (2.0f * lutSize)); + material.SetTexture("_ClutTex", converted3DLut); + + Graphics.Blit (source, destination, material, QualitySettings.activeColorSpace == ColorSpace.Linear ? 1 : 0); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionLookup.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionLookup.cs.meta new file mode 100644 index 0000000..82f6837 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionLookup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8cde8c0fd649d9b46bb403ba5e157391 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: b61f0d8d8244b4b28aa66b0c8cb46a8d, type: 3} + - converted3DLut: {instanceID: 0} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionRamp.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionRamp.cs new file mode 100644 index 0000000..ae594f8 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionRamp.cs @@ -0,0 +1,17 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Color Adjustments/Color Correction (Ramp)")] + public class ColorCorrectionRamp : ImageEffectBase { + public Texture textureRamp; + + // Called by camera to apply image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) { + material.SetTexture ("_RampTex", textureRamp); + Graphics.Blit (source, destination, material); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionRamp.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionRamp.cs.meta new file mode 100644 index 0000000..009d841 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ColorCorrectionRamp.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ea59781cad112c75d0008dfa8d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: 67f8781cad112c75d0008dfa8d76c639, type: 3} + - textureRamp: {fileID: 2800000, guid: d440902fad11e807d00044888d76c639, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastEnhance.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastEnhance.cs new file mode 100644 index 0000000..00c2820 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastEnhance.cs @@ -0,0 +1,80 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent(typeof(Camera))] + [AddComponentMenu("Image Effects/Color Adjustments/Contrast Enhance (Unsharp Mask)")] + public class ContrastEnhance : PostEffectsBase + { + [Range(0.0f, 1.0f)] + public float intensity = 0.5f; + [Range(0.0f,0.999f)] + public float threshold = 0.0f; + + private Material separableBlurMaterial; + private Material contrastCompositeMaterial; + + [Range(0.0f,1.0f)] + public float blurSpread = 1.0f; + + public Shader separableBlurShader = null; + public Shader contrastCompositeShader = null; + + + public override bool CheckResources () + { + CheckSupport (false); + + contrastCompositeMaterial = CheckShaderAndCreateMaterial (contrastCompositeShader, contrastCompositeMaterial); + separableBlurMaterial = CheckShaderAndCreateMaterial (separableBlurShader, separableBlurMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources()==false) + { + Graphics.Blit (source, destination); + return; + } + + int rtW = source.width; + int rtH = source.height; + + RenderTexture color2 = RenderTexture.GetTemporary (rtW/2, rtH/2, 0); + + // downsample + + Graphics.Blit (source, color2); + RenderTexture color4a = RenderTexture.GetTemporary (rtW/4, rtH/4, 0); + Graphics.Blit (color2, color4a); + RenderTexture.ReleaseTemporary (color2); + + // blur + + separableBlurMaterial.SetVector ("offsets", new Vector4 (0.0f, (blurSpread * 1.0f) / color4a.height, 0.0f, 0.0f)); + RenderTexture color4b = RenderTexture.GetTemporary (rtW/4, rtH/4, 0); + Graphics.Blit (color4a, color4b, separableBlurMaterial); + RenderTexture.ReleaseTemporary (color4a); + + separableBlurMaterial.SetVector ("offsets", new Vector4 ((blurSpread * 1.0f) / color4a.width, 0.0f, 0.0f, 0.0f)); + color4a = RenderTexture.GetTemporary (rtW/4, rtH/4, 0); + Graphics.Blit (color4b, color4a, separableBlurMaterial); + RenderTexture.ReleaseTemporary (color4b); + + // composite + + contrastCompositeMaterial.SetTexture ("_MainTexBlurred", color4a); + contrastCompositeMaterial.SetFloat ("intensity", intensity); + contrastCompositeMaterial.SetFloat ("threshold", threshold); + Graphics.Blit (source, destination, contrastCompositeMaterial); + + RenderTexture.ReleaseTemporary (color4a); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastEnhance.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastEnhance.cs.meta new file mode 100644 index 0000000..c469a7c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastEnhance.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 3309686a9fbbe6e42a182d5e0257704c +MonoImporter: + serializedVersion: 2 + defaultReferences: + - separableBlurShader: {fileID: 4800000, guid: e97c14fbb5ea04c3a902cc533d7fc5d1, + type: 3} + - contrastCompositeShader: {fileID: 4800000, guid: 273404942eede4ea1883ca1fb2942507, + type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastStretch.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastStretch.cs new file mode 100644 index 0000000..a349d5c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastStretch.cs @@ -0,0 +1,200 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Color Adjustments/Contrast Stretch")] + public class ContrastStretch : MonoBehaviour + { + /// Adaptation speed - percents per frame, if playing at 30FPS. + /// Default is 0.02 (2% each 1/30s). + [Range(0.0001f, 1.0f)] + public float adaptationSpeed = 0.02f; + + /// If our scene is really dark (or really bright), we might not want to + /// stretch its contrast to the full range. + /// limitMinimum=0, limitMaximum=1 is the same as not applying the effect at all. + /// limitMinimum=1, limitMaximum=0 is always stretching colors to full range. + + /// The limit on the minimum luminance (0...1) - we won't go above this. + [Range(0.0f,1.0f)] + public float limitMinimum = 0.2f; + + /// The limit on the maximum luminance (0...1) - we won't go below this. + [Range(0.0f, 1.0f)] + public float limitMaximum = 0.6f; + + + // To maintain adaptation levels over time, we need two 1x1 render textures + // and ping-pong between them. + private RenderTexture[] adaptRenderTex = new RenderTexture[2]; + private int curAdaptIndex = 0; + + + // Computes scene luminance (grayscale) image + public Shader shaderLum; + private Material m_materialLum; + protected Material materialLum { + get { + if ( m_materialLum == null ) { + m_materialLum = new Material(shaderLum); + m_materialLum.hideFlags = HideFlags.HideAndDontSave; + } + return m_materialLum; + } + } + + // Reduces size of the image by 2x2, while computing maximum/minimum values. + // By repeatedly applying this shader, we reduce the initial luminance image + // to 1x1 image with minimum/maximum luminances found. + public Shader shaderReduce; + private Material m_materialReduce; + protected Material materialReduce { + get { + if ( m_materialReduce == null ) { + m_materialReduce = new Material(shaderReduce); + m_materialReduce.hideFlags = HideFlags.HideAndDontSave; + } + return m_materialReduce; + } + } + + // Adaptation shader - gradually "adapts" minimum/maximum luminances, + // based on currently adapted 1x1 image and the actual 1x1 image of the current scene. + public Shader shaderAdapt; + private Material m_materialAdapt; + protected Material materialAdapt { + get { + if ( m_materialAdapt == null ) { + m_materialAdapt = new Material(shaderAdapt); + m_materialAdapt.hideFlags = HideFlags.HideAndDontSave; + } + return m_materialAdapt; + } + } + + // Final pass - stretches the color values of the original scene, based on currently + // adpated minimum/maximum values. + public Shader shaderApply; + private Material m_materialApply; + protected Material materialApply { + get { + if ( m_materialApply == null ) { + m_materialApply = new Material(shaderApply); + m_materialApply.hideFlags = HideFlags.HideAndDontSave; + } + return m_materialApply; + } + } + + void Start() + { + // Disable if we don't support image effects + if (!SystemInfo.supportsImageEffects) { + enabled = false; + return; + } + + if (!shaderAdapt.isSupported || !shaderApply.isSupported || !shaderLum.isSupported || !shaderReduce.isSupported) { + enabled = false; + return; + } + } + + void OnEnable() + { + for( int i = 0; i < 2; ++i ) + { + if ( !adaptRenderTex[i] ) { + adaptRenderTex[i] = new RenderTexture(1, 1, 0); + adaptRenderTex[i].hideFlags = HideFlags.HideAndDontSave; + } + } + } + + void OnDisable() + { + for( int i = 0; i < 2; ++i ) + { + DestroyImmediate( adaptRenderTex[i] ); + adaptRenderTex[i] = null; + } + if ( m_materialLum ) + DestroyImmediate( m_materialLum ); + if ( m_materialReduce ) + DestroyImmediate( m_materialReduce ); + if ( m_materialAdapt ) + DestroyImmediate( m_materialAdapt ); + if ( m_materialApply ) + DestroyImmediate( m_materialApply ); + } + + + /// Apply the filter + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + // Blit to smaller RT and convert to luminance on the way + const int TEMP_RATIO = 1; // 4x4 smaller + RenderTexture rtTempSrc = RenderTexture.GetTemporary(source.width/TEMP_RATIO, source.height/TEMP_RATIO); + Graphics.Blit (source, rtTempSrc, materialLum); + + // Repeatedly reduce this image in size, computing min/max luminance values + // In the end we'll have 1x1 image with min/max luminances found. + const int FINAL_SIZE = 1; + //const int FINAL_SIZE = 1; + while( rtTempSrc.width > FINAL_SIZE || rtTempSrc.height > FINAL_SIZE ) + { + const int REDUCE_RATIO = 2; // our shader does 2x2 reduction + int destW = rtTempSrc.width / REDUCE_RATIO; + if ( destW < FINAL_SIZE ) destW = FINAL_SIZE; + int destH = rtTempSrc.height / REDUCE_RATIO; + if ( destH < FINAL_SIZE ) destH = FINAL_SIZE; + RenderTexture rtTempDst = RenderTexture.GetTemporary(destW,destH); + Graphics.Blit (rtTempSrc, rtTempDst, materialReduce); + + // Release old src temporary, and make new temporary the source + RenderTexture.ReleaseTemporary( rtTempSrc ); + rtTempSrc = rtTempDst; + } + + // Update viewer's adaptation level + CalculateAdaptation( rtTempSrc ); + + // Apply contrast strech to the original scene, using currently adapted parameters + materialApply.SetTexture("_AdaptTex", adaptRenderTex[curAdaptIndex] ); + Graphics.Blit (source, destination, materialApply); + + RenderTexture.ReleaseTemporary( rtTempSrc ); + } + + + /// Helper function to do gradual adaptation to min/max luminances + private void CalculateAdaptation( Texture curTexture ) + { + int prevAdaptIndex = curAdaptIndex; + curAdaptIndex = (curAdaptIndex+1) % 2; + + // Adaptation speed is expressed in percents/frame, based on 30FPS. + // Calculate the adaptation lerp, based on current FPS. + float adaptLerp = 1.0f - Mathf.Pow( 1.0f - adaptationSpeed, 30.0f * Time.deltaTime ); + const float kMinAdaptLerp = 0.01f; + adaptLerp = Mathf.Clamp( adaptLerp, kMinAdaptLerp, 1 ); + + materialAdapt.SetTexture("_CurTex", curTexture ); + materialAdapt.SetVector("_AdaptParams", new Vector4( + adaptLerp, + limitMinimum, + limitMaximum, + 0.0f + )); + // clear destination RT so its contents don't need to be restored + Graphics.SetRenderTarget(adaptRenderTex[curAdaptIndex]); + GL.Clear(false, true, Color.black); + Graphics.Blit ( + adaptRenderTex[prevAdaptIndex], + adaptRenderTex[curAdaptIndex], + materialAdapt); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastStretch.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastStretch.cs.meta new file mode 100644 index 0000000..a9285bb --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ContrastStretch.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ec92b071d2d424aecb3e46f28eb63174 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shaderLum: {fileID: 4800000, guid: befbb4b9c320b4b18a08ef7afb93b6c9, type: 3} + - shaderReduce: {fileID: 4800000, guid: 57b33a14b6d5347c5a85c36f6cb3b280, type: 3} + - shaderAdapt: {fileID: 4800000, guid: 257bc83cbeb544540bd0e558aa9b1383, type: 3} + - shaderApply: {fileID: 4800000, guid: f4901f25d4e1542589348bbb89563d8e, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/CreaseShading.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CreaseShading.cs new file mode 100644 index 0000000..a26d007 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CreaseShading.cs @@ -0,0 +1,82 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Edge Detection/Crease Shading")] + public class CreaseShading : PostEffectsBase + { + public float intensity = 0.5f; + public int softness = 1; + public float spread = 1.0f; + + public Shader blurShader = null; + private Material blurMaterial = null; + + public Shader depthFetchShader = null; + private Material depthFetchMaterial = null; + + public Shader creaseApplyShader = null; + private Material creaseApplyMaterial = null; + + + public override bool CheckResources () + { + CheckSupport (true); + + blurMaterial = CheckShaderAndCreateMaterial (blurShader, blurMaterial); + depthFetchMaterial = CheckShaderAndCreateMaterial (depthFetchShader, depthFetchMaterial); + creaseApplyMaterial = CheckShaderAndCreateMaterial (creaseApplyShader, creaseApplyMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources()==false) + { + Graphics.Blit (source, destination); + return; + } + + int rtW = source.width; + int rtH = source.height; + + float widthOverHeight = (1.0f * rtW) / (1.0f * rtH); + float oneOverBaseSize = 1.0f / 512.0f; + + RenderTexture hrTex = RenderTexture.GetTemporary (rtW, rtH, 0); + RenderTexture lrTex1 = RenderTexture.GetTemporary (rtW/2, rtH/2, 0); + + Graphics.Blit (source,hrTex, depthFetchMaterial); + Graphics.Blit (hrTex, lrTex1); + + for(int i = 0; i < softness; i++) + { + RenderTexture lrTex2 = RenderTexture.GetTemporary (rtW/2, rtH/2, 0); + blurMaterial.SetVector ("offsets", new Vector4 (0.0f, spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (lrTex1, lrTex2, blurMaterial); + RenderTexture.ReleaseTemporary (lrTex1); + lrTex1 = lrTex2; + + lrTex2 = RenderTexture.GetTemporary (rtW/2, rtH/2, 0); + blurMaterial.SetVector ("offsets", new Vector4 (spread * oneOverBaseSize / widthOverHeight, 0.0f, 0.0f, 0.0f)); + Graphics.Blit (lrTex1, lrTex2, blurMaterial); + RenderTexture.ReleaseTemporary (lrTex1); + lrTex1 = lrTex2; + } + + creaseApplyMaterial.SetTexture ("_HrDepthTex", hrTex); + creaseApplyMaterial.SetTexture ("_LrDepthTex", lrTex1); + creaseApplyMaterial.SetFloat ("intensity", intensity); + Graphics.Blit (source,destination, creaseApplyMaterial); + + RenderTexture.ReleaseTemporary (hrTex); + RenderTexture.ReleaseTemporary (lrTex1); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/CreaseShading.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CreaseShading.cs.meta new file mode 100644 index 0000000..c6ebebe --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/CreaseShading.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d64b4f3a592f28b44bf19223ac8b6cd2 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - blurShader: {fileID: 4800000, guid: e97c14fbb5ea04c3a902cc533d7fc5d1, type: 3} + - depthFetchShader: {fileID: 4800000, guid: 14768d3865b1342e3a861fbe19ba2db2, type: 3} + - creaseApplyShader: {fileID: 4800000, guid: b59984d82af624bd3b0c777f038276f2, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfField.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfField.cs new file mode 100644 index 0000000..59aee65 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfField.cs @@ -0,0 +1,387 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Camera/Depth of Field (Lens Blur, Scatter, DX11)") ] + public class DepthOfField : PostEffectsBase { + + public bool visualizeFocus = false; + public float focalLength = 10.0f; + public float focalSize = 0.05f; + public float aperture = 0.5f; + public Transform focalTransform = null; + public float maxBlurSize = 2.0f; + public bool highResolution = false; + + public enum BlurType { + DiscBlur = 0, + DX11 = 1, + } + + public enum BlurSampleCount { + Low = 0, + Medium = 1, + High = 2, + } + + public BlurType blurType = BlurType.DiscBlur; + public BlurSampleCount blurSampleCount = BlurSampleCount.High; + + public bool nearBlur = false; + public float foregroundOverlap = 1.0f; + + public Shader dofHdrShader; + private Material dofHdrMaterial = null; + + public Shader dx11BokehShader; + private Material dx11bokehMaterial; + + public float dx11BokehThreshold = 0.5f; + public float dx11SpawnHeuristic = 0.0875f; + public Texture2D dx11BokehTexture = null; + public float dx11BokehScale = 1.2f; + public float dx11BokehIntensity = 2.5f; + + private float focalDistance01 = 10.0f; + private ComputeBuffer cbDrawArgs; + private ComputeBuffer cbPoints; + private float internalBlurWidth = 1.0f; + + private Camera cachedCamera; + + public override bool CheckResources () { + CheckSupport (true); // only requires depth, not HDR + + dofHdrMaterial = CheckShaderAndCreateMaterial (dofHdrShader, dofHdrMaterial); + if (supportDX11 && blurType == BlurType.DX11) { + dx11bokehMaterial = CheckShaderAndCreateMaterial(dx11BokehShader, dx11bokehMaterial); + CreateComputeResources (); + } + + if (!isSupported) + ReportAutoDisable (); + + return isSupported; + } + + void OnEnable () { + cachedCamera = GetComponent(); + cachedCamera.depthTextureMode |= DepthTextureMode.Depth; + } + + void OnDisable () { + ReleaseComputeResources (); + + if (dofHdrMaterial) DestroyImmediate(dofHdrMaterial); + dofHdrMaterial = null; + if (dx11bokehMaterial) DestroyImmediate(dx11bokehMaterial); + dx11bokehMaterial = null; + } + + void ReleaseComputeResources () { + if (cbDrawArgs != null) cbDrawArgs.Release(); + cbDrawArgs = null; + if (cbPoints != null) cbPoints.Release(); + cbPoints = null; + } + + void CreateComputeResources () { + if (cbDrawArgs == null) + { + cbDrawArgs = new ComputeBuffer (1, 16, ComputeBufferType.IndirectArguments); + var args= new int[4]; + args[0] = 0; args[1] = 1; args[2] = 0; args[3] = 0; + cbDrawArgs.SetData (args); + } + if (cbPoints == null) + { + cbPoints = new ComputeBuffer (90000, 12+16, ComputeBufferType.Append); + } + } + + float FocalDistance01 ( float worldDist) { + return cachedCamera.WorldToViewportPoint((worldDist-cachedCamera.nearClipPlane) * cachedCamera.transform.forward + cachedCamera.transform.position).z / (cachedCamera.farClipPlane-cachedCamera.nearClipPlane); + } + + private void WriteCoc ( RenderTexture fromTo, bool fgDilate) { + dofHdrMaterial.SetTexture("_FgOverlap", null); + + if (nearBlur && fgDilate) { + + int rtW = fromTo.width/2; + int rtH = fromTo.height/2; + + // capture fg coc + RenderTexture temp2 = RenderTexture.GetTemporary (rtW, rtH, 0, fromTo.format); + Graphics.Blit (fromTo, temp2, dofHdrMaterial, 4); + + // special blur + float fgAdjustment = internalBlurWidth * foregroundOverlap; + + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, fgAdjustment , 0.0f, fgAdjustment)); + RenderTexture temp1 = RenderTexture.GetTemporary (rtW, rtH, 0, fromTo.format); + Graphics.Blit (temp2, temp1, dofHdrMaterial, 2); + RenderTexture.ReleaseTemporary(temp2); + + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (fgAdjustment, 0.0f, 0.0f, fgAdjustment)); + temp2 = RenderTexture.GetTemporary (rtW, rtH, 0, fromTo.format); + Graphics.Blit (temp1, temp2, dofHdrMaterial, 2); + RenderTexture.ReleaseTemporary(temp1); + + // "merge up" with background COC + dofHdrMaterial.SetTexture("_FgOverlap", temp2); + fromTo.MarkRestoreExpected(); // only touching alpha channel, RT restore expected + Graphics.Blit (fromTo, fromTo, dofHdrMaterial, 13); + RenderTexture.ReleaseTemporary(temp2); + } + else { + // capture full coc in alpha channel (fromTo is not read, but bound to detect screen flip) + fromTo.MarkRestoreExpected(); // only touching alpha channel, RT restore expected + Graphics.Blit (fromTo, fromTo, dofHdrMaterial, 0); + } + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (!CheckResources ()) { + Graphics.Blit (source, destination); + return; + } + + // clamp & prepare values so they make sense + + if (aperture < 0.0f) aperture = 0.0f; + if (maxBlurSize < 0.1f) maxBlurSize = 0.1f; + focalSize = Mathf.Clamp(focalSize, 0.0f, 2.0f); + internalBlurWidth = Mathf.Max(maxBlurSize, 0.0f); + + // focal & coc calculations + + focalDistance01 = (focalTransform) ? (cachedCamera.WorldToViewportPoint (focalTransform.position)).z / (cachedCamera.farClipPlane) : FocalDistance01 (focalLength); + dofHdrMaterial.SetVector("_CurveParams", new Vector4(1.0f, focalSize, (1.0f / (1.0f - aperture) - 1.0f), focalDistance01)); + + // possible render texture helpers + + RenderTexture rtLow = null; + RenderTexture rtLow2 = null; + RenderTexture rtSuperLow1 = null; + RenderTexture rtSuperLow2 = null; + float fgBlurDist = internalBlurWidth * foregroundOverlap; + + if (visualizeFocus) + { + + // + // 2. + // visualize coc + // + // + + WriteCoc (source, true); + Graphics.Blit (source, destination, dofHdrMaterial, 16); + } + else if ((blurType == BlurType.DX11) && dx11bokehMaterial) + { + + // + // 1. + // optimized dx11 bokeh scatter + // + // + + + if (highResolution) { + + internalBlurWidth = internalBlurWidth < 0.1f ? 0.1f : internalBlurWidth; + fgBlurDist = internalBlurWidth * foregroundOverlap; + + rtLow = RenderTexture.GetTemporary (source.width, source.height, 0, source.format); + + var dest2= RenderTexture.GetTemporary (source.width, source.height, 0, source.format); + + // capture COC + WriteCoc (source, false); + + // blur a bit so we can do a frequency check + rtSuperLow1 = RenderTexture.GetTemporary(source.width>>1, source.height>>1, 0, source.format); + rtSuperLow2 = RenderTexture.GetTemporary(source.width>>1, source.height>>1, 0, source.format); + + Graphics.Blit(source, rtSuperLow1, dofHdrMaterial, 15); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, 1.5f , 0.0f, 1.5f)); + Graphics.Blit (rtSuperLow1, rtSuperLow2, dofHdrMaterial, 19); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (1.5f, 0.0f, 0.0f, 1.5f)); + Graphics.Blit (rtSuperLow2, rtSuperLow1, dofHdrMaterial, 19); + + // capture fg coc + if (nearBlur) + Graphics.Blit (source, rtSuperLow2, dofHdrMaterial, 4); + + dx11bokehMaterial.SetTexture ("_BlurredColor", rtSuperLow1); + dx11bokehMaterial.SetFloat ("_SpawnHeuristic", dx11SpawnHeuristic); + dx11bokehMaterial.SetVector ("_BokehParams", new Vector4(dx11BokehScale, dx11BokehIntensity, Mathf.Clamp(dx11BokehThreshold, 0.005f, 4.0f), internalBlurWidth)); + dx11bokehMaterial.SetTexture ("_FgCocMask", nearBlur ? rtSuperLow2 : null); + + // collect bokeh candidates and replace with a darker pixel + Graphics.SetRandomWriteTarget (1, cbPoints); + Graphics.Blit (source, rtLow, dx11bokehMaterial, 0); + Graphics.ClearRandomWriteTargets (); + + // fg coc blur happens here (after collect!) + if (nearBlur) { + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, fgBlurDist , 0.0f, fgBlurDist)); + Graphics.Blit (rtSuperLow2, rtSuperLow1, dofHdrMaterial, 2); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (fgBlurDist, 0.0f, 0.0f, fgBlurDist)); + Graphics.Blit (rtSuperLow1, rtSuperLow2, dofHdrMaterial, 2); + + // merge fg coc with bg coc + Graphics.Blit (rtSuperLow2, rtLow, dofHdrMaterial, 3); + } + + // NEW: LAY OUT ALPHA on destination target so we get nicer outlines for the high rez version + Graphics.Blit (rtLow, dest2, dofHdrMaterial, 20); + + // box blur (easier to merge with bokeh buffer) + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (internalBlurWidth, 0.0f , 0.0f, internalBlurWidth)); + Graphics.Blit (rtLow, source, dofHdrMaterial, 5); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, internalBlurWidth, 0.0f, internalBlurWidth)); + Graphics.Blit (source, dest2, dofHdrMaterial, 21); + + // apply bokeh candidates + Graphics.SetRenderTarget (dest2); + ComputeBuffer.CopyCount (cbPoints, cbDrawArgs, 0); + dx11bokehMaterial.SetBuffer ("pointBuffer", cbPoints); + dx11bokehMaterial.SetTexture ("_MainTex", dx11BokehTexture); + dx11bokehMaterial.SetVector ("_Screen", new Vector3(1.0f/(1.0f*source.width), 1.0f/(1.0f*source.height), internalBlurWidth)); + dx11bokehMaterial.SetPass (2); + + Graphics.DrawProceduralIndirect (MeshTopology.Points, cbDrawArgs, 0); + + Graphics.Blit (dest2, destination); // hackaround for DX11 high resolution flipfun (OPTIMIZEME) + + RenderTexture.ReleaseTemporary(dest2); + RenderTexture.ReleaseTemporary(rtSuperLow1); + RenderTexture.ReleaseTemporary(rtSuperLow2); + } + else { + rtLow = RenderTexture.GetTemporary (source.width>>1, source.height>>1, 0, source.format); + rtLow2 = RenderTexture.GetTemporary (source.width>>1, source.height>>1, 0, source.format); + + fgBlurDist = internalBlurWidth * foregroundOverlap; + + // capture COC & color in low resolution + WriteCoc (source, false); + source.filterMode = FilterMode.Bilinear; + Graphics.Blit (source, rtLow, dofHdrMaterial, 6); + + // blur a bit so we can do a frequency check + rtSuperLow1 = RenderTexture.GetTemporary(rtLow.width>>1, rtLow.height>>1, 0, rtLow.format); + rtSuperLow2 = RenderTexture.GetTemporary(rtLow.width>>1, rtLow.height>>1, 0, rtLow.format); + + Graphics.Blit(rtLow, rtSuperLow1, dofHdrMaterial, 15); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, 1.5f , 0.0f, 1.5f)); + Graphics.Blit (rtSuperLow1, rtSuperLow2, dofHdrMaterial, 19); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (1.5f, 0.0f, 0.0f, 1.5f)); + Graphics.Blit (rtSuperLow2, rtSuperLow1, dofHdrMaterial, 19); + + RenderTexture rtLow3 = null; + + if (nearBlur) { + // capture fg coc + rtLow3 = RenderTexture.GetTemporary (source.width>>1, source.height>>1, 0, source.format); + Graphics.Blit (source, rtLow3, dofHdrMaterial, 4); + } + + dx11bokehMaterial.SetTexture ("_BlurredColor", rtSuperLow1); + dx11bokehMaterial.SetFloat ("_SpawnHeuristic", dx11SpawnHeuristic); + dx11bokehMaterial.SetVector ("_BokehParams", new Vector4(dx11BokehScale, dx11BokehIntensity, Mathf.Clamp(dx11BokehThreshold, 0.005f, 4.0f), internalBlurWidth)); + dx11bokehMaterial.SetTexture ("_FgCocMask", rtLow3); + + // collect bokeh candidates and replace with a darker pixel + Graphics.SetRandomWriteTarget (1, cbPoints); + Graphics.Blit (rtLow, rtLow2, dx11bokehMaterial, 0); + Graphics.ClearRandomWriteTargets (); + + RenderTexture.ReleaseTemporary(rtSuperLow1); + RenderTexture.ReleaseTemporary(rtSuperLow2); + + // fg coc blur happens here (after collect!) + if (nearBlur) { + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, fgBlurDist , 0.0f, fgBlurDist)); + Graphics.Blit (rtLow3, rtLow, dofHdrMaterial, 2); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (fgBlurDist, 0.0f, 0.0f, fgBlurDist)); + Graphics.Blit (rtLow, rtLow3, dofHdrMaterial, 2); + + // merge fg coc with bg coc + Graphics.Blit (rtLow3, rtLow2, dofHdrMaterial, 3); + } + + // box blur (easier to merge with bokeh buffer) + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (internalBlurWidth, 0.0f , 0.0f, internalBlurWidth)); + Graphics.Blit (rtLow2, rtLow, dofHdrMaterial, 5); + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, internalBlurWidth, 0.0f, internalBlurWidth)); + Graphics.Blit (rtLow, rtLow2, dofHdrMaterial, 5); + + // apply bokeh candidates + Graphics.SetRenderTarget (rtLow2); + ComputeBuffer.CopyCount (cbPoints, cbDrawArgs, 0); + dx11bokehMaterial.SetBuffer ("pointBuffer", cbPoints); + dx11bokehMaterial.SetTexture ("_MainTex", dx11BokehTexture); + dx11bokehMaterial.SetVector ("_Screen", new Vector3(1.0f/(1.0f*rtLow2.width), 1.0f/(1.0f*rtLow2.height), internalBlurWidth)); + dx11bokehMaterial.SetPass (1); + Graphics.DrawProceduralIndirect (MeshTopology.Points, cbDrawArgs, 0); + + // upsample & combine + dofHdrMaterial.SetTexture ("_LowRez", rtLow2); + dofHdrMaterial.SetTexture ("_FgOverlap", rtLow3); + dofHdrMaterial.SetVector ("_Offsets", ((1.0f*source.width)/(1.0f*rtLow2.width)) * internalBlurWidth * Vector4.one); + Graphics.Blit (source, destination, dofHdrMaterial, 9); + + if (rtLow3) RenderTexture.ReleaseTemporary(rtLow3); + } + } + else + { + + // + // 2. + // poisson disc style blur in low resolution + // + // + + source.filterMode = FilterMode.Bilinear; + + if (highResolution) internalBlurWidth *= 2.0f; + + WriteCoc (source, true); + + rtLow = RenderTexture.GetTemporary (source.width >> 1, source.height >> 1, 0, source.format); + rtLow2 = RenderTexture.GetTemporary (source.width >> 1, source.height >> 1, 0, source.format); + + int blurPass = (blurSampleCount == BlurSampleCount.High || blurSampleCount == BlurSampleCount.Medium) ? 17 : 11; + + if (highResolution) { + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, internalBlurWidth, 0.025f, internalBlurWidth)); + Graphics.Blit (source, destination, dofHdrMaterial, blurPass); + } + else { + dofHdrMaterial.SetVector ("_Offsets", new Vector4 (0.0f, internalBlurWidth, 0.1f, internalBlurWidth)); + + // blur + Graphics.Blit (source, rtLow, dofHdrMaterial, 6); + Graphics.Blit (rtLow, rtLow2, dofHdrMaterial, blurPass); + + // cheaper blur in high resolution, upsample and combine + dofHdrMaterial.SetTexture("_LowRez", rtLow2); + dofHdrMaterial.SetTexture("_FgOverlap", null); + dofHdrMaterial.SetVector ("_Offsets", Vector4.one * ((1.0f*source.width)/(1.0f*rtLow2.width)) * internalBlurWidth); + Graphics.Blit (source, destination, dofHdrMaterial, blurSampleCount == BlurSampleCount.High ? 18 : 12); + } + } + + if (rtLow) RenderTexture.ReleaseTemporary(rtLow); + if (rtLow2) RenderTexture.ReleaseTemporary(rtLow2); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfField.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfField.cs.meta new file mode 100644 index 0000000..82a4f57 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfField.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: bd70d448b18cfbc46af26466f752332c +MonoImporter: + serializedVersion: 2 + defaultReferences: + - focalTransform: {instanceID: 0} + - dofHdrShader: {fileID: 4800000, guid: acd613035ff3e455e8abf23fdc8c8c24, type: 3} + - dx11BokehShader: {fileID: 4800000, guid: d8e82664aa8686642a424c88ab10164a, type: 3} + - dx11BokehTexture: {fileID: 2800000, guid: a4cdca73d61814d33ac1587f6c163bca, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfFieldDeprecated.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfFieldDeprecated.cs new file mode 100644 index 0000000..c0953df --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfFieldDeprecated.cs @@ -0,0 +1,427 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Camera/Depth of Field (deprecated)") ] + public class DepthOfFieldDeprecated : PostEffectsBase + { + public enum Dof34QualitySetting + { + OnlyBackground = 1, + BackgroundAndForeground = 2, + } + + public enum DofResolution + { + High = 2, + Medium = 3, + Low = 4, + } + + public enum DofBlurriness + { + Low = 1, + High = 2, + VeryHigh = 4, + } + + public enum BokehDestination + { + Background = 0x1, + Foreground = 0x2, + BackgroundAndForeground = 0x3, + } + + static private int SMOOTH_DOWNSAMPLE_PASS = 6; + static private float BOKEH_EXTRA_BLUR = 2.0f; + + public Dof34QualitySetting quality = Dof34QualitySetting.OnlyBackground; + public DofResolution resolution = DofResolution.Low; + public bool simpleTweakMode = true; + + public float focalPoint = 1.0f; + public float smoothness = 0.5f; + + public float focalZDistance = 0.0f; + public float focalZStartCurve = 1.0f; + public float focalZEndCurve = 1.0f; + + private float focalStartCurve = 2.0f; + private float focalEndCurve = 2.0f; + private float focalDistance01 = 0.1f; + + public Transform objectFocus = null; + public float focalSize = 0.0f; + + public DofBlurriness bluriness = DofBlurriness.High; + public float maxBlurSpread = 1.75f; + + public float foregroundBlurExtrude = 1.15f; + + public Shader dofBlurShader; + private Material dofBlurMaterial = null; + + public Shader dofShader; + private Material dofMaterial = null; + + public bool visualize = false; + public BokehDestination bokehDestination = BokehDestination.Background; + + private float widthOverHeight = 1.25f; + private float oneOverBaseSize = 1.0f / 512.0f; + + public bool bokeh = false; + public bool bokehSupport = true; + public Shader bokehShader; + public Texture2D bokehTexture; + public float bokehScale = 2.4f; + public float bokehIntensity = 0.15f; + public float bokehThresholdContrast = 0.1f; + public float bokehThresholdLuminance = 0.55f; + public int bokehDownsample = 1; + private Material bokehMaterial; + + private Camera _camera; + + void CreateMaterials () { + dofBlurMaterial = CheckShaderAndCreateMaterial (dofBlurShader, dofBlurMaterial); + dofMaterial = CheckShaderAndCreateMaterial (dofShader,dofMaterial); + bokehSupport = bokehShader.isSupported; + + if (bokeh && bokehSupport && bokehShader) + bokehMaterial = CheckShaderAndCreateMaterial (bokehShader, bokehMaterial); + } + + + public override bool CheckResources () { + CheckSupport (true); + + dofBlurMaterial = CheckShaderAndCreateMaterial (dofBlurShader, dofBlurMaterial); + dofMaterial = CheckShaderAndCreateMaterial (dofShader,dofMaterial); + bokehSupport = bokehShader.isSupported; + + if (bokeh && bokehSupport && bokehShader) + bokehMaterial = CheckShaderAndCreateMaterial (bokehShader, bokehMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnDisable () { + Quads.Cleanup (); + } + + void OnEnable () { + _camera = GetComponent(); + _camera.depthTextureMode |= DepthTextureMode.Depth; + } + + float FocalDistance01 ( float worldDist) { + return _camera.WorldToViewportPoint((worldDist-_camera.nearClipPlane) * _camera.transform.forward + _camera.transform.position).z / (_camera.farClipPlane-_camera.nearClipPlane); + } + + int GetDividerBasedOnQuality () { + int divider = 1; + if (resolution == DofResolution.Medium) + divider = 2; + else if (resolution == DofResolution.Low) + divider = 2; + return divider; + } + + int GetLowResolutionDividerBasedOnQuality ( int baseDivider) { + int lowTexDivider = baseDivider; + if (resolution == DofResolution.High) + lowTexDivider *= 2; + if (resolution == DofResolution.Low) + lowTexDivider *= 2; + return lowTexDivider; + } + + private RenderTexture foregroundTexture = null; + private RenderTexture mediumRezWorkTexture = null; + private RenderTexture finalDefocus = null; + private RenderTexture lowRezWorkTexture = null; + private RenderTexture bokehSource = null; + private RenderTexture bokehSource2 = null; + + void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (CheckResources()==false) { + Graphics.Blit (source, destination); + return; + } + + if (smoothness < 0.1f) + smoothness = 0.1f; + + // update needed focal & rt size parameter + + bokeh = bokeh && bokehSupport; + float bokehBlurAmplifier = bokeh ? BOKEH_EXTRA_BLUR : 1.0f; + + bool blurForeground = quality > Dof34QualitySetting.OnlyBackground; + float focal01Size = focalSize / (_camera.farClipPlane - _camera.nearClipPlane);; + + if (simpleTweakMode) { + focalDistance01 = objectFocus ? (_camera.WorldToViewportPoint (objectFocus.position)).z / (_camera.farClipPlane) : FocalDistance01 (focalPoint); + focalStartCurve = focalDistance01 * smoothness; + focalEndCurve = focalStartCurve; + blurForeground = blurForeground && (focalPoint > (_camera.nearClipPlane + Mathf.Epsilon)); + } + else { + if (objectFocus) { + var vpPoint= _camera.WorldToViewportPoint (objectFocus.position); + vpPoint.z = (vpPoint.z) / (_camera.farClipPlane); + focalDistance01 = vpPoint.z; + } + else + focalDistance01 = FocalDistance01 (focalZDistance); + + focalStartCurve = focalZStartCurve; + focalEndCurve = focalZEndCurve; + blurForeground = blurForeground && (focalPoint > (_camera.nearClipPlane + Mathf.Epsilon)); + } + + widthOverHeight = (1.0f * source.width) / (1.0f * source.height); + oneOverBaseSize = 1.0f / 512.0f; + + dofMaterial.SetFloat ("_ForegroundBlurExtrude", foregroundBlurExtrude); + dofMaterial.SetVector ("_CurveParams", new Vector4 (simpleTweakMode ? 1.0f / focalStartCurve : focalStartCurve, simpleTweakMode ? 1.0f / focalEndCurve : focalEndCurve, focal01Size * 0.5f, focalDistance01)); + dofMaterial.SetVector ("_InvRenderTargetSize", new Vector4 (1.0f / (1.0f * source.width), 1.0f / (1.0f * source.height),0.0f,0.0f)); + + int divider = GetDividerBasedOnQuality (); + int lowTexDivider = GetLowResolutionDividerBasedOnQuality (divider); + + AllocateTextures (blurForeground, source, divider, lowTexDivider); + + // WRITE COC to alpha channel + // source is only being bound to detect y texcoord flip + Graphics.Blit (source, source, dofMaterial, 3); + + // better DOWNSAMPLE (could actually be weighted for higher quality) + Downsample (source, mediumRezWorkTexture); + + // BLUR A LITTLE first, which has two purposes + // 1.) reduce jitter, noise, aliasing + // 2.) produce the little-blur buffer used in composition later + Blur (mediumRezWorkTexture, mediumRezWorkTexture, DofBlurriness.Low, 4, maxBlurSpread); + + if ((bokeh) && ((BokehDestination.Foreground & bokehDestination) != 0)) + { + dofMaterial.SetVector ("_Threshhold", new Vector4(bokehThresholdContrast, bokehThresholdLuminance, 0.95f, 0.0f)); + + // add and mark the parts that should end up as bokeh shapes + Graphics.Blit (mediumRezWorkTexture, bokehSource2, dofMaterial, 11); + + // remove those parts (maybe even a little tittle bittle more) from the regurlarly blurred buffer + //Graphics.Blit (mediumRezWorkTexture, lowRezWorkTexture, dofMaterial, 10); + Graphics.Blit (mediumRezWorkTexture, lowRezWorkTexture);//, dofMaterial, 10); + + // maybe you want to reblur the small blur ... but not really needed. + //Blur (mediumRezWorkTexture, mediumRezWorkTexture, DofBlurriness.Low, 4, maxBlurSpread); + + // bigger BLUR + Blur (lowRezWorkTexture, lowRezWorkTexture, bluriness, 0, maxBlurSpread * bokehBlurAmplifier); + } + else { + // bigger BLUR + Downsample (mediumRezWorkTexture, lowRezWorkTexture); + Blur (lowRezWorkTexture, lowRezWorkTexture, bluriness, 0, maxBlurSpread); + } + + dofBlurMaterial.SetTexture ("_TapLow", lowRezWorkTexture); + dofBlurMaterial.SetTexture ("_TapMedium", mediumRezWorkTexture); + Graphics.Blit (null, finalDefocus, dofBlurMaterial, 3); + + // we are only adding bokeh now if the background is the only part we have to deal with + if ((bokeh) && ((BokehDestination.Foreground & bokehDestination) != 0)) + AddBokeh (bokehSource2, bokehSource, finalDefocus); + + dofMaterial.SetTexture ("_TapLowBackground", finalDefocus); + dofMaterial.SetTexture ("_TapMedium", mediumRezWorkTexture); // needed for debugging/visualization + + // FINAL DEFOCUS (background) + Graphics.Blit (source, blurForeground ? foregroundTexture : destination, dofMaterial, visualize ? 2 : 0); + + // FINAL DEFOCUS (foreground) + if (blurForeground) { + // WRITE COC to alpha channel + Graphics.Blit (foregroundTexture, source, dofMaterial, 5); + + // DOWNSAMPLE (unweighted) + Downsample (source, mediumRezWorkTexture); + + // BLUR A LITTLE first, which has two purposes + // 1.) reduce jitter, noise, aliasing + // 2.) produce the little-blur buffer used in composition later + BlurFg (mediumRezWorkTexture, mediumRezWorkTexture, DofBlurriness.Low, 2, maxBlurSpread); + + if ((bokeh) && ((BokehDestination.Foreground & bokehDestination) != 0)) + { + dofMaterial.SetVector ("_Threshhold", new Vector4(bokehThresholdContrast * 0.5f, bokehThresholdLuminance, 0.0f, 0.0f)); + + // add and mark the parts that should end up as bokeh shapes + Graphics.Blit (mediumRezWorkTexture, bokehSource2, dofMaterial, 11); + + // remove the parts (maybe even a little tittle bittle more) that will end up in bokeh space + //Graphics.Blit (mediumRezWorkTexture, lowRezWorkTexture, dofMaterial, 10); + Graphics.Blit (mediumRezWorkTexture, lowRezWorkTexture);//, dofMaterial, 10); + + // big BLUR + BlurFg (lowRezWorkTexture, lowRezWorkTexture, bluriness, 1, maxBlurSpread * bokehBlurAmplifier); + } + else { + // big BLUR + BlurFg (mediumRezWorkTexture, lowRezWorkTexture, bluriness, 1, maxBlurSpread); + } + + // simple upsample once + Graphics.Blit (lowRezWorkTexture, finalDefocus); + + dofMaterial.SetTexture ("_TapLowForeground", finalDefocus); + Graphics.Blit (source, destination, dofMaterial, visualize ? 1 : 4); + + if ((bokeh) && ((BokehDestination.Foreground & bokehDestination) != 0)) + AddBokeh (bokehSource2, bokehSource, destination); + } + + ReleaseTextures (); + } + + void Blur ( RenderTexture from, RenderTexture to, DofBlurriness iterations, int blurPass, float spread) { + RenderTexture tmp = RenderTexture.GetTemporary (to.width, to.height); + if ((int)iterations > 1) { + BlurHex (from, to, blurPass, spread, tmp); + if ((int)iterations > 2) { + dofBlurMaterial.SetVector ("offsets", new Vector4 (0.0f, spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (to, tmp, dofBlurMaterial, blurPass); + dofBlurMaterial.SetVector ("offsets", new Vector4 (spread / widthOverHeight * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit (tmp, to, dofBlurMaterial, blurPass); + } + } + else { + dofBlurMaterial.SetVector ("offsets", new Vector4 (0.0f, spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (from, tmp, dofBlurMaterial, blurPass); + dofBlurMaterial.SetVector ("offsets", new Vector4 (spread / widthOverHeight * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit (tmp, to, dofBlurMaterial, blurPass); + } + RenderTexture.ReleaseTemporary (tmp); + } + + void BlurFg ( RenderTexture from, RenderTexture to, DofBlurriness iterations, int blurPass, float spread) { + // we want a nice, big coc, hence we need to tap once from this (higher resolution) texture + dofBlurMaterial.SetTexture ("_TapHigh", from); + + RenderTexture tmp = RenderTexture.GetTemporary (to.width, to.height); + if ((int)iterations > 1) { + BlurHex (from, to, blurPass, spread, tmp); + if ((int)iterations > 2) { + dofBlurMaterial.SetVector ("offsets", new Vector4 (0.0f, spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (to, tmp, dofBlurMaterial, blurPass); + dofBlurMaterial.SetVector ("offsets", new Vector4 (spread / widthOverHeight * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit (tmp, to, dofBlurMaterial, blurPass); + } + } + else { + dofBlurMaterial.SetVector ("offsets", new Vector4 (0.0f, spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (from, tmp, dofBlurMaterial, blurPass); + dofBlurMaterial.SetVector ("offsets", new Vector4 (spread / widthOverHeight * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit (tmp, to, dofBlurMaterial, blurPass); + } + RenderTexture.ReleaseTemporary (tmp); + } + + void BlurHex ( RenderTexture from, RenderTexture to, int blurPass, float spread, RenderTexture tmp) { + dofBlurMaterial.SetVector ("offsets", new Vector4 (0.0f, spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (from, tmp, dofBlurMaterial, blurPass); + dofBlurMaterial.SetVector ("offsets", new Vector4 (spread / widthOverHeight * oneOverBaseSize, 0.0f, 0.0f, 0.0f)); + Graphics.Blit (tmp, to, dofBlurMaterial, blurPass); + dofBlurMaterial.SetVector ("offsets", new Vector4 (spread / widthOverHeight * oneOverBaseSize, spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (to, tmp, dofBlurMaterial, blurPass); + dofBlurMaterial.SetVector ("offsets", new Vector4 (spread / widthOverHeight * oneOverBaseSize, -spread * oneOverBaseSize, 0.0f, 0.0f)); + Graphics.Blit (tmp, to, dofBlurMaterial, blurPass); + } + + void Downsample ( RenderTexture from, RenderTexture to) { + dofMaterial.SetVector ("_InvRenderTargetSize", new Vector4 (1.0f / (1.0f * to.width), 1.0f / (1.0f * to.height), 0.0f, 0.0f)); + Graphics.Blit (from, to, dofMaterial, SMOOTH_DOWNSAMPLE_PASS); + } + + void AddBokeh ( RenderTexture bokehInfo, RenderTexture tempTex, RenderTexture finalTarget) { + if (bokehMaterial) { + var meshes = Quads.GetMeshes (tempTex.width, tempTex.height); // quads: exchanging more triangles with less overdraw + + RenderTexture.active = tempTex; + GL.Clear (false, true, new Color (0.0f, 0.0f, 0.0f, 0.0f)); + + GL.PushMatrix (); + GL.LoadIdentity (); + + // point filter mode is important, otherwise we get bokeh shape & size artefacts + bokehInfo.filterMode = FilterMode.Point; + + float arW = (bokehInfo.width * 1.0f) / (bokehInfo.height * 1.0f); + float sc = 2.0f / (1.0f * bokehInfo.width); + sc += bokehScale * maxBlurSpread * BOKEH_EXTRA_BLUR * oneOverBaseSize; + + bokehMaterial.SetTexture ("_Source", bokehInfo); + bokehMaterial.SetTexture ("_MainTex", bokehTexture); + bokehMaterial.SetVector ("_ArScale",new Vector4 (sc, sc * arW, 0.5f, 0.5f * arW)); + bokehMaterial.SetFloat ("_Intensity", bokehIntensity); + bokehMaterial.SetPass (0); + + foreach(Mesh m in meshes) + if (m) Graphics.DrawMeshNow (m, Matrix4x4.identity); + + GL.PopMatrix (); + + Graphics.Blit (tempTex, finalTarget, dofMaterial, 8); + + // important to set back as we sample from this later on + bokehInfo.filterMode = FilterMode.Bilinear; + } + } + + + void ReleaseTextures () { + if (foregroundTexture) RenderTexture.ReleaseTemporary (foregroundTexture); + if (finalDefocus) RenderTexture.ReleaseTemporary (finalDefocus); + if (mediumRezWorkTexture) RenderTexture.ReleaseTemporary (mediumRezWorkTexture); + if (lowRezWorkTexture) RenderTexture.ReleaseTemporary (lowRezWorkTexture); + if (bokehSource) RenderTexture.ReleaseTemporary (bokehSource); + if (bokehSource2) RenderTexture.ReleaseTemporary (bokehSource2); + } + + void AllocateTextures ( bool blurForeground, RenderTexture source, int divider, int lowTexDivider) { + foregroundTexture = null; + if (blurForeground) + foregroundTexture = RenderTexture.GetTemporary (source.width, source.height, 0); + mediumRezWorkTexture = RenderTexture.GetTemporary (source.width / divider, source.height / divider, 0); + finalDefocus = RenderTexture.GetTemporary (source.width / divider, source.height / divider, 0); + lowRezWorkTexture = RenderTexture.GetTemporary (source.width / lowTexDivider, source.height / lowTexDivider, 0); + bokehSource = null; + bokehSource2 = null; + if (bokeh) { + bokehSource = RenderTexture.GetTemporary (source.width / (lowTexDivider * bokehDownsample), source.height / (lowTexDivider * bokehDownsample), 0, RenderTextureFormat.ARGBHalf); + bokehSource2 = RenderTexture.GetTemporary (source.width / (lowTexDivider * bokehDownsample), source.height / (lowTexDivider * bokehDownsample), 0, RenderTextureFormat.ARGBHalf); + bokehSource.filterMode = FilterMode.Bilinear; + bokehSource2.filterMode = FilterMode.Bilinear; + RenderTexture.active = bokehSource2; + GL.Clear (false, true, new Color(0.0f, 0.0f, 0.0f, 0.0f)); + } + + // to make sure: always use bilinear filter setting + + source.filterMode = FilterMode.Bilinear; + finalDefocus.filterMode = FilterMode.Bilinear; + mediumRezWorkTexture.filterMode = FilterMode.Bilinear; + lowRezWorkTexture.filterMode = FilterMode.Bilinear; + if (foregroundTexture) + foregroundTexture.filterMode = FilterMode.Bilinear; + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfFieldDeprecated.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfFieldDeprecated.cs.meta new file mode 100644 index 0000000..b252a6c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/DepthOfFieldDeprecated.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 83d8db0ec466c14429f58c68c16398a1 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - objectFocus: {instanceID: 0} + - dofBlurShader: {fileID: 4800000, guid: bb4af680337344a4abad65a4e8873c50, type: 3} + - dofShader: {fileID: 4800000, guid: 987fb0677d01f43ce8a9dbf12271e668, type: 3} + - bokehShader: {fileID: 4800000, guid: 57cdacf9b217546aaa18edf39a6151c0, type: 3} + - bokehTexture: {fileID: 2800000, guid: fc00ec05a89da4ff695a4273715cd5ce, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/EdgeDetection.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/EdgeDetection.cs new file mode 100644 index 0000000..9f95aa0 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/EdgeDetection.cs @@ -0,0 +1,89 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof (Camera))] + [AddComponentMenu ("Image Effects/Edge Detection/Edge Detection")] + public class EdgeDetection : PostEffectsBase + { + public enum EdgeDetectMode + { + TriangleDepthNormals = 0, + RobertsCrossDepthNormals = 1, + SobelDepth = 2, + SobelDepthThin = 3, + TriangleLuminance = 4, + } + + + public EdgeDetectMode mode = EdgeDetectMode.SobelDepthThin; + public float sensitivityDepth = 1.0f; + public float sensitivityNormals = 1.0f; + public float lumThreshold = 0.2f; + public float edgeExp = 1.0f; + public float sampleDist = 1.0f; + public float edgesOnly = 0.0f; + public Color edgesOnlyBgColor = Color.white; + + public Shader edgeDetectShader; + private Material edgeDetectMaterial = null; + private EdgeDetectMode oldMode = EdgeDetectMode.SobelDepthThin; + + + public override bool CheckResources () + { + CheckSupport (true); + + edgeDetectMaterial = CheckShaderAndCreateMaterial (edgeDetectShader,edgeDetectMaterial); + if (mode != oldMode) + SetCameraFlag (); + + oldMode = mode; + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + + new void Start () + { + oldMode = mode; + } + + void SetCameraFlag () + { + if (mode == EdgeDetectMode.SobelDepth || mode == EdgeDetectMode.SobelDepthThin) + GetComponent().depthTextureMode |= DepthTextureMode.Depth; + else if (mode == EdgeDetectMode.TriangleDepthNormals || mode == EdgeDetectMode.RobertsCrossDepthNormals) + GetComponent().depthTextureMode |= DepthTextureMode.DepthNormals; + } + + void OnEnable () + { + SetCameraFlag(); + } + + [ImageEffectOpaque] + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources () == false) + { + Graphics.Blit (source, destination); + return; + } + + Vector2 sensitivity = new Vector2 (sensitivityDepth, sensitivityNormals); + edgeDetectMaterial.SetVector ("_Sensitivity", new Vector4 (sensitivity.x, sensitivity.y, 1.0f, sensitivity.y)); + edgeDetectMaterial.SetFloat ("_BgFade", edgesOnly); + edgeDetectMaterial.SetFloat ("_SampleDistance", sampleDist); + edgeDetectMaterial.SetVector ("_BgColor", edgesOnlyBgColor); + edgeDetectMaterial.SetFloat ("_Exponent", edgeExp); + edgeDetectMaterial.SetFloat ("_Threshold", lumThreshold); + + Graphics.Blit (source, destination, edgeDetectMaterial, (int) mode); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/EdgeDetection.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/EdgeDetection.cs.meta new file mode 100644 index 0000000..22ad6e8 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/EdgeDetection.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 730475ee64f9a894bbac0d9e6f22e813 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - edgeDetectShader: {fileID: 4800000, guid: 0d1644bdf064147baa97f235fc5b4903, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Fisheye.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Fisheye.cs new file mode 100644 index 0000000..069affa --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Fisheye.cs @@ -0,0 +1,46 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Displacement/Fisheye")] + public class Fisheye : PostEffectsBase + { + [Range(0.0f, 1.5f)] + public float strengthX = 0.05f; + [Range(0.0f, 1.5f)] + public float strengthY = 0.05f; + + public Shader fishEyeShader = null; + private Material fisheyeMaterial = null; + + + public override bool CheckResources () + { + CheckSupport (false); + fisheyeMaterial = CheckShaderAndCreateMaterial(fishEyeShader,fisheyeMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources()==false) + { + Graphics.Blit (source, destination); + return; + } + + float oneOverBaseSize = 80.0f / 512.0f; // to keep values more like in the old version of fisheye + + float ar = (source.width * 1.0f) / (source.height * 1.0f); + + fisheyeMaterial.SetVector ("intensity", new Vector4 (strengthX * ar * oneOverBaseSize, strengthY * oneOverBaseSize, strengthX * ar * oneOverBaseSize, strengthY * oneOverBaseSize)); + Graphics.Blit (source, destination, fisheyeMaterial); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Fisheye.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Fisheye.cs.meta new file mode 100644 index 0000000..deb7976 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Fisheye.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4739c22ef73ad62488fe344c8fe9addd +MonoImporter: + serializedVersion: 2 + defaultReferences: + - fishEyeShader: {fileID: 4800000, guid: 874ceab4425f64bccb1d14032f4452b1, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/GlobalFog.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/GlobalFog.cs new file mode 100644 index 0000000..3d17fc2 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/GlobalFog.cs @@ -0,0 +1,100 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Rendering/Global Fog")] + class GlobalFog : PostEffectsBase + { + [Tooltip("Apply distance-based fog?")] + public bool distanceFog = true; + [Tooltip("Exclude far plane pixels from distance-based fog? (Skybox or clear color)")] + public bool excludeFarPixels = true; + [Tooltip("Distance fog is based on radial distance from camera when checked")] + public bool useRadialDistance = false; + [Tooltip("Apply height-based fog?")] + public bool heightFog = true; + [Tooltip("Fog top Y coordinate")] + public float height = 1.0f; + [Range(0.001f,10.0f)] + public float heightDensity = 2.0f; + [Tooltip("Push fog away from the camera by this amount")] + public float startDistance = 0.0f; + + public Shader fogShader = null; + private Material fogMaterial = null; + + + public override bool CheckResources () + { + CheckSupport (true); + + fogMaterial = CheckShaderAndCreateMaterial (fogShader, fogMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + [ImageEffectOpaque] + void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (CheckResources() == false || (!distanceFog && !heightFog)) + { + Graphics.Blit(source, destination); + return; + } + + Camera cam = GetComponent(); + Transform camtr = cam.transform; + + Vector3[] frustumCorners = new Vector3[4]; + cam.CalculateFrustumCorners(new Rect(0, 0, 1, 1), cam.farClipPlane, cam.stereoActiveEye, frustumCorners); + var bottomLeft = camtr.TransformVector(frustumCorners[0]); + var topLeft = camtr.TransformVector(frustumCorners[1]); + var topRight = camtr.TransformVector(frustumCorners[2]); + var bottomRight = camtr.TransformVector(frustumCorners[3]); + + Matrix4x4 frustumCornersArray = Matrix4x4.identity; + frustumCornersArray.SetRow(0, bottomLeft); + frustumCornersArray.SetRow(1, bottomRight); + frustumCornersArray.SetRow(2, topLeft); + frustumCornersArray.SetRow(3, topRight); + + var camPos = camtr.position; + float FdotC = camPos.y - height; + float paramK = (FdotC <= 0.0f ? 1.0f : 0.0f); + float excludeDepth = (excludeFarPixels ? 1.0f : 2.0f); + fogMaterial.SetMatrix("_FrustumCornersWS", frustumCornersArray); + fogMaterial.SetVector("_CameraWS", camPos); + fogMaterial.SetVector("_HeightParams", new Vector4(height, FdotC, paramK, heightDensity * 0.5f)); + fogMaterial.SetVector("_DistanceParams", new Vector4(-Mathf.Max(startDistance, 0.0f), excludeDepth, 0, 0)); + + var sceneMode = RenderSettings.fogMode; + var sceneDensity = RenderSettings.fogDensity; + var sceneStart = RenderSettings.fogStartDistance; + var sceneEnd = RenderSettings.fogEndDistance; + Vector4 sceneParams; + bool linear = (sceneMode == FogMode.Linear); + float diff = linear ? sceneEnd - sceneStart : 0.0f; + float invDiff = Mathf.Abs(diff) > 0.0001f ? 1.0f / diff : 0.0f; + sceneParams.x = sceneDensity * 1.2011224087f; // density / sqrt(ln(2)), used by Exp2 fog mode + sceneParams.y = sceneDensity * 1.4426950408f; // density / ln(2), used by Exp fog mode + sceneParams.z = linear ? -invDiff : 0.0f; + sceneParams.w = linear ? sceneEnd * invDiff : 0.0f; + fogMaterial.SetVector("_SceneFogParams", sceneParams); + fogMaterial.SetVector("_SceneFogMode", new Vector4((int)sceneMode, useRadialDistance ? 1 : 0, 0, 0)); + + int pass = 0; + if (distanceFog && heightFog) + pass = 0; // distance + height + else if (distanceFog) + pass = 1; // distance only + else + pass = 2; // height only + Graphics.Blit(source, destination, fogMaterial, pass); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/GlobalFog.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/GlobalFog.cs.meta new file mode 100644 index 0000000..fa21d25 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/GlobalFog.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 76b5ec6153a1d55438228df10fe66844 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - fogShader: {fileID: 4800000, guid: 70d8568987ac0499f952b54c7c13e265, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Grayscale.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Grayscale.cs new file mode 100644 index 0000000..369d5cd --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Grayscale.cs @@ -0,0 +1,21 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Color Adjustments/Grayscale")] + public class Grayscale : ImageEffectBase { + public Texture textureRamp; + + [Range(-1.0f,1.0f)] + public float rampOffset; + + // Called by camera to apply image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) { + material.SetTexture("_RampTex", textureRamp); + material.SetFloat("_RampOffset", rampOffset); + Graphics.Blit (source, destination, material); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Grayscale.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Grayscale.cs.meta new file mode 100644 index 0000000..b23db62 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Grayscale.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 243a781cad112c75d0008dfa8d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: daf9781cad112c75d0008dfa8d76c639, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffectBase.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffectBase.cs new file mode 100644 index 0000000..0158215 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffectBase.cs @@ -0,0 +1,55 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [RequireComponent(typeof (Camera))] + [AddComponentMenu("")] + public class ImageEffectBase : MonoBehaviour + { + /// Provides a shader property that is set in the inspector + /// and a material instantiated from the shader + public Shader shader; + + private Material m_Material; + + + protected virtual void Start() + { + // Disable if we don't support image effects + if (!SystemInfo.supportsImageEffects) + { + enabled = false; + return; + } + + // Disable the image effect if the shader can't + // run on the users graphics card + if (!shader || !shader.isSupported) + enabled = false; + } + + + protected Material material + { + get + { + if (m_Material == null) + { + m_Material = new Material(shader); + m_Material.hideFlags = HideFlags.HideAndDontSave; + } + return m_Material; + } + } + + + protected virtual void OnDisable() + { + if (m_Material) + { + DestroyImmediate(m_Material); + } + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffectBase.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffectBase.cs.meta new file mode 100644 index 0000000..f3c0025 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffectBase.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6469eb0ad1119d6d00011d98d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffects.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffects.cs new file mode 100644 index 0000000..c8d4afc --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffects.cs @@ -0,0 +1,42 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + /// A Utility class for performing various image based rendering tasks. + [AddComponentMenu("")] + public class ImageEffects + { + public static void RenderDistortion(Material material, RenderTexture source, RenderTexture destination, float angle, Vector2 center, Vector2 radius) + { + bool invertY = source.texelSize.y < 0.0f; + if (invertY) + { + center.y = 1.0f - center.y; + angle = -angle; + } + + Matrix4x4 rotationMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(0, 0, angle), Vector3.one); + + material.SetMatrix("_RotationMatrix", rotationMatrix); + material.SetVector("_CenterRadius", new Vector4(center.x, center.y, radius.x, radius.y)); + material.SetFloat("_Angle", angle*Mathf.Deg2Rad); + + Graphics.Blit(source, destination, material); + } + + + [Obsolete("Use Graphics.Blit(source,dest) instead")] + public static void Blit(RenderTexture source, RenderTexture dest) + { + Graphics.Blit(source, dest); + } + + + [Obsolete("Use Graphics.Blit(source, destination, material) instead")] + public static void BlitWithMaterial(Material material, RenderTexture source, RenderTexture dest) + { + Graphics.Blit(source, dest, material); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffects.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffects.cs.meta new file mode 100644 index 0000000..9d82a11 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ImageEffects.cs.meta @@ -0,0 +1,17 @@ +fileFormatVersion: 2 +guid: 89a037199d11087f1100e2b844295342 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - blitCopyShader: {fileID: 4800000, guid: 3338b5ea2f3cb594698fae65cf060346, type: 3} + - blitMultiplyShader: {fileID: 4800000, guid: 7034c801b78acab448cdcf845f7c352d, + type: 3} + - blitMultiply2XShader: {fileID: 4800000, guid: cde82987e0a884c4788c65f7b54390e8, + type: 3} + - blitAddShader: {fileID: 4800000, guid: c7515f214a63bdb42b6ae6335a00a8a4, type: 3} + - blitAddSmoothShader: {fileID: 4800000, guid: 7741a77a7c455d0418bc429bd508dc87, + type: 3} + - blitBlendShader: {fileID: 4800000, guid: f1cf7e9c98754c4429ff0f7cc1d9dd7b, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/MotionBlur.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/MotionBlur.cs new file mode 100644 index 0000000..2b7968b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/MotionBlur.cs @@ -0,0 +1,71 @@ +using System; +using UnityEngine; + +// This class implements simple ghosting type Motion Blur. +// If Extra Blur is selected, the scene will allways be a little blurred, +// as it is scaled to a smaller resolution. +// The effect works by accumulating the previous frames in an accumulation +// texture. +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Blur/Motion Blur (Color Accumulation)")] + [RequireComponent(typeof(Camera))] + public class MotionBlur : ImageEffectBase + { + [Range(0.0f, 0.92f)] + public float blurAmount = 0.8f; + public bool extraBlur = false; + + private RenderTexture accumTexture; + + override protected void Start() + { + base.Start(); + } + + override protected void OnDisable() + { + base.OnDisable(); + DestroyImmediate(accumTexture); + } + + // Called by camera to apply image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + // Create the accumulation texture + if (accumTexture == null || accumTexture.width != source.width || accumTexture.height != source.height) + { + DestroyImmediate(accumTexture); + accumTexture = new RenderTexture(source.width, source.height, 0); + accumTexture.hideFlags = HideFlags.HideAndDontSave; + Graphics.Blit( source, accumTexture ); + } + + // If Extra Blur is selected, downscale the texture to 4x4 smaller resolution. + if (extraBlur) + { + RenderTexture blurbuffer = RenderTexture.GetTemporary(source.width/4, source.height/4, 0); + accumTexture.MarkRestoreExpected(); + Graphics.Blit(accumTexture, blurbuffer); + Graphics.Blit(blurbuffer,accumTexture); + RenderTexture.ReleaseTemporary(blurbuffer); + } + + // Clamp the motion blur variable, so it can never leave permanent trails in the image + blurAmount = Mathf.Clamp( blurAmount, 0.0f, 0.92f ); + + // Setup the texture and floating point values in the shader + material.SetTexture("_MainTex", accumTexture); + material.SetFloat("_AccumOrig", 1.0F-blurAmount); + + // We are accumulating motion over frames without clear/discard + // by design, so silence any performance warnings from Unity + accumTexture.MarkRestoreExpected(); + + // Render the image using the motion blur shader + Graphics.Blit (source, accumTexture, material); + Graphics.Blit (accumTexture, destination); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/MotionBlur.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/MotionBlur.cs.meta new file mode 100644 index 0000000..5fe9ed8 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/MotionBlur.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 478a2083ad114a07d000fbfb8d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: e9ba2083ad114a07d000fbfb8d76c639, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndGrain.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndGrain.cs new file mode 100644 index 0000000..3230bdb --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndGrain.cs @@ -0,0 +1,181 @@ +using System; +using UnityEngine; +using Random = UnityEngine.Random; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Noise/Noise And Grain (Filmic)")] + public class NoiseAndGrain : PostEffectsBase + { + + public float intensityMultiplier = 0.25f; + + public float generalIntensity = 0.5f; + public float blackIntensity = 1.0f; + public float whiteIntensity = 1.0f; + public float midGrey = 0.2f; + + public bool dx11Grain = false; + public float softness = 0.0f; + public bool monochrome = false; + + public Vector3 intensities = new Vector3(1.0f, 1.0f, 1.0f); + public Vector3 tiling = new Vector3(64.0f, 64.0f, 64.0f); + public float monochromeTiling = 64.0f; + + public FilterMode filterMode = FilterMode.Bilinear; + + public Texture2D noiseTexture; + + public Shader noiseShader; + private Material noiseMaterial = null; + + public Shader dx11NoiseShader; + private Material dx11NoiseMaterial = null; + + private static float TILE_AMOUNT = 64.0f; + + + public override bool CheckResources () + { + CheckSupport (false); + + noiseMaterial = CheckShaderAndCreateMaterial (noiseShader, noiseMaterial); + + if (dx11Grain && supportDX11) + { +#if UNITY_EDITOR + dx11NoiseShader = Shader.Find("Hidden/NoiseAndGrainDX11"); +#endif + dx11NoiseMaterial = CheckShaderAndCreateMaterial (dx11NoiseShader, dx11NoiseMaterial); + } + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources()==false || (null==noiseTexture)) + { + Graphics.Blit (source, destination); + if (null==noiseTexture) { + Debug.LogWarning("Noise & Grain effect failing as noise texture is not assigned. please assign.", transform); + } + return; + } + + softness = Mathf.Clamp(softness, 0.0f, 0.99f); + + if (dx11Grain && supportDX11) + { + // We have a fancy, procedural noise pattern in this version, so no texture needed + + dx11NoiseMaterial.SetFloat("_DX11NoiseTime", Time.frameCount); + dx11NoiseMaterial.SetTexture ("_NoiseTex", noiseTexture); + dx11NoiseMaterial.SetVector ("_NoisePerChannel", monochrome ? Vector3.one : intensities); + dx11NoiseMaterial.SetVector ("_MidGrey", new Vector3(midGrey, 1.0f/(1.0f-midGrey), -1.0f/midGrey)); + dx11NoiseMaterial.SetVector ("_NoiseAmount", new Vector3(generalIntensity, blackIntensity, whiteIntensity) * intensityMultiplier); + + if (softness > Mathf.Epsilon) + { + RenderTexture rt = RenderTexture.GetTemporary((int) (source.width * (1.0f-softness)), (int) (source.height * (1.0f-softness))); + DrawNoiseQuadGrid (source, rt, dx11NoiseMaterial, noiseTexture, monochrome ? 3 : 2); + dx11NoiseMaterial.SetTexture("_NoiseTex", rt); + Graphics.Blit(source, destination, dx11NoiseMaterial, 4); + RenderTexture.ReleaseTemporary(rt); + } + else + DrawNoiseQuadGrid (source, destination, dx11NoiseMaterial, noiseTexture, (monochrome ? 1 : 0)); + } + else + { + // normal noise (DX9 style) + + if (noiseTexture) { + noiseTexture.wrapMode = TextureWrapMode.Repeat; + noiseTexture.filterMode = filterMode; + } + + noiseMaterial.SetTexture ("_NoiseTex", noiseTexture); + noiseMaterial.SetVector ("_NoisePerChannel", monochrome ? Vector3.one : intensities); + noiseMaterial.SetVector ("_NoiseTilingPerChannel", monochrome ? Vector3.one * monochromeTiling : tiling); + noiseMaterial.SetVector ("_MidGrey", new Vector3(midGrey, 1.0f/(1.0f-midGrey), -1.0f/midGrey)); + noiseMaterial.SetVector ("_NoiseAmount", new Vector3(generalIntensity, blackIntensity, whiteIntensity) * intensityMultiplier); + + if (softness > Mathf.Epsilon) + { + RenderTexture rt2 = RenderTexture.GetTemporary((int) (source.width * (1.0f-softness)), (int) (source.height * (1.0f-softness))); + DrawNoiseQuadGrid (source, rt2, noiseMaterial, noiseTexture, 2); + noiseMaterial.SetTexture("_NoiseTex", rt2); + Graphics.Blit(source, destination, noiseMaterial, 1); + RenderTexture.ReleaseTemporary(rt2); + } + else + DrawNoiseQuadGrid (source, destination, noiseMaterial, noiseTexture, 0); + } + } + + static void DrawNoiseQuadGrid (RenderTexture source, RenderTexture dest, Material fxMaterial, Texture2D noise, int passNr) + { + RenderTexture.active = dest; + + float noiseSize = (noise.width * 1.0f); + float subDs = (1.0f * source.width) / TILE_AMOUNT; + + fxMaterial.SetTexture ("_MainTex", source); + + GL.PushMatrix (); + GL.LoadOrtho (); + + float aspectCorrection = (1.0f * source.width) / (1.0f * source.height); + float stepSizeX = 1.0f / subDs; + float stepSizeY = stepSizeX * aspectCorrection; + float texTile = noiseSize / (noise.width * 1.0f); + + fxMaterial.SetPass (passNr); + + GL.Begin (GL.QUADS); + + for (float x1 = 0.0f; x1 < 1.0f; x1 += stepSizeX) + { + for (float y1 = 0.0f; y1 < 1.0f; y1 += stepSizeY) + { + float tcXStart = Random.Range (0.0f, 1.0f); + float tcYStart = Random.Range (0.0f, 1.0f); + + //Vector3 v3 = Random.insideUnitSphere; + //Color c = new Color(v3.x, v3.y, v3.z); + + tcXStart = Mathf.Floor(tcXStart*noiseSize) / noiseSize; + tcYStart = Mathf.Floor(tcYStart*noiseSize) / noiseSize; + + float texTileMod = 1.0f / noiseSize; + + GL.MultiTexCoord2 (0, tcXStart, tcYStart); + GL.MultiTexCoord2 (1, 0.0f, 0.0f); + //GL.Color( c ); + GL.Vertex3 (x1, y1, 0.1f); + GL.MultiTexCoord2 (0, tcXStart + texTile * texTileMod, tcYStart); + GL.MultiTexCoord2 (1, 1.0f, 0.0f); + //GL.Color( c ); + GL.Vertex3 (x1 + stepSizeX, y1, 0.1f); + GL.MultiTexCoord2 (0, tcXStart + texTile * texTileMod, tcYStart + texTile * texTileMod); + GL.MultiTexCoord2 (1, 1.0f, 1.0f); + //GL.Color( c ); + GL.Vertex3 (x1 + stepSizeX, y1 + stepSizeY, 0.1f); + GL.MultiTexCoord2 (0, tcXStart, tcYStart + texTile * texTileMod); + GL.MultiTexCoord2 (1, 0.0f, 1.0f); + //GL.Color( c ); + GL.Vertex3 (x1, y1 + stepSizeY, 0.1f); + } + } + + GL.End (); + GL.PopMatrix (); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndGrain.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndGrain.cs.meta new file mode 100644 index 0000000..6d740fc --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndGrain.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9191284b058eef549b7108b5f04e1117 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - noiseTexture: {fileID: 2800000, guid: 7a632f967e8ad42f5bd275898151ab6a, type: 3} + - noiseShader: {fileID: 4800000, guid: b0249d8c935344451aa4de6db76f0688, type: 3} + - dx11NoiseShader: {fileID: 4800000, guid: 8b30686bb4322ab42ad5eb50a0210b58, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndScratches.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndScratches.cs new file mode 100644 index 0000000..4f894a9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndScratches.cs @@ -0,0 +1,142 @@ +using System; +using UnityEngine; +using Random = UnityEngine.Random; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu("Image Effects/Noise/Noise and Scratches")] + public class NoiseAndScratches : MonoBehaviour + { + /// Monochrome noise just adds grain. Non-monochrome noise + /// more resembles VCR as it adds noise in YUV color space, + /// thus introducing magenta/green colors. + public bool monochrome = true; + private bool rgbFallback = false; + + // Noise grain takes random intensity from Min to Max. + [Range(0.0f,5.0f)] + public float grainIntensityMin = 0.1f; + [Range(0.0f, 5.0f)] + public float grainIntensityMax = 0.2f; + + /// The size of the noise grains (1 = one pixel). + [Range(0.1f, 50.0f)] + public float grainSize = 2.0f; + + // Scratches take random intensity from Min to Max. + [Range(0.0f, 5.0f)] + public float scratchIntensityMin = 0.05f; + [Range(0.0f, 5.0f)] + public float scratchIntensityMax = 0.25f; + + /// Scratches jump to another locations at this times per second. + [Range(1.0f, 30.0f)] + public float scratchFPS = 10.0f; + /// While scratches are in the same location, they jitter a bit. + [Range(0.0f, 1.0f)] + public float scratchJitter = 0.01f; + + public Texture grainTexture; + public Texture scratchTexture; + public Shader shaderRGB; + public Shader shaderYUV; + private Material m_MaterialRGB; + private Material m_MaterialYUV; + + private float scratchTimeLeft = 0.0f; + private float scratchX, scratchY; + + protected void Start () + { + // Disable if we don't support image effects + if (!SystemInfo.supportsImageEffects) { + enabled = false; + return; + } + + if ( shaderRGB == null || shaderYUV == null ) + { + Debug.Log( "Noise shaders are not set up! Disabling noise effect." ); + enabled = false; + } + else + { + if ( !shaderRGB.isSupported ) // disable effect if RGB shader is not supported + enabled = false; + else if ( !shaderYUV.isSupported ) // fallback to RGB if YUV is not supported + rgbFallback = true; + } + } + + protected Material material { + get { + if ( m_MaterialRGB == null ) { + m_MaterialRGB = new Material( shaderRGB ); + m_MaterialRGB.hideFlags = HideFlags.HideAndDontSave; + } + if ( m_MaterialYUV == null && !rgbFallback ) { + m_MaterialYUV = new Material( shaderYUV ); + m_MaterialYUV.hideFlags = HideFlags.HideAndDontSave; + } + return (!rgbFallback && !monochrome) ? m_MaterialYUV : m_MaterialRGB; + } + } + + protected void OnDisable() { + if ( m_MaterialRGB ) + DestroyImmediate( m_MaterialRGB ); + if ( m_MaterialYUV ) + DestroyImmediate( m_MaterialYUV ); + } + + private void SanitizeParameters() + { + grainIntensityMin = Mathf.Clamp( grainIntensityMin, 0.0f, 5.0f ); + grainIntensityMax = Mathf.Clamp( grainIntensityMax, 0.0f, 5.0f ); + scratchIntensityMin = Mathf.Clamp( scratchIntensityMin, 0.0f, 5.0f ); + scratchIntensityMax = Mathf.Clamp( scratchIntensityMax, 0.0f, 5.0f ); + scratchFPS = Mathf.Clamp( scratchFPS, 1, 30 ); + scratchJitter = Mathf.Clamp( scratchJitter, 0.0f, 1.0f ); + grainSize = Mathf.Clamp( grainSize, 0.1f, 50.0f ); + } + + // Called by the camera to apply the image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + SanitizeParameters(); + + if ( scratchTimeLeft <= 0.0f ) + { + scratchTimeLeft = Random.value * 2 / scratchFPS; // we have sanitized it earlier, won't be zero + scratchX = Random.value; + scratchY = Random.value; + } + scratchTimeLeft -= Time.deltaTime; + + Material mat = material; + + mat.SetTexture("_GrainTex", grainTexture); + mat.SetTexture("_ScratchTex", scratchTexture); + float grainScale = 1.0f / grainSize; // we have sanitized it earlier, won't be zero + mat.SetVector("_GrainOffsetScale", new Vector4( + Random.value, + Random.value, + (float)Screen.width / (float)grainTexture.width * grainScale, + (float)Screen.height / (float)grainTexture.height * grainScale + )); + mat.SetVector("_ScratchOffsetScale", new Vector4( + scratchX + Random.value*scratchJitter, + scratchY + Random.value*scratchJitter, + (float)Screen.width / (float) scratchTexture.width, + (float)Screen.height / (float) scratchTexture.height + )); + mat.SetVector("_Intensity", new Vector4( + Random.Range(grainIntensityMin, grainIntensityMax), + Random.Range(scratchIntensityMin, scratchIntensityMax), + 0, 0 )); + Graphics.Blit (source, destination, mat); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndScratches.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndScratches.cs.meta new file mode 100644 index 0000000..6d5b821 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/NoiseAndScratches.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a88a26a276b4e47619ce2c5adad33fab +MonoImporter: + serializedVersion: 2 + defaultReferences: + - grainTexture: {fileID: 2800000, guid: ffa9c02760c2b4e8eb9814ec06c4b05b, type: 3} + - scratchTexture: {fileID: 2800000, guid: 6205c27cc031f4e66b8ea90d1bfaa158, type: 3} + - shaderRGB: {fileID: 4800000, guid: 5d7f4c401ae8946bcb0d6ff68a9e7466, type: 3} + - shaderYUV: {fileID: 4800000, guid: 0e447868506ba49f0a73235b8a8b647a, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsBase.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsBase.cs new file mode 100644 index 0000000..9dc4be9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsBase.cs @@ -0,0 +1,261 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + public class PostEffectsBase : MonoBehaviour + { + protected bool supportHDRTextures = true; + protected bool supportDX11 = false; + protected bool isSupported = true; + + private List createdMaterials = new List (); + + protected Material CheckShaderAndCreateMaterial ( Shader s, Material m2Create) + { + if (!s) + { + Debug.Log("Missing shader in " + ToString ()); + enabled = false; + return null; + } + + if (s.isSupported && m2Create && m2Create.shader == s) + return m2Create; + + if (!s.isSupported) + { + NotSupported (); + Debug.Log("The shader " + s.ToString() + " on effect "+ToString()+" is not supported on this platform!"); + return null; + } + + m2Create = new Material (s); + createdMaterials.Add (m2Create); + m2Create.hideFlags = HideFlags.DontSave; + + return m2Create; + } + + + protected Material CreateMaterial (Shader s, Material m2Create) + { + if (!s) + { + Debug.Log ("Missing shader in " + ToString ()); + return null; + } + + if (m2Create && (m2Create.shader == s) && (s.isSupported)) + return m2Create; + + if (!s.isSupported) + { + return null; + } + + m2Create = new Material (s); + createdMaterials.Add (m2Create); + m2Create.hideFlags = HideFlags.DontSave; + + return m2Create; + } + + void OnEnable () + { + isSupported = true; + } + + void OnDestroy () + { + RemoveCreatedMaterials (); + } + + private void RemoveCreatedMaterials () + { + while (createdMaterials.Count > 0) + { + Material mat = createdMaterials[0]; + createdMaterials.RemoveAt (0); +#if UNITY_EDITOR + DestroyImmediate (mat); +#else + Destroy(mat); +#endif + } + } + + protected bool CheckSupport () + { + return CheckSupport (false); + } + + + public virtual bool CheckResources () + { + Debug.LogWarning ("CheckResources () for " + ToString() + " should be overwritten."); + return isSupported; + } + + + protected void Start () + { + CheckResources (); + } + + protected bool CheckSupport (bool needDepth) + { + isSupported = true; + supportHDRTextures = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf); + supportDX11 = SystemInfo.graphicsShaderLevel >= 50 && SystemInfo.supportsComputeShaders; + + if (!SystemInfo.supportsImageEffects) + { + NotSupported (); + return false; + } + + if (needDepth && !SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.Depth)) + { + NotSupported (); + return false; + } + + if (needDepth) + GetComponent().depthTextureMode |= DepthTextureMode.Depth; + + return true; + } + + protected bool CheckSupport (bool needDepth, bool needHdr) + { + if (!CheckSupport(needDepth)) + return false; + + if (needHdr && !supportHDRTextures) + { + NotSupported (); + return false; + } + + return true; + } + + + public bool Dx11Support () + { + return supportDX11; + } + + + protected void ReportAutoDisable () + { + Debug.LogWarning ("The image effect " + ToString() + " has been disabled as it's not supported on the current platform."); + } + + // deprecated but needed for old effects to survive upgrading + bool CheckShader (Shader s) + { + Debug.Log("The shader " + s.ToString () + " on effect "+ ToString () + " is not part of the Unity 3.2+ effects suite anymore. For best performance and quality, please ensure you are using the latest Standard Assets Image Effects (Pro only) package."); + if (!s.isSupported) + { + NotSupported (); + return false; + } + else + { + return false; + } + } + + + protected void NotSupported () + { + enabled = false; + isSupported = false; + return; + } + + + protected void DrawBorder (RenderTexture dest, Material material) + { + float x1; + float x2; + float y1; + float y2; + + RenderTexture.active = dest; + bool invertY = true; // source.texelSize.y < 0.0ff; + // Set up the simple Matrix + GL.PushMatrix(); + GL.LoadOrtho(); + + for (int i = 0; i < material.passCount; i++) + { + material.SetPass(i); + + float y1_; float y2_; + if (invertY) + { + y1_ = 1.0f; y2_ = 0.0f; + } + else + { + y1_ = 0.0f; y2_ = 1.0f; + } + + // left + x1 = 0.0f; + x2 = 0.0f + 1.0f/(dest.width*1.0f); + y1 = 0.0f; + y2 = 1.0f; + GL.Begin(GL.QUADS); + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + // right + x1 = 1.0f - 1.0f/(dest.width*1.0f); + x2 = 1.0f; + y1 = 0.0f; + y2 = 1.0f; + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + // top + x1 = 0.0f; + x2 = 1.0f; + y1 = 0.0f; + y2 = 0.0f + 1.0f/(dest.height*1.0f); + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + // bottom + x1 = 0.0f; + x2 = 1.0f; + y1 = 1.0f - 1.0f/(dest.height*1.0f); + y2 = 1.0f; + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + GL.End(); + } + + GL.PopMatrix(); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsBase.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsBase.cs.meta new file mode 100644 index 0000000..a310534 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsBase.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b6f4318ec6c2bf643a0f9edfeeaba0ec +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsHelper.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsHelper.cs new file mode 100644 index 0000000..156370f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsHelper.cs @@ -0,0 +1,188 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + class PostEffectsHelper : MonoBehaviour + { + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + Debug.Log("OnRenderImage in Helper called ..."); + } + + static void DrawLowLevelPlaneAlignedWithCamera ( + float dist , + RenderTexture source, RenderTexture dest , + Material material , + Camera cameraForProjectionMatrix ) + { + // Make the destination texture the target for all rendering + RenderTexture.active = dest; + // Assign the source texture to a property from a shader + material.SetTexture("_MainTex", source); + bool invertY = true; // source.texelSize.y < 0.0f; + // Set up the simple Matrix + GL.PushMatrix(); + GL.LoadIdentity(); + GL.LoadProjectionMatrix(cameraForProjectionMatrix.projectionMatrix); + + float fovYHalfRad = cameraForProjectionMatrix.fieldOfView * 0.5f * Mathf.Deg2Rad; + float cotangent = Mathf.Cos(fovYHalfRad) / Mathf.Sin(fovYHalfRad); + float asp = cameraForProjectionMatrix.aspect; + + float x1 = asp/-cotangent; + float x2 = asp/cotangent; + float y1 = 1.0f/-cotangent; + float y2 = 1.0f/cotangent; + + float sc = 1.0f; // magic constant (for now) + + x1 *= dist * sc; + x2 *= dist * sc; + y1 *= dist * sc; + y2 *= dist * sc; + + float z1 = -dist; + + for (int i = 0; i < material.passCount; i++) + { + material.SetPass(i); + + GL.Begin(GL.QUADS); + float y1_; float y2_; + if (invertY) + { + y1_ = 1.0f; y2_ = 0.0f; + } + else + { + y1_ = 0.0f; y2_ = 1.0f; + } + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, z1); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, z1); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, z1); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, z1); + GL.End(); + } + + GL.PopMatrix(); + } + + static void DrawBorder ( + RenderTexture dest , + Material material ) + { + float x1; + float x2; + float y1; + float y2; + + RenderTexture.active = dest; + bool invertY = true; // source.texelSize.y < 0.0ff; + // Set up the simple Matrix + GL.PushMatrix(); + GL.LoadOrtho(); + + for (int i = 0; i < material.passCount; i++) + { + material.SetPass(i); + + float y1_; float y2_; + if (invertY) + { + y1_ = 1.0f; y2_ = 0.0f; + } + else + { + y1_ = 0.0f; y2_ = 1.0f; + } + + // left + x1 = 0.0f; + x2 = 0.0f + 1.0f/(dest.width*1.0f); + y1 = 0.0f; + y2 = 1.0f; + GL.Begin(GL.QUADS); + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + // right + x1 = 1.0f - 1.0f/(dest.width*1.0f); + x2 = 1.0f; + y1 = 0.0f; + y2 = 1.0f; + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + // top + x1 = 0.0f; + x2 = 1.0f; + y1 = 0.0f; + y2 = 0.0f + 1.0f/(dest.height*1.0f); + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + // bottom + x1 = 0.0f; + x2 = 1.0f; + y1 = 1.0f - 1.0f/(dest.height*1.0f); + y2 = 1.0f; + + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + + GL.End(); + } + + GL.PopMatrix(); + } + + static void DrawLowLevelQuad ( float x1, float x2, float y1, float y2, RenderTexture source, RenderTexture dest, Material material ) + { + // Make the destination texture the target for all rendering + RenderTexture.active = dest; + // Assign the source texture to a property from a shader + material.SetTexture("_MainTex", source); + bool invertY = true; // source.texelSize.y < 0.0f; + // Set up the simple Matrix + GL.PushMatrix(); + GL.LoadOrtho(); + + for (int i = 0; i < material.passCount; i++) + { + material.SetPass(i); + + GL.Begin(GL.QUADS); + float y1_; float y2_; + if (invertY) + { + y1_ = 1.0f; y2_ = 0.0f; + } + else + { + y1_ = 0.0f; y2_ = 1.0f; + } + GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); + GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); + GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); + GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); + GL.End(); + } + + GL.PopMatrix(); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsHelper.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsHelper.cs.meta new file mode 100644 index 0000000..4ccd033 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/PostEffectsHelper.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 50b03df8f04b5c441aaac5b7fccb4734 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Quads.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Quads.cs new file mode 100644 index 0000000..3d2caca --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Quads.cs @@ -0,0 +1,125 @@ +using System; +using UnityEngine; +using Object = UnityEngine.Object; + +// same as Triangles but creates quads instead which generally +// saves fillrate at the expense for more triangles to issue +namespace UnityStandardAssets.ImageEffects +{ + class Quads + { + static Mesh[] meshes; + static int currentQuads = 0; + + static bool HasMeshes () + { + if (meshes == null) + return false; + foreach (Mesh m in meshes) + if (null == m) + return false; + return true; + } + + + public static void Cleanup () + { + if (meshes == null) + return; + + for (int i = 0; i < meshes.Length; i++) + { + if (null != meshes[i]) + { + Object.DestroyImmediate (meshes[i]); + meshes[i] = null; + } + } + meshes = null; + } + + + public static Mesh[] GetMeshes ( int totalWidth, int totalHeight) + { + if (HasMeshes () && (currentQuads == (totalWidth * totalHeight))) { + return meshes; + } + + int maxQuads = 65000 / 6; + int totalQuads = totalWidth * totalHeight; + currentQuads = totalQuads; + + int meshCount = Mathf.CeilToInt ((1.0f * totalQuads) / (1.0f * maxQuads)); + + meshes = new Mesh [meshCount]; + + int i = 0; + int index = 0; + for (i = 0; i < totalQuads; i += maxQuads) + { + int quads = Mathf.FloorToInt (Mathf.Clamp ((totalQuads-i), 0, maxQuads)); + + meshes[index] = GetMesh (quads, i, totalWidth, totalHeight); + index++; + } + + return meshes; + } + + static Mesh GetMesh (int triCount, int triOffset, int totalWidth, int totalHeight) + { + var mesh = new Mesh (); + mesh.hideFlags = HideFlags.DontSave; + + var verts = new Vector3[triCount * 4]; + var uvs = new Vector2[triCount * 4]; + var uvs2 = new Vector2[triCount * 4]; + var tris = new int[triCount * 6]; + + for (int i = 0; i < triCount; i++) + { + int i4 = i * 4; + int i6 = i * 6; + + int vertexWithOffset = triOffset + i; + + float x = Mathf.Floor (vertexWithOffset % totalWidth) / totalWidth; + float y = Mathf.Floor (vertexWithOffset / totalWidth) / totalHeight; + + Vector3 position = new Vector3 (x * 2 - 1, y * 2 - 1, 1.0f); + + verts[i4 + 0] = position; + verts[i4 + 1] = position; + verts[i4 + 2] = position; + verts[i4 + 3] = position; + + uvs[i4 + 0] = new Vector2 (0.0f, 0.0f); + uvs[i4 + 1] = new Vector2 (1.0f, 0.0f); + uvs[i4 + 2] = new Vector2 (0.0f, 1.0f); + uvs[i4 + 3] = new Vector2 (1.0f, 1.0f); + + uvs2[i4 + 0] = new Vector2 (x, y); + uvs2[i4 + 1] = new Vector2 (x, y); + uvs2[i4 + 2] = new Vector2 (x, y); + uvs2[i4 + 3] = new Vector2 (x, y); + + tris[i6 + 0] = i4 + 0; + tris[i6 + 1] = i4 + 1; + tris[i6 + 2] = i4 + 2; + + tris[i6 + 3] = i4 + 1; + tris[i6 + 4] = i4 + 2; + tris[i6 + 5] = i4 + 3; + + } + + mesh.vertices = verts; + mesh.triangles = tris; + mesh.uv = uvs; + mesh.uv2 = uvs2; + + return mesh; + } + + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Quads.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Quads.cs.meta new file mode 100644 index 0000000..14c9d59 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Quads.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a20852ce049f64e4695a48b6a354be83 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenOverlay.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenOverlay.cs new file mode 100644 index 0000000..790593c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenOverlay.cs @@ -0,0 +1,69 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Other/Screen Overlay")] + public class ScreenOverlay : PostEffectsBase + { + public enum OverlayBlendMode + { + Additive = 0, + ScreenBlend = 1, + Multiply = 2, + Overlay = 3, + AlphaBlend = 4, + } + + public OverlayBlendMode blendMode = OverlayBlendMode.Overlay; + public float intensity = 1.0f; + public Texture2D texture = null; + + public Shader overlayShader = null; + private Material overlayMaterial = null; + + + public override bool CheckResources () + { + CheckSupport (false); + + overlayMaterial = CheckShaderAndCreateMaterial (overlayShader, overlayMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (CheckResources() == false) + { + Graphics.Blit (source, destination); + return; + } + + Vector4 UV_Transform = new Vector4(1, 0, 0, 1); + + #if UNITY_WP8 + // WP8 has no OS support for rotating screen with device orientation, + // so we do those transformations ourselves. + if (Screen.orientation == ScreenOrientation.LandscapeLeft) { + UV_Transform = new Vector4(0, -1, 1, 0); + } + if (Screen.orientation == ScreenOrientation.LandscapeRight) { + UV_Transform = new Vector4(0, 1, -1, 0); + } + if (Screen.orientation == ScreenOrientation.PortraitUpsideDown) { + UV_Transform = new Vector4(-1, 0, 0, -1); + } + #endif + + overlayMaterial.SetVector("_UV_Transform", UV_Transform); + overlayMaterial.SetFloat ("_Intensity", intensity); + overlayMaterial.SetTexture ("_Overlay", texture); + Graphics.Blit (source, destination, overlayMaterial, (int) blendMode); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenOverlay.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenOverlay.cs.meta new file mode 100644 index 0000000..75c03f9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenOverlay.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f19108706fdce9469603d07980eb8ad +MonoImporter: + serializedVersion: 2 + defaultReferences: + - texture: {instanceID: 0} + - overlayShader: {fileID: 4800000, guid: 8c81db0e527d24acc9bcec04e87781bd, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientObscurance.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientObscurance.cs new file mode 100644 index 0000000..c6b7949 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientObscurance.cs @@ -0,0 +1,123 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Rendering/Screen Space Ambient Obscurance")] + class ScreenSpaceAmbientObscurance : PostEffectsBase { + [Range (0,3)] + public float intensity = 0.5f; + [Range (0.1f,3)] + public float radius = 0.2f; + [Range (0,3)] + public int blurIterations = 1; + [Range (0,5)] + public float blurFilterDistance = 1.25f; + [Range (0,1)] + public int downsample = 0; + + public Texture2D rand = null; + public Shader aoShader= null; + + private Material aoMaterial = null; + + public override bool CheckResources () { + CheckSupport (true); + + aoMaterial = CheckShaderAndCreateMaterial (aoShader, aoMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnDisable () { + if (aoMaterial) + DestroyImmediate (aoMaterial); + aoMaterial = null; + } + + [ImageEffectOpaque] + void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (CheckResources () == false) { + Graphics.Blit (source, destination); + return; + } + Camera camera = GetComponent(); + + Matrix4x4 P = camera.projectionMatrix; + var invP= P.inverse; + Vector4 projInfo = new Vector4 + ((-2.0f / P[0,0]), + (-2.0f / P[1,1]), + ((1.0f - P[0,2]) / P[0,0]), + ((1.0f + P[1,2]) / P[1,1])); + + if (camera.stereoEnabled) + { + Matrix4x4 P0 = camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left); + Matrix4x4 P1 = camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right); + + Vector4 projInfo0 = new Vector4 + ((-2.0f / (P0[0, 0])), + (-2.0f / (P0[1, 1])), + ((1.0f - P0[0, 2]) / P0[0, 0]), + ((1.0f + P0[1, 2]) / P0[1, 1])); + + Vector4 projInfo1 = new Vector4 + ((-2.0f / (P1[0, 0])), + (-2.0f / (P1[1, 1])), + ((1.0f - P1[0, 2]) / P1[0, 0]), + ((1.0f + P1[1, 2]) / P1[1, 1])); + + aoMaterial.SetVector("_ProjInfoLeft", projInfo0); // used for unprojection + aoMaterial.SetVector("_ProjInfoRight", projInfo1); // used for unprojection + } + + aoMaterial.SetVector ("_ProjInfo", projInfo); // used for unprojection + aoMaterial.SetMatrix ("_ProjectionInv", invP); // only used for reference + aoMaterial.SetTexture ("_Rand", rand); // not needed for DX11 :) + aoMaterial.SetFloat ("_Radius", radius); + aoMaterial.SetFloat ("_Radius2", radius*radius); + aoMaterial.SetFloat ("_Intensity", intensity); + aoMaterial.SetFloat ("_BlurFilterDistance", blurFilterDistance); + + int rtW = source.width; + int rtH = source.height; + + RenderTexture tmpRt = RenderTexture.GetTemporary (rtW>>downsample, rtH>>downsample); + RenderTexture tmpRt2; + + Graphics.Blit (source, tmpRt, aoMaterial, 0); + + if (downsample > 0) { + tmpRt2 = RenderTexture.GetTemporary (rtW, rtH); + Graphics.Blit(tmpRt, tmpRt2, aoMaterial, 4); + RenderTexture.ReleaseTemporary (tmpRt); + tmpRt = tmpRt2; + + // @NOTE: it's probably worth a shot to blur in low resolution + // instead with a bilat-upsample afterwards ... + } + + for (int i = 0; i < blurIterations; i++) { + aoMaterial.SetVector("_Axis", new Vector2(1.0f,0.0f)); + tmpRt2 = RenderTexture.GetTemporary (rtW, rtH); + Graphics.Blit (tmpRt, tmpRt2, aoMaterial, 1); + RenderTexture.ReleaseTemporary (tmpRt); + + aoMaterial.SetVector("_Axis", new Vector2(0.0f,1.0f)); + tmpRt = RenderTexture.GetTemporary (rtW, rtH); + Graphics.Blit (tmpRt2, tmpRt, aoMaterial, 1); + RenderTexture.ReleaseTemporary (tmpRt2); + } + + aoMaterial.SetTexture ("_AOTex", tmpRt); + Graphics.Blit (source, destination, aoMaterial, 2); + + RenderTexture.ReleaseTemporary (tmpRt); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientObscurance.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientObscurance.cs.meta new file mode 100644 index 0000000..99d4452 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientObscurance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 75febd242c999f04d9654522a10c006b +MonoImporter: + serializedVersion: 2 + defaultReferences: + - rand: {fileID: 2800000, guid: a181ca8e3c62f3e4b8f183f6c586b032, type: 3} + - aoShader: {fileID: 4800000, guid: 95616c020c5604dda96cf76afbbc0272, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientOcclusion.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientOcclusion.cs new file mode 100644 index 0000000..7981ff8 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientOcclusion.cs @@ -0,0 +1,205 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu("Image Effects/Rendering/Screen Space Ambient Occlusion")] + public class ScreenSpaceAmbientOcclusion : MonoBehaviour + { + public enum SSAOSamples + { + Low = 0, + Medium = 1, + High = 2, + } + + [Range(0.05f, 1.0f)] + public float m_Radius = 0.4f; + public SSAOSamples m_SampleCount = SSAOSamples.Medium; + [Range(0.5f, 4.0f)] + public float m_OcclusionIntensity = 1.5f; + [Range(0, 4)] + public int m_Blur = 2; + [Range(1,6)] + public int m_Downsampling = 2; + [Range(0.2f, 2.0f)] + public float m_OcclusionAttenuation = 1.0f; + [Range(0.00001f, 0.5f)] + public float m_MinZ = 0.01f; + + public Shader m_SSAOShader; + private Material m_SSAOMaterial; + + public Texture2D m_RandomTexture; + + private bool m_Supported; + + private static Material CreateMaterial (Shader shader) + { + if (!shader) + return null; + Material m = new Material (shader); + m.hideFlags = HideFlags.HideAndDontSave; + return m; + } + private static void DestroyMaterial (Material mat) + { + if (mat) + { + DestroyImmediate (mat); + mat = null; + } + } + + + void OnDisable() + { + DestroyMaterial (m_SSAOMaterial); + } + + void Start() + { + if (!SystemInfo.supportsImageEffects || !SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.Depth)) + { + m_Supported = false; + enabled = false; + return; + } + + CreateMaterials (); + if (!m_SSAOMaterial || m_SSAOMaterial.passCount != 5) + { + m_Supported = false; + enabled = false; + return; + } + + //CreateRandomTable (26, 0.2f); + + m_Supported = true; + } + + void OnEnable () { + GetComponent().depthTextureMode |= DepthTextureMode.DepthNormals; + } + + private void CreateMaterials () + { + if (!m_SSAOMaterial && m_SSAOShader.isSupported) + { + m_SSAOMaterial = CreateMaterial (m_SSAOShader); + m_SSAOMaterial.SetTexture ("_RandomTexture", m_RandomTexture); + } + } + + [ImageEffectOpaque] + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if (!m_Supported || !m_SSAOShader.isSupported) { + enabled = false; + return; + } + CreateMaterials (); + + m_Downsampling = Mathf.Clamp (m_Downsampling, 1, 6); + m_Radius = Mathf.Clamp (m_Radius, 0.05f, 1.0f); + m_MinZ = Mathf.Clamp (m_MinZ, 0.00001f, 0.5f); + m_OcclusionIntensity = Mathf.Clamp (m_OcclusionIntensity, 0.5f, 4.0f); + m_OcclusionAttenuation = Mathf.Clamp (m_OcclusionAttenuation, 0.2f, 2.0f); + m_Blur = Mathf.Clamp (m_Blur, 0, 4); + + // Render SSAO term into a smaller texture + RenderTexture rtAO = RenderTexture.GetTemporary (source.width / m_Downsampling, source.height / m_Downsampling, 0); + float fovY = GetComponent().fieldOfView; + float far = GetComponent().farClipPlane; + float y = Mathf.Tan (fovY * Mathf.Deg2Rad * 0.5f) * far; + float x = y * GetComponent().aspect; + m_SSAOMaterial.SetVector ("_FarCorner", new Vector3(x,y,far)); + int noiseWidth, noiseHeight; + if (m_RandomTexture) { + noiseWidth = m_RandomTexture.width; + noiseHeight = m_RandomTexture.height; + } else { + noiseWidth = 1; noiseHeight = 1; + } + m_SSAOMaterial.SetVector ("_NoiseScale", new Vector3 ((float)rtAO.width / noiseWidth, (float)rtAO.height / noiseHeight, 0.0f)); + m_SSAOMaterial.SetVector ("_Params", new Vector4( + m_Radius, + m_MinZ, + 1.0f / m_OcclusionAttenuation, + m_OcclusionIntensity)); + + bool doBlur = m_Blur > 0; + Graphics.Blit (doBlur ? null : source, rtAO, m_SSAOMaterial, (int)m_SampleCount); + + if (doBlur) + { + // Blur SSAO horizontally + RenderTexture rtBlurX = RenderTexture.GetTemporary (source.width, source.height, 0); + m_SSAOMaterial.SetVector ("_TexelOffsetScale", + new Vector4 ((float)m_Blur / source.width, 0,0,0)); + m_SSAOMaterial.SetTexture ("_SSAO", rtAO); + Graphics.Blit (null, rtBlurX, m_SSAOMaterial, 3); + RenderTexture.ReleaseTemporary (rtAO); // original rtAO not needed anymore + + // Blur SSAO vertically + RenderTexture rtBlurY = RenderTexture.GetTemporary (source.width, source.height, 0); + m_SSAOMaterial.SetVector ("_TexelOffsetScale", + new Vector4 (0, (float)m_Blur/source.height, 0,0)); + m_SSAOMaterial.SetTexture ("_SSAO", rtBlurX); + Graphics.Blit (source, rtBlurY, m_SSAOMaterial, 3); + RenderTexture.ReleaseTemporary (rtBlurX); // blurX RT not needed anymore + + rtAO = rtBlurY; // AO is the blurred one now + } + + // Modulate scene rendering with SSAO + m_SSAOMaterial.SetTexture ("_SSAO", rtAO); + Graphics.Blit (source, destination, m_SSAOMaterial, 4); + + RenderTexture.ReleaseTemporary (rtAO); + } + + /* + private void CreateRandomTable (int count, float minLength) + { + Random.seed = 1337; + Vector3[] samples = new Vector3[count]; + // initial samples + for (int i = 0; i < count; ++i) + samples[i] = Random.onUnitSphere; + // energy minimization: push samples away from others + int iterations = 100; + while (iterations-- > 0) { + for (int i = 0; i < count; ++i) { + Vector3 vec = samples[i]; + Vector3 res = Vector3.zero; + // minimize with other samples + for (int j = 0; j < count; ++j) { + Vector3 force = vec - samples[j]; + float fac = Vector3.Dot (force, force); + if (fac > 0.00001f) + res += force * (1.0f / fac); + } + samples[i] = (samples[i] + res * 0.5f).normalized; + } + } + // now scale samples between minLength and 1.0 + for (int i = 0; i < count; ++i) { + samples[i] = samples[i] * Random.Range (minLength, 1.0f); + } + + string table = string.Format ("#define SAMPLE_COUNT {0}\n", count); + table += "const float3 RAND_SAMPLES[SAMPLE_COUNT] = {\n"; + for (int i = 0; i < count; ++i) { + Vector3 v = samples[i]; + table += string.Format("\tfloat3({0},{1},{2}),\n", v.x, v.y, v.z); + } + table += "};\n"; + Debug.Log (table); + } + */ + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientOcclusion.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientOcclusion.cs.meta new file mode 100644 index 0000000..8fda23b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/ScreenSpaceAmbientOcclusion.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b0923359e9e352a4b9b11c7b7161ad67 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - m_SSAOShader: {fileID: 4800000, guid: 43ca18288c424f645aaa1e9e07f04c50, type: 3} + - m_RandomTexture: {fileID: 2800000, guid: a181ca8e3c62f3e4b8f183f6c586b032, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/SepiaTone.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SepiaTone.cs new file mode 100644 index 0000000..86ac0c1 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SepiaTone.cs @@ -0,0 +1,16 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Color Adjustments/Sepia Tone")] + public class SepiaTone : ImageEffectBase + { + // Called by camera to apply image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + Graphics.Blit (source, destination, material); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/SepiaTone.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SepiaTone.cs.meta new file mode 100644 index 0000000..94ff94c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SepiaTone.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a07a781cad112c75d0008dfa8d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: b6aa781cad112c75d0008dfa8d76c639, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/SunShafts.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SunShafts.cs new file mode 100644 index 0000000..53f21e7 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SunShafts.cs @@ -0,0 +1,151 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Rendering/Sun Shafts")] + public class SunShafts : PostEffectsBase + { + public enum SunShaftsResolution + { + Low = 0, + Normal = 1, + High = 2, + } + + public enum ShaftsScreenBlendMode + { + Screen = 0, + Add = 1, + } + + + public SunShaftsResolution resolution = SunShaftsResolution.Normal; + public ShaftsScreenBlendMode screenBlendMode = ShaftsScreenBlendMode.Screen; + + public Transform sunTransform; + public int radialBlurIterations = 2; + public Color sunColor = Color.white; + public Color sunThreshold = new Color(0.87f,0.74f,0.65f); + public float sunShaftBlurRadius = 2.5f; + public float sunShaftIntensity = 1.15f; + + public float maxRadius = 0.75f; + + public bool useDepthTexture = true; + + public Shader sunShaftsShader; + private Material sunShaftsMaterial; + + public Shader simpleClearShader; + private Material simpleClearMaterial; + + + public override bool CheckResources () { + CheckSupport (useDepthTexture); + + sunShaftsMaterial = CheckShaderAndCreateMaterial (sunShaftsShader, sunShaftsMaterial); + simpleClearMaterial = CheckShaderAndCreateMaterial (simpleClearShader, simpleClearMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (CheckResources()==false) { + Graphics.Blit (source, destination); + return; + } + + // we actually need to check this every frame + if (useDepthTexture) + GetComponent().depthTextureMode |= DepthTextureMode.Depth; + + int divider = 4; + if (resolution == SunShaftsResolution.Normal) + divider = 2; + else if (resolution == SunShaftsResolution.High) + divider = 1; + + Vector3 v = Vector3.one * 0.5f; + if (sunTransform) + v = GetComponent().WorldToViewportPoint (sunTransform.position); + else + v = new Vector3(0.5f, 0.5f, 0.0f); + + int rtW = source.width / divider; + int rtH = source.height / divider; + + RenderTexture lrColorB; + RenderTexture lrDepthBuffer = RenderTexture.GetTemporary (rtW, rtH, 0); + + // mask out everything except the skybox + // we have 2 methods, one of which requires depth buffer support, the other one is just comparing images + + sunShaftsMaterial.SetVector ("_BlurRadius4", new Vector4 (1.0f, 1.0f, 0.0f, 0.0f) * sunShaftBlurRadius ); + sunShaftsMaterial.SetVector ("_SunPosition", new Vector4 (v.x, v.y, v.z, maxRadius)); + sunShaftsMaterial.SetVector ("_SunThreshold", sunThreshold); + + if (!useDepthTexture) { +#if UNITY_5_6_OR_NEWER + var format = GetComponent().allowHDR ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default; +#else + var format = GetComponent().hdr ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default; +#endif + RenderTexture tmpBuffer = RenderTexture.GetTemporary (source.width, source.height, 0, format); + RenderTexture.active = tmpBuffer; + GL.ClearWithSkybox (false, GetComponent()); + + sunShaftsMaterial.SetTexture ("_Skybox", tmpBuffer); + Graphics.Blit (source, lrDepthBuffer, sunShaftsMaterial, 3); + RenderTexture.ReleaseTemporary (tmpBuffer); + } + else { + Graphics.Blit (source, lrDepthBuffer, sunShaftsMaterial, 2); + } + + // paint a small black small border to get rid of clamping problems + DrawBorder (lrDepthBuffer, simpleClearMaterial); + + // radial blur: + + radialBlurIterations = Mathf.Clamp (radialBlurIterations, 1, 4); + + float ofs = sunShaftBlurRadius * (1.0f / 768.0f); + + sunShaftsMaterial.SetVector ("_BlurRadius4", new Vector4 (ofs, ofs, 0.0f, 0.0f)); + sunShaftsMaterial.SetVector ("_SunPosition", new Vector4 (v.x, v.y, v.z, maxRadius)); + + for (int it2 = 0; it2 < radialBlurIterations; it2++ ) { + // each iteration takes 2 * 6 samples + // we update _BlurRadius each time to cheaply get a very smooth look + + lrColorB = RenderTexture.GetTemporary (rtW, rtH, 0); + Graphics.Blit (lrDepthBuffer, lrColorB, sunShaftsMaterial, 1); + RenderTexture.ReleaseTemporary (lrDepthBuffer); + ofs = sunShaftBlurRadius * (((it2 * 2.0f + 1.0f) * 6.0f)) / 768.0f; + sunShaftsMaterial.SetVector ("_BlurRadius4", new Vector4 (ofs, ofs, 0.0f, 0.0f) ); + + lrDepthBuffer = RenderTexture.GetTemporary (rtW, rtH, 0); + Graphics.Blit (lrColorB, lrDepthBuffer, sunShaftsMaterial, 1); + RenderTexture.ReleaseTemporary (lrColorB); + ofs = sunShaftBlurRadius * (((it2 * 2.0f + 2.0f) * 6.0f)) / 768.0f; + sunShaftsMaterial.SetVector ("_BlurRadius4", new Vector4 (ofs, ofs, 0.0f, 0.0f) ); + } + + // put together: + + if (v.z >= 0.0f) + sunShaftsMaterial.SetVector ("_SunColor", new Vector4 (sunColor.r, sunColor.g, sunColor.b, sunColor.a) * sunShaftIntensity); + else + sunShaftsMaterial.SetVector ("_SunColor", Vector4.zero); // no backprojection ! + sunShaftsMaterial.SetTexture ("_ColorBuffer", lrDepthBuffer); + Graphics.Blit (source, destination, sunShaftsMaterial, (screenBlendMode == ShaftsScreenBlendMode.Screen) ? 0 : 4); + + RenderTexture.ReleaseTemporary (lrDepthBuffer); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/SunShafts.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SunShafts.cs.meta new file mode 100644 index 0000000..acf1863 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/SunShafts.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 60e318a6043c1cb4a8ce1c8805bab930 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - sunTransform: {instanceID: 0} + - sunShaftsShader: {fileID: 4800000, guid: d3b1c8c1036784176946f5cfbfb7fe4c, type: 3} + - simpleClearShader: {fileID: 4800000, guid: f688f89ed5eb847c5b19c934a0f1e772, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/TiltShift.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/TiltShift.cs new file mode 100644 index 0000000..c5a23c9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/TiltShift.cs @@ -0,0 +1,76 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Camera/Tilt Shift (Lens Blur)")] + class TiltShift : PostEffectsBase { + public enum TiltShiftMode + { + TiltShiftMode, + IrisMode, + } + public enum TiltShiftQuality + { + Preview, + Low, + Normal, + High, + } + + public TiltShiftMode mode = TiltShiftMode.TiltShiftMode; + public TiltShiftQuality quality = TiltShiftQuality.Normal; + + [Range(0.0f, 15.0f)] + public float blurArea = 1.0f; + + [Range(0.0f, 25.0f)] + public float maxBlurSize = 5.0f; + + [Range(0, 1)] + public int downsample = 0; + + public Shader tiltShiftShader = null; + private Material tiltShiftMaterial = null; + + + public override bool CheckResources () { + CheckSupport (false); + + tiltShiftMaterial = CheckShaderAndCreateMaterial (tiltShiftShader, tiltShiftMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + void OnRenderImage (RenderTexture source, RenderTexture destination) { + if (CheckResources() == false) { + Graphics.Blit (source, destination); + return; + } + + tiltShiftMaterial.SetFloat("_BlurSize", maxBlurSize < 0.0f ? 0.0f : maxBlurSize); + tiltShiftMaterial.SetFloat("_BlurArea", blurArea); + source.filterMode = FilterMode.Bilinear; + + RenderTexture rt = destination; + if (downsample > 0f) { + rt = RenderTexture.GetTemporary (source.width>>downsample, source.height>>downsample, 0, source.format); + rt.filterMode = FilterMode.Bilinear; + } + + int basePassNr = (int) quality; basePassNr *= 2; + Graphics.Blit (source, rt, tiltShiftMaterial, mode == TiltShiftMode.TiltShiftMode ? basePassNr : basePassNr + 1); + + if (downsample > 0) { + tiltShiftMaterial.SetTexture ("_Blurred", rt); + Graphics.Blit (source, destination, tiltShiftMaterial, 8); + } + + if (rt != destination) + RenderTexture.ReleaseTemporary (rt); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/TiltShift.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/TiltShift.cs.meta new file mode 100644 index 0000000..6fb44f4 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/TiltShift.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a22b3a7095a744a428c134b5e26ad68e +MonoImporter: + serializedVersion: 2 + defaultReferences: + - tiltShiftShader: {fileID: 4800000, guid: bf34d2a25450349699e8ae6456fa7ca9, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Tonemapping.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Tonemapping.cs new file mode 100644 index 0000000..665ee98 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Tonemapping.cs @@ -0,0 +1,274 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent(typeof (Camera))] + [AddComponentMenu("Image Effects/Color Adjustments/Tonemapping")] + public class Tonemapping : PostEffectsBase + { + public enum TonemapperType + { + SimpleReinhard, + UserCurve, + Hable, + Photographic, + OptimizedHejiDawson, + AdaptiveReinhard, + AdaptiveReinhardAutoWhite, + }; + + public enum AdaptiveTexSize + { + Square16 = 16, + Square32 = 32, + Square64 = 64, + Square128 = 128, + Square256 = 256, + Square512 = 512, + Square1024 = 1024, + }; + + public TonemapperType type = TonemapperType.Photographic; + public AdaptiveTexSize adaptiveTextureSize = AdaptiveTexSize.Square256; + + // CURVE parameter + public AnimationCurve remapCurve; + private Texture2D curveTex = null; + + // UNCHARTED parameter + public float exposureAdjustment = 1.5f; + + // REINHARD parameter + public float middleGrey = 0.4f; + public float white = 2.0f; + public float adaptionSpeed = 1.5f; + + // usual & internal stuff + public Shader tonemapper = null; + public bool validRenderTextureFormat = true; + private Material tonemapMaterial = null; + private RenderTexture rt = null; + private RenderTextureFormat rtFormat = RenderTextureFormat.ARGBHalf; + + + public override bool CheckResources() + { + CheckSupport(false, true); + + tonemapMaterial = CheckShaderAndCreateMaterial(tonemapper, tonemapMaterial); + if (!curveTex && type == TonemapperType.UserCurve) + { + curveTex = new Texture2D(256, 1, TextureFormat.ARGB32, false, true); + curveTex.filterMode = FilterMode.Bilinear; + curveTex.wrapMode = TextureWrapMode.Clamp; + curveTex.hideFlags = HideFlags.DontSave; + } + + if (!isSupported) + ReportAutoDisable(); + return isSupported; + } + + + public float UpdateCurve() + { + float range = 1.0f; + if (remapCurve.keys.Length < 1) + remapCurve = new AnimationCurve(new Keyframe(0, 0), new Keyframe(2, 1)); + if (remapCurve != null) + { + if (remapCurve.length > 0) + range = remapCurve[remapCurve.length - 1].time; + for (float i = 0.0f; i <= 1.0f; i += 1.0f/255.0f) + { + float c = remapCurve.Evaluate(i*1.0f*range); + curveTex.SetPixel((int) Mathf.Floor(i*255.0f), 0, new Color(c, c, c)); + } + curveTex.Apply(); + } + return 1.0f/range; + } + + + private void OnDisable() + { + if (rt) + { + DestroyImmediate(rt); + rt = null; + } + if (tonemapMaterial) + { + DestroyImmediate(tonemapMaterial); + tonemapMaterial = null; + } + if (curveTex) + { + DestroyImmediate(curveTex); + curveTex = null; + } + } + + + private bool CreateInternalRenderTexture() + { + if (rt) + { + return false; + } + rtFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RGHalf) ? RenderTextureFormat.RGHalf : RenderTextureFormat.ARGBHalf; + rt = new RenderTexture(1, 1, 0, rtFormat); + rt.hideFlags = HideFlags.DontSave; + return true; + } + + + // attribute indicates that the image filter chain will continue in LDR + [ImageEffectTransformsToLDR] + private void OnRenderImage(RenderTexture source, RenderTexture destination) + { + if (CheckResources() == false) + { + Graphics.Blit(source, destination); + return; + } + +#if UNITY_EDITOR + validRenderTextureFormat = true; + if (source.format != RenderTextureFormat.ARGBHalf) + { + validRenderTextureFormat = false; + } +#endif + + // clamp some values to not go out of a valid range + + exposureAdjustment = exposureAdjustment < 0.001f ? 0.001f : exposureAdjustment; + + // SimpleReinhard tonemappers (local, non adaptive) + + if (type == TonemapperType.UserCurve) + { + float rangeScale = UpdateCurve(); + tonemapMaterial.SetFloat("_RangeScale", rangeScale); + tonemapMaterial.SetTexture("_Curve", curveTex); + Graphics.Blit(source, destination, tonemapMaterial, 4); + return; + } + + if (type == TonemapperType.SimpleReinhard) + { + tonemapMaterial.SetFloat("_ExposureAdjustment", exposureAdjustment); + Graphics.Blit(source, destination, tonemapMaterial, 6); + return; + } + + if (type == TonemapperType.Hable) + { + tonemapMaterial.SetFloat("_ExposureAdjustment", exposureAdjustment); + Graphics.Blit(source, destination, tonemapMaterial, 5); + return; + } + + if (type == TonemapperType.Photographic) + { + tonemapMaterial.SetFloat("_ExposureAdjustment", exposureAdjustment); + Graphics.Blit(source, destination, tonemapMaterial, 8); + return; + } + + if (type == TonemapperType.OptimizedHejiDawson) + { + tonemapMaterial.SetFloat("_ExposureAdjustment", 0.5f*exposureAdjustment); + Graphics.Blit(source, destination, tonemapMaterial, 7); + return; + } + + // still here? + // => adaptive tone mapping: + // builds an average log luminance, tonemaps according to + // middle grey and white values (user controlled) + + // AdaptiveReinhardAutoWhite will calculate white value automagically + + bool freshlyBrewedInternalRt = CreateInternalRenderTexture(); // this retrieves rtFormat, so should happen before rt allocations + + RenderTexture rtSquared = RenderTexture.GetTemporary((int) adaptiveTextureSize, (int) adaptiveTextureSize, 0, rtFormat); + Graphics.Blit(source, rtSquared); + + int downsample = (int) Mathf.Log(rtSquared.width*1.0f, 2); + + int div = 2; + var rts = new RenderTexture[downsample]; + for (int i = 0; i < downsample; i++) + { + rts[i] = RenderTexture.GetTemporary(rtSquared.width/div, rtSquared.width/div, 0, rtFormat); + div *= 2; + } + + // downsample pyramid + + var lumRt = rts[downsample - 1]; + Graphics.Blit(rtSquared, rts[0], tonemapMaterial, 1); + if (type == TonemapperType.AdaptiveReinhardAutoWhite) + { + for (int i = 0; i < downsample - 1; i++) + { + Graphics.Blit(rts[i], rts[i + 1], tonemapMaterial, 9); + lumRt = rts[i + 1]; + } + } + else if (type == TonemapperType.AdaptiveReinhard) + { + for (int i = 0; i < downsample - 1; i++) + { + Graphics.Blit(rts[i], rts[i + 1]); + lumRt = rts[i + 1]; + } + } + + // we have the needed values, let's apply adaptive tonemapping + + adaptionSpeed = adaptionSpeed < 0.001f ? 0.001f : adaptionSpeed; + tonemapMaterial.SetFloat("_AdaptionSpeed", adaptionSpeed); + + rt.MarkRestoreExpected(); // keeping luminance values between frames, RT restore expected + +#if UNITY_EDITOR + if (Application.isPlaying && !freshlyBrewedInternalRt) + Graphics.Blit(lumRt, rt, tonemapMaterial, 2); + else + Graphics.Blit(lumRt, rt, tonemapMaterial, 3); +#else + Graphics.Blit (lumRt, rt, tonemapMaterial, freshlyBrewedInternalRt ? 3 : 2); +#endif + + middleGrey = middleGrey < 0.001f ? 0.001f : middleGrey; + tonemapMaterial.SetVector("_HdrParams", new Vector4(middleGrey, middleGrey, middleGrey, white*white)); + tonemapMaterial.SetTexture("_SmallTex", rt); + if (type == TonemapperType.AdaptiveReinhard) + { + Graphics.Blit(source, destination, tonemapMaterial, 0); + } + else if (type == TonemapperType.AdaptiveReinhardAutoWhite) + { + Graphics.Blit(source, destination, tonemapMaterial, 10); + } + else + { + Debug.LogError("No valid adaptive tonemapper type found!"); + Graphics.Blit(source, destination); // at least we get the TransformToLDR effect + } + + // cleanup for adaptive + + for (int i = 0; i < downsample; i++) + { + RenderTexture.ReleaseTemporary(rts[i]); + } + RenderTexture.ReleaseTemporary(rtSquared); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Tonemapping.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Tonemapping.cs.meta new file mode 100644 index 0000000..4443b42 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Tonemapping.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e50e925fb93c78246bf995d9dc3a2330 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - tonemapper: {fileID: 4800000, guid: 003377fc2620a44939dadde6fe3f8190, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Triangles.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Triangles.cs new file mode 100644 index 0000000..516bded --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Triangles.cs @@ -0,0 +1,112 @@ +using System; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace UnityStandardAssets.ImageEffects +{ + class Triangles + { + private static Mesh[] meshes; + private static int currentTris = 0; + + static bool HasMeshes() + { + if (meshes == null) + return false; + for (int i = 0; i < meshes.Length; i++) + if (null == meshes[i]) + return false; + + return true; + } + + static void Cleanup() + { + if (meshes == null) + return; + + for (int i = 0; i < meshes.Length; i++) + { + if (null != meshes[i]) + { + Object.DestroyImmediate(meshes[i]); + meshes[i] = null; + } + } + meshes = null; + } + + static Mesh[] GetMeshes(int totalWidth, int totalHeight) + { + if (HasMeshes() && (currentTris == (totalWidth * totalHeight))) + { + return meshes; + } + + int maxTris = 65000 / 3; + int totalTris = totalWidth * totalHeight; + currentTris = totalTris; + + int meshCount = Mathf.CeilToInt((1.0f * totalTris) / (1.0f * maxTris)); + + meshes = new Mesh[meshCount]; + + int i = 0; + int index = 0; + for (i = 0; i < totalTris; i += maxTris) + { + int tris = Mathf.FloorToInt(Mathf.Clamp((totalTris - i), 0, maxTris)); + + meshes[index] = GetMesh(tris, i, totalWidth, totalHeight); + index++; + } + + return meshes; + } + + static Mesh GetMesh(int triCount, int triOffset, int totalWidth, int totalHeight) + { + var mesh = new Mesh(); + mesh.hideFlags = HideFlags.DontSave; + + var verts = new Vector3[triCount * 3]; + var uvs = new Vector2[triCount * 3]; + var uvs2 = new Vector2[triCount * 3]; + var tris = new int[triCount * 3]; + + for (int i = 0; i < triCount; i++) + { + int i3 = i * 3; + int vertexWithOffset = triOffset + i; + + float x = Mathf.Floor(vertexWithOffset % totalWidth) / totalWidth; + float y = Mathf.Floor(vertexWithOffset / totalWidth) / totalHeight; + + Vector3 position = new Vector3(x * 2 - 1, y * 2 - 1, 1.0f); + + verts[i3 + 0] = position; + verts[i3 + 1] = position; + verts[i3 + 2] = position; + + uvs[i3 + 0] = new Vector2(0.0f, 0.0f); + uvs[i3 + 1] = new Vector2(1.0f, 0.0f); + uvs[i3 + 2] = new Vector2(0.0f, 1.0f); + + uvs2[i3 + 0] = new Vector2(x, y); + uvs2[i3 + 1] = new Vector2(x, y); + uvs2[i3 + 2] = new Vector2(x, y); + + tris[i3 + 0] = i3 + 0; + tris[i3 + 1] = i3 + 1; + tris[i3 + 2] = i3 + 2; + } + + mesh.vertices = verts; + mesh.triangles = tris; + mesh.uv = uvs; + mesh.uv2 = uvs2; + + return mesh; + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Triangles.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Triangles.cs.meta new file mode 100644 index 0000000..2ea56f0 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Triangles.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 18b91636de2ba3445913e4cf38528dc8 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Twirl.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Twirl.cs new file mode 100644 index 0000000..a7b57e9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Twirl.cs @@ -0,0 +1,22 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Displacement/Twirl")] + public class Twirl : ImageEffectBase + { + public Vector2 radius = new Vector2(0.3F,0.3F); + [Range(0.0f,360.0f)] + public float angle = 50; + public Vector2 center = new Vector2 (0.5F, 0.5F); + + + // Called by camera to apply image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + ImageEffects.RenderDistortion (material, source, destination, angle, center, radius); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Twirl.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Twirl.cs.meta new file mode 100644 index 0000000..4b0b6c8 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Twirl.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bdda781cad112c75d0008dfa8d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: 641b781cad112c75d0008dfa8d76c639, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/VignetteAndChromaticAberration.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/VignetteAndChromaticAberration.cs new file mode 100644 index 0000000..e34321b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/VignetteAndChromaticAberration.cs @@ -0,0 +1,114 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [RequireComponent (typeof(Camera))] + [AddComponentMenu ("Image Effects/Camera/Vignette and Chromatic Aberration")] + public class VignetteAndChromaticAberration : PostEffectsBase + { + public enum AberrationMode + { + Simple = 0, + Advanced = 1, + } + + + public AberrationMode mode = AberrationMode.Simple; + public float intensity = 0.036f; // intensity == 0 disables pre pass (optimization) + public float chromaticAberration = 0.2f; + public float axialAberration = 0.5f; + public float blur = 0.0f; // blur == 0 disables blur pass (optimization) + public float blurSpread = 0.75f; + public float luminanceDependency = 0.25f; + public float blurDistance = 2.5f; + public Shader vignetteShader; + public Shader separableBlurShader; + public Shader chromAberrationShader; + + + private Material m_VignetteMaterial; + private Material m_SeparableBlurMaterial; + private Material m_ChromAberrationMaterial; + + + public override bool CheckResources () + { + CheckSupport (false); + + m_VignetteMaterial = CheckShaderAndCreateMaterial (vignetteShader, m_VignetteMaterial); + m_SeparableBlurMaterial = CheckShaderAndCreateMaterial (separableBlurShader, m_SeparableBlurMaterial); + m_ChromAberrationMaterial = CheckShaderAndCreateMaterial (chromAberrationShader, m_ChromAberrationMaterial); + + if (!isSupported) + ReportAutoDisable (); + return isSupported; + } + + + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + if ( CheckResources () == false) + { + Graphics.Blit (source, destination); + return; + } + + int rtW = source.width; + int rtH = source.height; + + bool doPrepass = (Mathf.Abs(blur)>0.0f || Mathf.Abs(intensity)>0.0f); + + float widthOverHeight = (1.0f * rtW) / (1.0f * rtH); + const float oneOverBaseSize = 1.0f / 512.0f; + + RenderTexture color = null; + RenderTexture color2A = null; + + if (doPrepass) + { + color = RenderTexture.GetTemporary (rtW, rtH, 0, source.format); + + // Blur corners + if (Mathf.Abs (blur)>0.0f) + { + color2A = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format); + + Graphics.Blit (source, color2A, m_ChromAberrationMaterial, 0); + + for(int i = 0; i < 2; i++) + { // maybe make iteration count tweakable + m_SeparableBlurMaterial.SetVector ("offsets",new Vector4 (0.0f, blurSpread * oneOverBaseSize, 0.0f, 0.0f)); + RenderTexture color2B = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format); + Graphics.Blit (color2A, color2B, m_SeparableBlurMaterial); + RenderTexture.ReleaseTemporary (color2A); + + m_SeparableBlurMaterial.SetVector ("offsets",new Vector4 (blurSpread * oneOverBaseSize / widthOverHeight, 0.0f, 0.0f, 0.0f)); + color2A = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format); + Graphics.Blit (color2B, color2A, m_SeparableBlurMaterial); + RenderTexture.ReleaseTemporary (color2B); + } + } + + m_VignetteMaterial.SetFloat("_Intensity", (1.0f / (1.0f - intensity) - 1.0f)); // intensity for vignette + m_VignetteMaterial.SetFloat("_Blur", (1.0f / (1.0f - blur)) - 1.0f); // blur intensity + m_VignetteMaterial.SetTexture ("_VignetteTex", color2A); // blurred texture + + Graphics.Blit (source, color, m_VignetteMaterial, 0); // prepass blit: darken & blur corners + } + + m_ChromAberrationMaterial.SetFloat ("_ChromaticAberration", chromaticAberration); + m_ChromAberrationMaterial.SetFloat ("_AxialAberration", axialAberration); + m_ChromAberrationMaterial.SetVector ("_BlurDistance", new Vector2 (-blurDistance, blurDistance)); + m_ChromAberrationMaterial.SetFloat ("_Luminance", 1.0f/Mathf.Max(Mathf.Epsilon, luminanceDependency)); + + if (doPrepass) color.wrapMode = TextureWrapMode.Clamp; + else source.wrapMode = TextureWrapMode.Clamp; + Graphics.Blit (doPrepass ? color : source, destination, m_ChromAberrationMaterial, mode == AberrationMode.Advanced ? 2 : 1); + + RenderTexture.ReleaseTemporary (color); + RenderTexture.ReleaseTemporary (color2A); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/VignetteAndChromaticAberration.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/VignetteAndChromaticAberration.cs.meta new file mode 100644 index 0000000..6b6a813 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/VignetteAndChromaticAberration.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: dd6d4281e5d7cd44d8c6e38bc2c1b8d8 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - vignetteShader: {fileID: 4800000, guid: 627943dc7a9a74286b70a4f694a0acd5, type: 3} + - separableBlurShader: {fileID: 4800000, guid: e97c14fbb5ea04c3a902cc533d7fc5d1, + type: 3} + - chromAberrationShader: {fileID: 4800000, guid: 2b4f29398d9484ccfa9fd220449f5eee, + type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Vortex.cs b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Vortex.cs new file mode 100644 index 0000000..8a2d866 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Vortex.cs @@ -0,0 +1,20 @@ +using System; +using UnityEngine; + +namespace UnityStandardAssets.ImageEffects +{ + [ExecuteInEditMode] + [AddComponentMenu("Image Effects/Displacement/Vortex")] + public class Vortex : ImageEffectBase + { + public Vector2 radius = new Vector2(0.4F,0.4F); + public float angle = 50; + public Vector2 center = new Vector2(0.5F, 0.5F); + + // Called by camera to apply image effect + void OnRenderImage (RenderTexture source, RenderTexture destination) + { + ImageEffects.RenderDistortion (material, source, destination, angle, center, radius); + } + } +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Scripts/Vortex.cs.meta b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Vortex.cs.meta new file mode 100644 index 0000000..f6b8089 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Scripts/Vortex.cs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a94b781cad112c75d0008dfa8d76c639 +MonoImporter: + serializedVersion: 2 + defaultReferences: + - shader: {fileID: 4800000, guid: 708b781cad112c75d0008dfa8d76c639, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders.meta new file mode 100644 index 0000000..b68c7f9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: b2145489f7c704db8acb14a52bddeee9 +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlendModesOverlay.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlendModesOverlay.shader new file mode 100644 index 0000000..fa2c762 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlendModesOverlay.shader @@ -0,0 +1,136 @@ +Shader "Hidden/BlendModesOverlay" { + Properties { + _MainTex ("Screen Blended", 2D) = "" {} + _Overlay ("Color", 2D) = "grey" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv[2] : TEXCOORD0; + }; + + sampler2D _Overlay; + half4 _Overlay_ST; + + sampler2D _MainTex; + half4 _MainTex_ST; + + half _Intensity; + half4 _MainTex_TexelSize; + half4 _UV_Transform = half4(1, 0, 0, 1); + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv[0] = UnityStereoScreenSpaceUVAdjust(float2( + dot(v.texcoord.xy, _UV_Transform.xy), + dot(v.texcoord.xy, _UV_Transform.zw) + ), _Overlay_ST); + + #if UNITY_UV_STARTS_AT_TOP + if(_MainTex_TexelSize.y<0.0) + o.uv[0].y = 1.0-o.uv[0].y; + #endif + + o.uv[1] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + return o; + } + + half4 fragAddSub (v2f i) : SV_Target { + half4 toAdd = tex2D(_Overlay, i.uv[0]) * _Intensity; + return tex2D(_MainTex, i.uv[1]) + toAdd; + } + + half4 fragMultiply (v2f i) : SV_Target { + half4 toBlend = tex2D(_Overlay, i.uv[0]) * _Intensity; + return tex2D(_MainTex, i.uv[1]) * toBlend; + } + + half4 fragScreen (v2f i) : SV_Target { + half4 toBlend = (tex2D(_Overlay, i.uv[0]) * _Intensity); + return 1-(1-toBlend)*(1-(tex2D(_MainTex, i.uv[1]))); + } + + half4 fragOverlay (v2f i) : SV_Target { + half4 m = (tex2D(_Overlay, i.uv[0]));// * 255.0; + half4 color = (tex2D(_MainTex, i.uv[1]));//* 255.0; + + // overlay blend mode + //color.rgb = (color.rgb/255.0) * (color.rgb + ((2*m.rgb)/( 255.0 )) * (255.0-color.rgb)); + //color.rgb /= 255.0; + + /* +if (Target > ½) R = 1 - (1-2x(Target-½)) x (1-Blend) +if (Target <= ½) R = (2xTarget) x Blend + */ + + float3 check = step(half3(0.5,0.5,0.5), color.rgb); + float3 result = 0; + + result = check * (half3(1,1,1) - ( (half3(1,1,1) - 2*(color.rgb-0.5)) * (1-m.rgb))); + result += (1-check) * (2*color.rgb) * m.rgb; + + return half4(lerp(color.rgb, result.rgb, (_Intensity)), color.a); + } + + half4 fragAlphaBlend (v2f i) : SV_Target { + half4 toAdd = tex2D(_Overlay, i.uv[0]) ; + return lerp(tex2D(_MainTex, i.uv[1]), toAdd, toAdd.a * _Intensity); + } + + + ENDCG + +Subshader { + ZTest Always Cull Off ZWrite Off + ColorMask RGB + + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAddSub + ENDCG + } + + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragScreen + ENDCG + } + + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragMultiply + ENDCG + } + + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragOverlay + ENDCG + } + + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAlphaBlend + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlendModesOverlay.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlendModesOverlay.shader.meta new file mode 100644 index 0000000..ebf8628 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlendModesOverlay.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 8c81db0e527d24acc9bcec04e87781bd +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlurEffectConeTaps.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlurEffectConeTaps.shader new file mode 100644 index 0000000..0ab0825 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlurEffectConeTaps.shader @@ -0,0 +1,52 @@ +Shader "Hidden/BlurEffectConeTap" { + Properties { _MainTex ("", any) = "" {} } + CGINCLUDE + #include "UnityCG.cginc" + struct v2f { + float4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half2 taps[4] : TEXCOORD1; + }; + sampler2D _MainTex; + half4 _MainTex_TexelSize; + half4 _MainTex_ST; + half4 _BlurOffsets; + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = v.texcoord - _BlurOffsets.xy * _MainTex_TexelSize.xy; // hack, see BlurEffect.cs for the reason for this. let's make a new blur effect soon +#ifdef UNITY_SINGLE_PASS_STEREO + // we need to keep texel size correct after the uv adjustment. + o.taps[0] = UnityStereoScreenSpaceUVAdjust(o.uv + _MainTex_TexelSize * _BlurOffsets.xy * (1.0f / _MainTex_ST.xy), _MainTex_ST); + o.taps[1] = UnityStereoScreenSpaceUVAdjust(o.uv - _MainTex_TexelSize * _BlurOffsets.xy * (1.0f / _MainTex_ST.xy), _MainTex_ST); + o.taps[2] = UnityStereoScreenSpaceUVAdjust(o.uv + _MainTex_TexelSize * _BlurOffsets.xy * half2(1, -1) * (1.0f / _MainTex_ST.xy), _MainTex_ST); + o.taps[3] = UnityStereoScreenSpaceUVAdjust(o.uv - _MainTex_TexelSize * _BlurOffsets.xy * half2(1, -1) * (1.0f / _MainTex_ST.xy), _MainTex_ST); +#else + o.taps[0] = o.uv + _MainTex_TexelSize * _BlurOffsets.xy; + o.taps[1] = o.uv - _MainTex_TexelSize * _BlurOffsets.xy; + o.taps[2] = o.uv + _MainTex_TexelSize * _BlurOffsets.xy * half2(1,-1); + o.taps[3] = o.uv - _MainTex_TexelSize * _BlurOffsets.xy * half2(1,-1); +#endif + return o; + } + half4 frag(v2f i) : SV_Target { + half4 color = tex2D(_MainTex, i.taps[0]); + color += tex2D(_MainTex, i.taps[1]); + color += tex2D(_MainTex, i.taps[2]); + color += tex2D(_MainTex, i.taps[3]); + return color * 0.25; + } + ENDCG + SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } + } + Fallback off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlurEffectConeTaps.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlurEffectConeTaps.shader.meta new file mode 100644 index 0000000..5d9fd5e --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/BlurEffectConeTaps.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 57e6deea7c2924e22a5138e2b70bb4dc +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/CameraMotionBlur.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/CameraMotionBlur.shader new file mode 100644 index 0000000..e611ef5 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/CameraMotionBlur.shader @@ -0,0 +1,532 @@ + /* + CAMERA MOTION BLUR IMAGE EFFECTS + + Reconstruction Filter: + Based on "Plausible Motion Blur" + http://graphics.cs.williams.edu/papers/MotionBlurI3D12/ + + CameraMotion: + Based on Alex Vlacho's technique in + http://www.valvesoftware.com/publications/2008/GDC2008_PostProcessingInTheOrangeBox.pdf + + SimpleBlur: + Straightforward sampling along velocities + + ScatterFromGather: + Combines Reconstruction with depth of field type defocus + */ + + Shader "Hidden/CameraMotionBlur" { + Properties { + _MainTex ("-", 2D) = "" {} + _NoiseTex ("-", 2D) = "grey" {} + _VelTex ("-", 2D) = "black" {} + _NeighbourMaxTex ("-", 2D) = "black" {} + _TileTexDebug ("-", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + // 's' in paper (# of samples for reconstruction) + #define NUM_SAMPLES (11) + // # samples for valve style blur + #define MOTION_SAMPLES (16) + // 'k' in paper + float _MaxRadiusOrKInPaper; + + static const int SmallDiscKernelSamples = 12; + static const float2 SmallDiscKernel[SmallDiscKernelSamples] = + { + float2(-0.326212,-0.40581), + float2(-0.840144,-0.07358), + float2(-0.695914,0.457137), + float2(-0.203345,0.620716), + float2(0.96234,-0.194983), + float2(0.473434,-0.480026), + float2(0.519456,0.767022), + float2(0.185461,-0.893124), + float2(0.507431,0.064425), + float2(0.89642,0.412458), + float2(-0.32194,-0.932615), + float2(-0.791559,-0.59771) + }; + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + sampler2D_float _CameraDepthTexture; + sampler2D _VelTex; + sampler2D _NeighbourMaxTex; + sampler2D _NoiseTex; + sampler2D _TileTexDebug; + + float4 _MainTex_TexelSize; + float4 _CameraDepthTexture_TexelSize; + float4 _VelTex_TexelSize; + + half4 _MainTex_ST; + half4 _CameraDepthTexture_ST; + half4 _VelTex_ST; + + float4x4 _InvViewProj; // inverse view-projection matrix + float4x4 _PrevViewProj; // previous view-projection matrix + float4x4 _ToPrevViewProjCombined; // combined + float4x4 _StereoToPrevViewProjCombined0; // combined stereo versions. + float4x4 _StereoToPrevViewProjCombined1; // combined stereo versions. + + float _Jitter; + + float _VelocityScale; + float _DisplayVelocityScale; + + float _MaxVelocity; + float _MinVelocity; + + float4 _BlurDirectionPacked; + + float _SoftZDistance; + + v2f vert(appdata_img v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + return o; + } + + float4x4 GetPrevViewProjCombined() + { +#ifdef UNITY_SINGLE_PASS_STEREO + return unity_StereoEyeIndex == 0 ? _StereoToPrevViewProjCombined0 : _StereoToPrevViewProjCombined1; +#else + return _ToPrevViewProjCombined; +#endif + } + + float4 CameraVelocity(v2f i) : SV_Target + { + float2 depth_uv = i.uv; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + depth_uv.y = 1 - depth_uv.y; + #endif + + // read depth + float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, depth_uv); + + // calculate position from pixel from depth + float3 clipPos = float3(i.uv.x*2.0-1.0, (i.uv.y)*2.0-1.0, d); + + // only 1 matrix mul: + float4 prevClipPos = mul(GetPrevViewProjCombined(), float4(clipPos, 1.0)); + prevClipPos.xyz /= prevClipPos.w; + + /* + float4 ws = mul(_InvViewProj, float4(clipPos, 1.0)); + ws /= ws.w; + prevClipPos = mul(_PrevViewProj,ws); + prevClipPos.xyz /= prevClipPos.w; + */ + + /* + float2 vel = _VelocityScale *(clipPos.xy - prevClipPos.xy) / 2.f; + // clamp to maximum velocity (in pixels) + float maxVel = length(_MainTex_TexelSize.xy*_MaxVelocity); + if (length(vel) > maxVel) { + vel = normalize(vel) * maxVel; + } + return float4(vel, 0.0, 0.0); + */ + + float2 vel = _MainTex_TexelSize.zw * _VelocityScale * (clipPos.xy - prevClipPos.xy) / 2.f; + float vellen = length(vel); + float maxVel = _MaxVelocity; + float2 velOut = vel * max(0.5, min(vellen, maxVel)) / (vellen + 1e-2f); + velOut *= _MainTex_TexelSize.xy; + return float4(velOut, 0.0, 0.0); + + } + + // vector with largest magnitude + float2 vmax(float2 a, float2 b) + { + float ma = dot(a, a); + float mb = dot(b, b); + return (ma > mb) ? a : b; + } + + // find dominant velocity for each tile + float4 TileMax(v2f i) : SV_Target + { + float2 uvCorner = i.uv - _MainTex_TexelSize.xy * (_MaxRadiusOrKInPaper * 0.5); + float2 maxvel = float2(0,0); + float4 baseUv = float4(uvCorner,0,0); + float4 uvScale = float4(_MainTex_TexelSize.xy, 0, 0); + + for(int l=0; l<(int)_MaxRadiusOrKInPaper; l++) + { + for(int k=0; k<(int)_MaxRadiusOrKInPaper; k++) + { + maxvel = vmax(maxvel, tex2Dlod(_MainTex, baseUv + float4(l,k,0,0) * uvScale).xy); + } + } + return float4(maxvel, 0, 1); + } + + // find maximum velocity in any adjacent tile + float4 NeighbourMax(v2f i) : SV_Target + { + float2 x_ = i.uv; + + // to fetch all neighbours, we need 3x3 point filtered samples + + float2 nx = tex2D(_MainTex, x_+float2(1.0, 1.0)*_MainTex_TexelSize.xy).xy; + nx = vmax(nx, tex2D(_MainTex, x_+float2(1.0, 0.0)*_MainTex_TexelSize.xy).xy); + nx = vmax(nx, tex2D(_MainTex, x_+float2(1.0,-1.0)*_MainTex_TexelSize.xy).xy); + nx = vmax(nx, tex2D(_MainTex, x_+float2(0.0, 1.0)*_MainTex_TexelSize.xy).xy); + nx = vmax(nx, tex2D(_MainTex, x_+float2(0.0, 0.0)*_MainTex_TexelSize.xy).xy); + nx = vmax(nx, tex2D(_MainTex, x_+float2(0.0,-1.0)*_MainTex_TexelSize.xy).xy); + nx = vmax(nx, tex2D(_MainTex, x_+float2(-1.0, 1.0)*_MainTex_TexelSize.xy).xy); + nx = vmax(nx, tex2D(_MainTex, x_+float2(-1.0, 0.0)*_MainTex_TexelSize.xy).xy); + nx = vmax(nx, tex2D(_MainTex, x_+float2(-1.0,-1.0)*_MainTex_TexelSize.xy).xy); + + return float4(nx, 0, 0); + } + + float4 Debug(v2f i) : SV_Target + { + return saturate( float4(tex2D(_MainTex, i.uv).x,abs(tex2D(_MainTex, i.uv).y),-tex2D(_MainTex, i.uv).xy) * _DisplayVelocityScale); + } + + // classification filters + float cone(float2 px, float2 py, float2 v) + { + return clamp(1.0 - (length(px - py) / length(v)), 0.0, 1.0); + } + + float cylinder(float2 x, float2 y, float2 v) + { + float lv = length(v); + return 1.0 - smoothstep(0.95*lv, 1.05*lv, length(x - y)); + } + + // is zb closer than za? + float softDepthCompare(float za, float zb) + { + return clamp(1.0 - (za - zb) / _SoftZDistance, 0.0, 1.0); + } + + float4 SimpleBlur (v2f i) : SV_Target + { + float2 x = i.uv; + float2 xf = x; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + xf.y = 1 - xf.y; + #endif + + float2 vx = tex2D(_VelTex, xf).xy; // vel at x + + float4 sum = float4(0, 0, 0, 0); + for(int l=0; l _MaxVelocity) { + blurDir *= (_MaxVelocity / velMag); + velMag = _MaxVelocity; + } + + float4 centerTap = tex2D(_MainTex, x); + float4 sum = centerTap; + + blurDir *= smoothstep(_MinVelocity * 0.25f, _MinVelocity * 2.5, velMag); + + blurDir *= _MainTex_TexelSize.xy; + blurDir /= MOTION_SAMPLES; + + for(int i=0; i mb) ? a : b; + } + + // find dominant velocity in each tile + float4 TileMax(v2f i) : SV_Target + { + float2 tilemax = float2(0.0, 0.0); + float2 srcPos = i.uv - _MainTex_TexelSize.xy * _MaxRadiusOrKInPaper * 0.5; + + for(int y=0; y<(int)_MaxRadiusOrKInPaper; y++) { + for(int x=0; x<(int)_MaxRadiusOrKInPaper; x++) { + float2 v = tex2D(_MainTex, srcPos + float2(x,y) * _MainTex_TexelSize.xy).xy; + tilemax = vmax(tilemax, v); + } + } + return float4(tilemax, 0, 1); + } + + // find maximum velocity in any adjacent tile + float4 NeighbourMax(v2f i) : SV_Target + { + float2 maxvel = float2(0.0, 0.0); + for(int y=-1; y<=1; y++) { + for(int x=-1; x<=1; x++) { + float2 v = tex2D(_MainTex, i.uv + float2(x,y) * _MainTex_TexelSize.xy).xy; + maxvel = vmax(maxvel, v); + } + } + return float4(maxvel, 0, 1); + } + + float cone(float2 px, float2 py, float2 v) + { + return clamp(1.0 - (length(px - py) / length(v)), 0.0, 1.0); + } + + float cylinder(float2 x, float2 y, float2 v) + { + float lv = length(v); + return 1.0 - smoothstep(0.95*lv, 1.05*lv, length(x - y)); + } + + float softDepthCompare(float za, float zb) + { + return clamp(1.0 - (za - zb) / _SoftZDistance, 0.0, 1.0); + } + + float4 ReconstructFilterBlur(v2f i) : SV_Target + { + float2 x = i.uv; + float2 xf = x; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + xf.y = 1-xf.y; + #endif + + float2 x2 = xf; + + float2 vn = tex2D(_NeighbourMaxTex, x2).xy; // largest velocity in neighbourhood + float4 cx = tex2D(_MainTex, x); // color at x + + float zx = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, x); + zx = -Linear01Depth(zx); // depth at x + float2 vx = tex2D(_VelTex, xf).xy; // vel at x + + // random offset [-0.5, 0.5] + float j = (tex2D(_NoiseTex, i.uv * 11.0f ).r*2-1) * _Jitter; + + // sample current pixel + float weight = 1.0; + float4 sum = cx * weight; + + int centerSample = (int)(NUM_SAMPLES-1) / 2; + + // in DX11 county we take more samples and interleave with sampling along vx direction to break up "patternized" look + + for(int l=0; l0.99999) + return half4(1,1,1,1); + else + return EncodeFloatRGBA(d); + } + + ENDCG + +Subshader { + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/ConvertDepth.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ConvertDepth.shader.meta new file mode 100644 index 0000000..8b325fa --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ConvertDepth.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 14768d3865b1342e3a861fbe19ba2db2 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/CreaseApply.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/CreaseApply.shader new file mode 100644 index 0000000..fa1644e --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/CreaseApply.shader @@ -0,0 +1,63 @@ + + +Shader "Hidden/CreaseApply" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _HrDepthTex ("Base (RGB)", 2D) = "white" {} + _LrDepthTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" + +sampler2D _MainTex; +sampler2D _HrDepthTex; +sampler2D _LrDepthTex; + +uniform float4 _MainTex_TexelSize; +half4 _MainTex_ST; +half4 _HrDepthTex_ST; +half4 _LrDepthTex_ST; +uniform float intensity; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +v2f vert( appdata_img v ) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = v.texcoord.xy; + return o; +} + +half4 frag (v2f i) : SV_Target +{ + float4 hrDepth = tex2D(_HrDepthTex, UnityStereoScreenSpaceUVAdjust(i.uv, _HrDepthTex_ST)); + float4 lrDepth = tex2D(_LrDepthTex, UnityStereoScreenSpaceUVAdjust(i.uv, _LrDepthTex_ST)); + + hrDepth.a = DecodeFloatRGBA(hrDepth); + lrDepth.a = DecodeFloatRGBA(lrDepth); + + float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + + return color * (1.0-abs(hrDepth.a-lrDepth.a)*intensity); +} + +ENDCG + + + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/CreaseApply.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/CreaseApply.shader.meta new file mode 100644 index 0000000..648c60a --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/CreaseApply.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: b59984d82af624bd3b0c777f038276f2 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/EdgeDetectNormals.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/EdgeDetectNormals.shader new file mode 100644 index 0000000..4ba9e2a --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/EdgeDetectNormals.shader @@ -0,0 +1,329 @@ + +Shader "Hidden/EdgeDetect" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv[5] : TEXCOORD0; + }; + + struct v2fd { + float4 pos : SV_POSITION; + float2 uv[2] : TEXCOORD0; + }; + + sampler2D _MainTex; + uniform float4 _MainTex_TexelSize; + half4 _MainTex_ST; + + sampler2D _CameraDepthNormalsTexture; + half4 _CameraDepthNormalsTexture_ST; + + sampler2D_float _CameraDepthTexture; + half4 _CameraDepthTexture_ST; + + uniform half4 _Sensitivity; + uniform half4 _BgColor; + uniform half _BgFade; + uniform half _SampleDistance; + uniform float _Exponent; + + uniform float _Threshold; + + struct v2flum { + float4 pos : SV_POSITION; + float2 uv[3] : TEXCOORD0; + }; + + v2flum vertLum (appdata_img v) + { + v2flum o; + o.pos = UnityObjectToClipPos(v.vertex); + float2 uv = MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord ); + o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); + o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); + o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); + return o; + } + + + fixed4 fragLum (v2flum i) : SV_Target + { + fixed4 original = tex2D(_MainTex, i.uv[0]); + + // a very simple cross gradient filter + + half3 p1 = original.rgb; + half3 p2 = tex2D(_MainTex, i.uv[1]).rgb; + half3 p3 = tex2D(_MainTex, i.uv[2]).rgb; + + half3 diff = p1 * 2 - p2 - p3; + half len = dot(diff, diff); + len = step(len, _Threshold); + //if(len >= _Threshold) + // original.rgb = 0; + + return len * lerp(original, _BgColor, _BgFade); + } + + inline half CheckSame (half2 centerNormal, float centerDepth, half4 theSample) + { + // difference in normals + // do not bother decoding normals - there's no need here + half2 diff = abs(centerNormal - theSample.xy) * _Sensitivity.y; + int isSameNormal = (diff.x + diff.y) * _Sensitivity.y < 0.1; + // difference in depth + float sampleDepth = DecodeFloatRG (theSample.zw); + float zdiff = abs(centerDepth-sampleDepth); + // scale the required threshold by the distance + int isSameDepth = zdiff * _Sensitivity.x < 0.09 * centerDepth; + + // return: + // 1 - if normals and depth are similar enough + // 0 - otherwise + + return isSameNormal * isSameDepth ? 1.0 : 0.0; + } + + v2f vertRobert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + float2 uv = v.texcoord.xy; + o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + uv.y = 1-uv.y; + #endif + + // calc coord for the X pattern + // maybe nicer TODO for the future: 'rotated triangles' + + o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,1) * _SampleDistance, _MainTex_ST); + o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,-1) * _SampleDistance, _MainTex_ST); + o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,1) * _SampleDistance, _MainTex_ST); + o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,-1) * _SampleDistance, _MainTex_ST); + + return o; + } + + v2f vertThin( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + float2 uv = v.texcoord.xy; + o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + uv.y = 1-uv.y; + #endif + + o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); + o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); + + // offsets for two additional samples + o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); + o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); + + return o; + } + + v2fd vertD( appdata_img v ) + { + v2fd o; + o.pos = UnityObjectToClipPos(v.vertex); + + float2 uv = v.texcoord.xy; + o.uv[0] = uv; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + uv.y = 1-uv.y; + #endif + + o.uv[1] = uv; + + return o; + } + + float4 fragDCheap(v2fd i) : SV_Target + { + // inspired by borderlands implementation of popular "sobel filter" + + float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv[1])); + float4 depthsDiag; + float4 depthsAxis; + + float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; + + depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR + depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL + depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR + depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL + + depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T + depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L + depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R + depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B + + depthsDiag -= centerDepth; + depthsAxis /= centerDepth; + + const float4 HorizDiagCoeff = float4(1,1,-1,-1); + const float4 VertDiagCoeff = float4(-1,1,-1,1); + const float4 HorizAxisCoeff = float4(1,0,0,-1); + const float4 VertAxisCoeff = float4(0,1,-1,0); + + float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; + float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; + + float SobelX = dot(SobelH, float4(1,1,1,1)); + float SobelY = dot(SobelV, float4(1,1,1,1)); + float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); + + Sobel = 1.0-pow(saturate(Sobel), _Exponent); + return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); + } + + // pretty much also just a sobel filter, except for that edges "outside" the silhouette get discarded + // which makes it compatible with other depth based post fx + + float4 fragD(v2fd i) : SV_Target + { + // inspired by borderlands implementation of popular "sobel filter" + + float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1], _CameraDepthTexture_ST))); + float4 depthsDiag; + float4 depthsAxis; + + float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; + + depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR + depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL + depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR + depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL + + depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T + depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L + depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R + depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B + + // make it work nicely with depth based image effects such as depth of field: + depthsDiag = (depthsDiag > centerDepth.xxxx) ? depthsDiag : centerDepth.xxxx; + depthsAxis = (depthsAxis > centerDepth.xxxx) ? depthsAxis : centerDepth.xxxx; + + depthsDiag -= centerDepth; + depthsAxis /= centerDepth; + + const float4 HorizDiagCoeff = float4(1,1,-1,-1); + const float4 VertDiagCoeff = float4(-1,1,-1,1); + const float4 HorizAxisCoeff = float4(1,0,0,-1); + const float4 VertAxisCoeff = float4(0,1,-1,0); + + float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; + float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; + + float SobelX = dot(SobelH, float4(1,1,1,1)); + float SobelY = dot(SobelV, float4(1,1,1,1)); + float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); + + Sobel = 1.0-pow(saturate(Sobel), _Exponent); + return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); + } + + half4 fragRobert(v2f i) : SV_Target { + half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv[1].xy); + half4 sample2 = tex2D(_CameraDepthNormalsTexture, i.uv[2].xy); + half4 sample3 = tex2D(_CameraDepthNormalsTexture, i.uv[3].xy); + half4 sample4 = tex2D(_CameraDepthNormalsTexture, i.uv[4].xy); + + half edge = 1.0; + + edge *= CheckSame(sample1.xy, DecodeFloatRG(sample1.zw), sample2); + edge *= CheckSame(sample3.xy, DecodeFloatRG(sample3.zw), sample4); + + return edge * lerp(tex2D(_MainTex, i.uv[0]), _BgColor, _BgFade); + } + + half4 fragThin (v2f i) : SV_Target + { + half4 original = tex2D(_MainTex, i.uv[0]); + + half4 center = tex2D (_CameraDepthNormalsTexture, i.uv[1]); + half4 sample1 = tex2D (_CameraDepthNormalsTexture, i.uv[2]); + half4 sample2 = tex2D (_CameraDepthNormalsTexture, i.uv[3]); + + // encoded normal + half2 centerNormal = center.xy; + // decoded depth + float centerDepth = DecodeFloatRG (center.zw); + + half edge = 1.0; + + edge *= CheckSame(centerNormal, centerDepth, sample1); + edge *= CheckSame(centerNormal, centerDepth, sample2); + + return edge * lerp(original, _BgColor, _BgFade); + } + + ENDCG + +Subshader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vertThin + #pragma fragment fragThin + ENDCG + } + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vertRobert + #pragma fragment fragRobert + ENDCG + } + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma target 3.0 + #pragma vertex vertD + #pragma fragment fragDCheap + ENDCG + } + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma target 3.0 + #pragma vertex vertD + #pragma fragment fragD + ENDCG + } + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma target 3.0 + #pragma vertex vertLum + #pragma fragment fragLum + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/EdgeDetectNormals.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/EdgeDetectNormals.shader.meta new file mode 100644 index 0000000..328c9db --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/EdgeDetectNormals.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 0d1644bdf064147baa97f235fc5b4903 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/FisheyeShader.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/FisheyeShader.shader new file mode 100644 index 0000000..8975f9f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/FisheyeShader.shader @@ -0,0 +1,59 @@ +Shader "Hidden/FisheyeShader" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + // Shader code pasted into all further CGPROGRAM blocks + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + half4 _MainTex_ST; + + float2 intensity; + + v2f vert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + return o; + } + + half4 frag(v2f i) : SV_Target + { + half2 coords = i.uv; + coords = (coords - 0.5) * 2.0; + + half2 realCoordOffs; + realCoordOffs.x = (1-coords.y * coords.y) * intensity.y * (coords.x); + realCoordOffs.y = (1-coords.x * coords.x) * intensity.x * (coords.y); + + half4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - realCoordOffs, _MainTex_ST)); + + return color; + } + + ENDCG + +Subshader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } + +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/FisheyeShader.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/FisheyeShader.shader.meta new file mode 100644 index 0000000..8eb2318 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/FisheyeShader.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 874ceab4425f64bccb1d14032f4452b1 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/GlobalFog.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GlobalFog.shader new file mode 100644 index 0000000..5a4daf7 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GlobalFog.shader @@ -0,0 +1,192 @@ +Shader "Hidden/GlobalFog" { +Properties { + _MainTex ("Base (RGB)", 2D) = "black" {} +} + +CGINCLUDE + + #include "UnityCG.cginc" + + uniform sampler2D _MainTex; + uniform sampler2D_float _CameraDepthTexture; + + // x = fog height + // y = FdotC (CameraY-FogHeight) + // z = k (FdotC > 0.0) + // w = a/2 + uniform float4 _HeightParams; + + // x = start distance + uniform float4 _DistanceParams; + + int4 _SceneFogMode; // x = fog mode, y = use radial flag + float4 _SceneFogParams; + #ifndef UNITY_APPLY_FOG + half4 unity_FogColor; + half4 unity_FogDensity; + #endif + + uniform float4 _MainTex_TexelSize; + + // for fast world space reconstruction + uniform float4x4 _FrustumCornersWS; + uniform float4 _CameraWS; + + struct appdata_fog + { + float4 vertex : POSITION; + half2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uv_depth : TEXCOORD1; + float4 interpolatedRay : TEXCOORD2; + }; + + v2f vert (appdata_fog v) + { + v2f o; + v.vertex.z = 0.1; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.uv_depth = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + o.uv.y = 1-o.uv.y; + #endif + + int frustumIndex = v.texcoord.x + (2 * o.uv.y); + o.interpolatedRay = _FrustumCornersWS[frustumIndex]; + o.interpolatedRay.w = frustumIndex; + + return o; + } + + // Applies one of standard fog formulas, given fog coordinate (i.e. distance) + half ComputeFogFactor (float coord) + { + float fogFac = 0.0; + if (_SceneFogMode.x == 1) // linear + { + // factor = (end-z)/(end-start) = z * (-1/(end-start)) + (end/(end-start)) + fogFac = coord * _SceneFogParams.z + _SceneFogParams.w; + } + if (_SceneFogMode.x == 2) // exp + { + // factor = exp(-density*z) + fogFac = _SceneFogParams.y * coord; fogFac = exp2(-fogFac); + } + if (_SceneFogMode.x == 3) // exp2 + { + // factor = exp(-(density*z)^2) + fogFac = _SceneFogParams.x * coord; fogFac = exp2(-fogFac*fogFac); + } + return saturate(fogFac); + } + + // Distance-based fog + float ComputeDistance (float3 camDir, float zdepth) + { + float dist; + if (_SceneFogMode.y == 1) + dist = length(camDir); + else + dist = zdepth * _ProjectionParams.z; + // Built-in fog starts at near plane, so match that by + // subtracting the near value. Not a perfect approximation + // if near plane is very large, but good enough. + dist -= _ProjectionParams.y; + return dist; + } + + // Linear half-space fog, from https://www.terathon.com/lengyel/Lengyel-UnifiedFog.pdf + float ComputeHalfSpace (float3 wsDir) + { + float3 wpos = _CameraWS + wsDir; + float FH = _HeightParams.x; + float3 C = _CameraWS; + float3 V = wsDir; + float3 P = wpos; + float3 aV = _HeightParams.w * V; + float FdotC = _HeightParams.y; + float k = _HeightParams.z; + float FdotP = P.y-FH; + float FdotV = wsDir.y; + float c1 = k * (FdotP + FdotC); + float c2 = (1-2*k) * FdotP; + float g = min(c2, 0.0); + g = -length(aV) * (c1 - g * g / abs(FdotV+1.0e-5f)); + return g; + } + + half4 ComputeFog (v2f i, bool distance, bool height) : SV_Target + { + half4 sceneColor = tex2D(_MainTex, UnityStereoTransformScreenSpaceTex(i.uv)); + + // Reconstruct world space position & direction + // towards this screen pixel. + float rawDepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoTransformScreenSpaceTex(i.uv_depth)); + float dpth = Linear01Depth(rawDepth); + float4 wsDir = dpth * i.interpolatedRay; + float4 wsPos = _CameraWS + wsDir; + + // Compute fog distance + float g = _DistanceParams.x; + if (distance) + g += ComputeDistance (wsDir, dpth); + if (height) + g += ComputeHalfSpace (wsDir); + + // Compute fog amount + half fogFac = ComputeFogFactor (max(0.0,g)); + // Do not fog skybox + if (dpth == _DistanceParams.y) + fogFac = 1.0; + //return fogFac; // for debugging + + // Lerp between fog color & original scene color + // by fog amount + return lerp (unity_FogColor, sceneColor, fogFac); + } + +ENDCG + +SubShader +{ + ZTest Always Cull Off ZWrite Off Fog { Mode Off } + + // 0: distance + height + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + half4 frag (v2f i) : SV_Target { return ComputeFog (i, true, true); } + ENDCG + } + // 1: distance + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + half4 frag (v2f i) : SV_Target { return ComputeFog (i, true, false); } + ENDCG + } + // 2: height + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + half4 frag (v2f i) : SV_Target { return ComputeFog (i, false, true); } + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/GlobalFog.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GlobalFog.shader.meta new file mode 100644 index 0000000..bcb93d2 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GlobalFog.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 70d8568987ac0499f952b54c7c13e265 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/GrayscaleEffect.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GrayscaleEffect.shader new file mode 100644 index 0000000..ca45941 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GrayscaleEffect.shader @@ -0,0 +1,37 @@ +Shader "Hidden/Grayscale Effect" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _RampTex ("Base (RGB)", 2D) = "grayscaleRamp" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert_img +#pragma fragment frag +#include "UnityCG.cginc" + +uniform sampler2D _MainTex; +uniform sampler2D _RampTex; +uniform half _RampOffset; +half4 _MainTex_ST; + +fixed4 frag (v2f_img i) : SV_Target +{ + fixed4 original = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + fixed grayscale = Luminance(original.rgb); + half2 remap = half2 (grayscale + _RampOffset, .5); + fixed4 output = tex2D(_RampTex, remap); + output.a = original.a; + return output; +} +ENDCG + + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/GrayscaleEffect.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GrayscaleEffect.shader.meta new file mode 100644 index 0000000..5fbca77 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/GrayscaleEffect.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: daf9781cad112c75d0008dfa8d76c639 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlur.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlur.shader new file mode 100644 index 0000000..dd4bade --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlur.shader @@ -0,0 +1,120 @@ +Shader "Hidden/MotionBlur" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _AccumOrig("AccumOrig", Float) = 0.65 +} + + SubShader { + ZTest Always Cull Off ZWrite Off + Pass { + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + BindChannels { + Bind "vertex", vertex + Bind "texcoord", texcoord + } + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD; + }; + + struct v2f { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD; + }; + + float4 _MainTex_ST; + float _AccumOrig; + + v2f vert (appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + sampler2D _MainTex; + + half4 frag (v2f i) : SV_Target + { + return half4(tex2D(_MainTex, i.texcoord).rgb, _AccumOrig ); + } + ENDCG + } + + Pass { + Blend One Zero + ColorMask A + + BindChannels { + Bind "vertex", vertex + Bind "texcoord", texcoord + } + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD; + }; + + struct v2f { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD; + }; + + float4 _MainTex_ST; + + v2f vert (appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + sampler2D _MainTex; + + half4 frag (v2f i) : SV_Target + { + return tex2D(_MainTex, i.texcoord); + } + ENDCG + } + + } + +SubShader { + ZTest Always Cull Off ZWrite Off + Pass { + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + SetTexture [_MainTex] { + ConstantColor (0,0,0,[_AccumOrig]) + Combine texture, constant + } + } + Pass { + Blend One Zero + ColorMask A + SetTexture [_MainTex] { + Combine texture + } + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlur.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlur.shader.meta new file mode 100644 index 0000000..281af89 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlur.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: e9ba2083ad114a07d000fbfb8d76c639 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlurClear.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlurClear.shader new file mode 100644 index 0000000..5d5ceb6 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlurClear.shader @@ -0,0 +1,58 @@ + +Shader "Hidden/MotionBlurClear" +{ + +Properties { } + +SubShader { +Pass { + //ZTest LEqual + ZTest Always // lame depth test + ZWrite Off // lame depth test + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct vs_input { + float4 vertex : POSITION; + }; + + struct ps_input { + float4 pos : SV_POSITION; + float4 screen : TEXCOORD0; + }; + + sampler2D_float _CameraDepthTexture; + + ps_input vert (vs_input v) + { + ps_input o; + o.pos = UnityObjectToClipPos(v.vertex); + o.screen = ComputeScreenPos(o.pos); + COMPUTE_EYEDEPTH(o.screen.z); + return o; + } + + float4 frag (ps_input i) : SV_Target + { + // superlame: manual depth test needed as we can't bind depth, FIXME for 4.x + // alternatively implement SM > 3 version where we write out custom depth + + float d = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screen)); + d = LinearEyeDepth(d); + + clip(d - i.screen.z + 1e-2f); + return float4(0, 0, 0, 0); + } + + ENDCG + + } +} + +Fallback Off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlurClear.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlurClear.shader.meta new file mode 100644 index 0000000..3e9e48f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/MotionBlurClear.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 7699c5fbfa27745a1abe111ab7bf9785 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrain.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrain.shader new file mode 100644 index 0000000..095b2a1 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrain.shader @@ -0,0 +1,158 @@ +Shader "Hidden/NoiseAndGrain" { + Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _NoiseTex ("Noise (RGB)", 2D) = "white" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _NoiseTex; + float4 _NoiseTex_TexelSize; + + uniform float4 _MainTex_TexelSize; + + uniform float3 _NoisePerChannel; + uniform float3 _NoiseTilingPerChannel; + uniform float3 _NoiseAmount; + uniform float3 _ThreshholdRGB; + uniform float3 _MidGrey; + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv_screen : TEXCOORD0; + float4 uvRg : TEXCOORD1; + float2 uvB : TEXCOORD2; + }; + + struct appdata_img2 + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + inline float3 Overlay(float3 m, float3 color) { + color = saturate(color); + float3 check = step(float3(0.5,0.5,0.5), color.rgb); + float3 result = check * (float3(1,1,1) - ((float3(1,1,1) - 2*(color.rgb-0.5)) * (1-m.rgb))); + result += (1-check) * (2*color.rgb) * m.rgb; + return result; + } + + v2f vert (appdata_img2 v) + { + v2f o; + + o.pos = UnityObjectToClipPos(v.vertex); + + #if UNITY_UV_STARTS_AT_TOP + o.uv_screen = v.vertex.xyxy; + if (_MainTex_TexelSize.y < 0) + o.uv_screen.y = 1-o.uv_screen.y; + #else + o.uv_screen = v.vertex.xy; + #endif + + o.uv_screen = UnityStereoTransformScreenSpaceTex(o.uv_screen); + + // different tiling for 3 channels + o.uvRg = v.texcoord.xyxy + v.texcoord1.xyxy * _NoiseTilingPerChannel.rrgg * _NoiseTex_TexelSize.xyxy; + o.uvB = v.texcoord.xy + v.texcoord1.xy * _NoiseTilingPerChannel.bb * _NoiseTex_TexelSize.xy; + + return o; + } + + float4 frag ( v2f i ) : SV_Target + { + float4 color = (tex2D (_MainTex, i.uv_screen.xy)); + + // black & white intensities + float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey + blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(1.0/0.8, -1.0/0.2)); + + float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy)); + + // fetching & scaling noise (COMPILER BUG WORKAROUND) + float3 m = float3(0,0,0); + m += (tex2D(_NoiseTex, i.uvRg.xy) * float4(1,0,0,0)).rgb; + m += (tex2D(_NoiseTex, i.uvRg.zw) * float4(0,1,0,0)).rgb; + m += (tex2D(_NoiseTex, i.uvB.xy) * float4(0,0,1,0)).rgb; + + m = saturate(lerp(float3(0.5,0.5,0.5), m, _NoisePerChannel.rgb * float3(finalIntensity,finalIntensity,finalIntensity) )); + + return float4(Overlay(m, color.rgb), color.a); + } + + float4 fragTmp ( v2f i ) : SV_Target + { + float4 color = (tex2D (_MainTex, i.uv_screen.xy)); + + // black & white intensities + float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey + blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(1.0/0.8, -1.0/0.2)); + + float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy)); + + // fetching & scaling noise (COMPILER BUG WORKAROUND) + float3 m = float3(0,0,0); + m += (tex2D(_NoiseTex, i.uvRg.xy) * float4(1,0,0,0)).rgb; + m += (tex2D(_NoiseTex, i.uvRg.zw) * float4(0,1,0,0)).rgb; + m += (tex2D(_NoiseTex, i.uvB.xy) * float4(0,0,1,0)).rgb; + + m = saturate(lerp(float3(0.5,0.5,0.5), m, _NoisePerChannel.rgb * float3(finalIntensity,finalIntensity,finalIntensity))); + + return float4(m.rgb, color.a); + } + + float4 fragOverlayBlend ( v2f i ) : SV_Target + { + float4 color = tex2D(_MainTex, i.uv_screen.xy); + float4 m = tex2D(_NoiseTex, i.uv_screen.xy); + + return float4(Overlay(m, color.rgb), color.a); + } + + ENDCG + + SubShader { + ZTest Always Cull Off ZWrite Off Blend Off + + Pass { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + ENDCG + + } + + Pass { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragOverlayBlend + + ENDCG + + } + + Pass { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragTmp + + ENDCG + + } + } + FallBack Off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrain.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrain.shader.meta new file mode 100644 index 0000000..4f9286a --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrain.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: b0249d8c935344451aa4de6db76f0688 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrainDX11.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrainDX11.shader new file mode 100644 index 0000000..3aed8f4 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrainDX11.shader @@ -0,0 +1,237 @@ +Shader "Hidden/NoiseAndGrainDX11" { + Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _NoiseTex ("Noise (RGB)", 2D) = "white" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _NoiseTex; + float4 _NoiseTex_TexelSize; + + uniform float4 _MainTex_TexelSize; + + uniform float3 _NoisePerChannel; + uniform float3 _NoiseTilingPerChannel; + uniform float3 _NoiseAmount; + uniform float3 _ThreshholdRGB; + uniform float3 _MidGrey; + uniform float _DX11NoiseTime; + + // DX11 noise helper functions, credit: rgba/iq + + int ihash(int n) + { + n = (n<<13)^n; + return (n*(n*n*15731+789221)+1376312589) & 2147483647; + } + + float frand(int n) + { + return ihash(n) / 2147483647.0; + } + + float cellNoise1f(int3 p) + { + return frand(p.z*65536 + p.y*256 + p.x);//*2.0-1.0; + } + + float3 cellNoise3f(int3 p) + { + int i = p.z*65536 + p.y*256 + p.x; + return float3(frand(i), frand(i + 57), frand(i + 113));//*2.0-1.0; + } + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv_screen : TEXCOORD0; + float4 uvRg : TEXCOORD1; + float2 uvB : TEXCOORD2; + float2 uvOffsets : TEXCOORD4; + }; + + struct appdata_img2 + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + inline float3 Overlay(float3 m, float3 color) { + float3 check = step(0.5, color.rgb); + float3 result = check * (float3(1,1,1) - ((float3(1,1,1) - 2*(color.rgb-0.5)) * (1-m.rgb))); + result += (1-check) * (2*color.rgb) * m.rgb; + return result; + } + + v2f vert (appdata_img2 v) + { + v2f o; + + o.pos = UnityObjectToClipPos(v.vertex); + + #if UNITY_UV_STARTS_AT_TOP + o.uv_screen = v.vertex.xyxy; + if (_MainTex_TexelSize.y < 0) + o.uv_screen.y = 1-o.uv_screen.y; + #else + o.uv_screen = v.vertex.xy; + #endif + + // different tiling for 3 channels + o.uvRg = v.texcoord.xyxy + v.texcoord1.xyxy * _NoiseTilingPerChannel.rrgg * _NoiseTex_TexelSize.xyxy; + o.uvB = v.texcoord.xy + v.texcoord1.xy * _NoiseTilingPerChannel.bb * _NoiseTex_TexelSize.xy; + + o.uvOffsets = v.texcoord.xy; + + return o; + } + + float4 fragDX11 ( v2f i ) : SV_Target + { + float4 color = saturate(tex2D (_MainTex, UnityStereoTransformScreenSpaceTex(i.uv_screen.xy))); + + // black & white intensities + float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey + blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(1.0/0.8, -1.0/0.2)); + + float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy)); + + float3 m = cellNoise3f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime)); + m = saturate(lerp(float3(0.5,0.5,0.5), m, _NoisePerChannel.rgb * finalIntensity)); + + return float4(Overlay(m, color.rgb), color.a); + } + + float4 fragDX11Monochrome ( v2f i ) : SV_Target + { + float4 color = saturate(tex2D (_MainTex, UnityStereoTransformScreenSpaceTex(i.uv_screen.xy))); + + // black & white intensities + float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey + blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(1.0/0.8, -1.0/0.2)); + + float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy)); + + float3 m = cellNoise1f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime)); + m = saturate(lerp(float3(0.5,0.5,0.5), m, finalIntensity)); + + return float4(Overlay(m, color.rgb), color.a); + } + + float4 fragDX11Tmp ( v2f i ) : SV_Target + { + float4 color = saturate(tex2D (_MainTex, UnityStereoTransformScreenSpaceTex(i.uv_screen.xy))); + + // black & white intensities + float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey + blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(1.0/0.8, -1.0/0.2)); + + float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy)); + + float3 m = cellNoise3f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime)); + m = saturate(lerp(float3(0.5,0.5,0.5), m, _NoisePerChannel.rgb * finalIntensity)); + + return float4(m.rgb, color.a); + } + + float4 fragDX11MonochromeTmp ( v2f i ) : SV_Target + { + float4 color = saturate(tex2D (_MainTex, UnityStereoTransformScreenSpaceTex(i.uv_screen.xy))); + + // black & white intensities + float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey + blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(1.0/0.8, -1.0/0.2)); + + float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy)); + + float3 m = cellNoise1f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime)); + m = saturate(lerp(float3(0.5,0.5,0.5), m, finalIntensity)); + + return float4(m.rgb, color.a); + } + + float4 fragOverlayBlend ( v2f i ) : SV_Target + { + float4 color = saturate(tex2D (_MainTex, UnityStereoTransformScreenSpaceTex(i.uv_screen.xy))); + float4 m = saturate(tex2D (_NoiseTex, i.uv_screen.xy)); + + return float4(Overlay(m, color.rgb), color.a); + } + + ENDCG + + SubShader { + ZTest Always Cull Off ZWrite Off Blend Off + + Pass { + + CGPROGRAM + + #pragma exclude_renderers gles xbox360 ps3 d3d9 + #pragma target 5.0 + #pragma vertex vert + #pragma fragment fragDX11 + + ENDCG + + } + + Pass { + + CGPROGRAM + + #pragma exclude_renderers gles xbox360 ps3 d3d9 + #pragma target 5.0 + #pragma vertex vert + #pragma fragment fragDX11Monochrome + + ENDCG + + } + + Pass { + + CGPROGRAM + + #pragma exclude_renderers gles xbox360 ps3 d3d9 + #pragma target 5.0 + #pragma vertex vert + #pragma fragment fragDX11Tmp + + ENDCG + + } + + Pass { + + CGPROGRAM + + #pragma exclude_renderers gles xbox360 ps3 d3d9 + #pragma target 5.0 + #pragma vertex vert + #pragma fragment fragDX11MonochromeTmp + + ENDCG + + } + + Pass { + + CGPROGRAM + + #pragma exclude_renderers gles xbox360 ps3 d3d9 + #pragma target 5.0 + #pragma vertex vert + #pragma fragment fragOverlayBlend + + ENDCG + + } + } + FallBack Off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrainDX11.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrainDX11.shader.meta new file mode 100644 index 0000000..829e8e3 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseAndGrainDX11.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 8b30686bb4322ab42ad5eb50a0210b58 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderRGB.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderRGB.shader new file mode 100644 index 0000000..eebdf75 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderRGB.shader @@ -0,0 +1,64 @@ +Shader "Hidden/Noise Shader RGB" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _GrainTex ("Base (RGB)", 2D) = "gray" {} + _ScratchTex ("Base (RGB)", 2D) = "gray" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uvg : TEXCOORD1; // grain + float2 uvs : TEXCOORD2; // scratch +}; + +uniform sampler2D _MainTex; +uniform sampler2D _GrainTex; +uniform sampler2D _ScratchTex; + +uniform float4 _GrainOffsetScale; +uniform float4 _ScratchOffsetScale; +uniform fixed4 _Intensity; // x=grain, y=scratch + +half4 _MainTex_ST; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(MultiplyUV (UNITY_MATRIX_TEXTURE0, v.texcoord), _MainTex_ST); + o.uvg = v.texcoord.xy * _GrainOffsetScale.zw + _GrainOffsetScale.xy; + o.uvs = v.texcoord.xy * _ScratchOffsetScale.zw + _ScratchOffsetScale.xy; + return o; +} + +fixed4 frag (v2f i) : SV_Target +{ + fixed4 col = tex2D(_MainTex, i.uv); + + // sample noise texture and do a signed add + fixed3 grain = tex2D(_GrainTex, i.uvg).rgb * 2 - 1; + col.rgb += grain * _Intensity.x; + + // sample scratch texture and do a signed add + fixed3 scratch = tex2D(_ScratchTex, i.uvs).rgb * 2 - 1; + col.rgb += scratch * _Intensity.y; + + return col; +} +ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderRGB.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderRGB.shader.meta new file mode 100644 index 0000000..e11fb85 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderRGB.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 5d7f4c401ae8946bcb0d6ff68a9e7466 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderYUV.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderYUV.shader new file mode 100644 index 0000000..6ac291a --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderYUV.shader @@ -0,0 +1,75 @@ +Shader "Hidden/Noise Shader YUV" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _GrainTex ("Base (RGB)", 2D) = "gray" {} + _ScratchTex ("Base (RGB)", 2D) = "gray" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uvg : TEXCOORD1; // grain + float2 uvs : TEXCOORD2; // scratch +}; + +uniform sampler2D _MainTex; +uniform sampler2D _GrainTex; +uniform sampler2D _ScratchTex; + +uniform float4 _GrainOffsetScale; +uniform float4 _ScratchOffsetScale; +uniform fixed4 _Intensity; // x=grain, y=scratch + +half4 _MainTex_ST; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(MultiplyUV (UNITY_MATRIX_TEXTURE0, v.texcoord), _MainTex_ST); + o.uvg = v.texcoord.xy * _GrainOffsetScale.zw + _GrainOffsetScale.xy; + o.uvs = v.texcoord.xy * _ScratchOffsetScale.zw + _ScratchOffsetScale.xy; + return o; +} + +fixed4 frag (v2f i) : SV_Target +{ + fixed4 col = tex2D(_MainTex, i.uv); + + // convert to YUV + fixed3 yuv; + yuv.x = dot( col.rgb, half3(0.299,0.587,0.114) ); + yuv.y = (col.b-yuv.x)*0.492; + yuv.z = (col.r-yuv.x)*0.877; + + // sample noise texture and do a signed add + fixed3 grain = tex2D(_GrainTex, i.uvg).rgb * 2 - 1; + yuv.rgb += grain * _Intensity.x; + + // convert back to rgb + col.r = yuv.z * 1.140 + yuv.x; + col.g = yuv.z * (-0.581) + yuv.y * (-0.395) + yuv.x; + col.b = yuv.y * 2.032 + yuv.x; + + // sample scratch texture and add + fixed3 scratch = tex2D(_ScratchTex, i.uvs).rgb * 2 - 1; + col.rgb += scratch * _Intensity.y; + + return col; +} +ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderYUV.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderYUV.shader.meta new file mode 100644 index 0000000..b817ce9 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/NoiseEffectShaderYUV.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 0e447868506ba49f0a73235b8a8b647a +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/PrepareSunShaftsBlur.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/PrepareSunShaftsBlur.shader new file mode 100644 index 0000000..25164ca --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/PrepareSunShaftsBlur.shader @@ -0,0 +1,97 @@ + +Shader "Hidden/PrepareSunShaftsBlur" { + Properties { + _MainTex ("Base", 2D) = "" {} + _Skybox ("Skybox", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + sampler2D _Skybox; + sampler2D_float _CameraDepthTexture; + + uniform half _NoSkyBoxMask; + uniform half4 _SunPosition; + + v2f vert (appdata_img v) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + return o; + } + + half TransformColor (half4 skyboxValue) { + return max (skyboxValue.a, _NoSkyBoxMask * dot (skyboxValue.rgb, float3 (0.59,0.3,0.11))); + } + + half4 frag (v2f i) : SV_Target { + float depthSample = SAMPLE_DEPTH_TEXTURE( _CameraDepthTexture, i.uv.xy); + half4 tex = tex2D (_MainTex, i.uv.xy); + + depthSample = Linear01Depth (depthSample); + + // consider maximum radius + half2 vec = _SunPosition.xy - i.uv.xy; + half dist = saturate (_SunPosition.w - length (vec.xy)); + + half4 outColor = 0; + + // consider shafts blockers + if (depthSample > 0.99) + outColor = TransformColor (tex) * dist; + + return outColor; + } + + half4 fragNoDepthNeeded (v2f i) : SV_Target { + float4 sky = (tex2D (_Skybox, i.uv.xy)); + float4 tex = (tex2D (_MainTex, i.uv.xy)); + + // consider maximum radius + half2 vec = _SunPosition.xy - i.uv.xy; + half dist = saturate (_SunPosition.w - length (vec)); + + half4 outColor = 0; + + if (Luminance ( abs(sky.rgb - tex.rgb)) < 0.2) + outColor = TransformColor (sky) * dist; + + return outColor; + } + + ENDCG + +Subshader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + ENDCG + } + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragNoDepthNeeded + + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/PrepareSunShaftsBlur.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/PrepareSunShaftsBlur.shader.meta new file mode 100644 index 0000000..e32df02 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/PrepareSunShaftsBlur.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 9ad381ed8492840ab9f165df743e4826 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/RadialBlur.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/RadialBlur.shader new file mode 100644 index 0000000..d4c9094 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/RadialBlur.shader @@ -0,0 +1,71 @@ +Shader "Hidden/RadialBlur" +{ + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + // Shader code pasted into all further CGPROGRAM blocks + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 blurVector : TEXCOORD1; + }; + + sampler2D _MainTex; + + float4 _BlurRadius4; + float4 _SunPosition; + + float4 _MainTex_TexelSize; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = v.texcoord.xy; + + o.blurVector = (_SunPosition.xy - v.texcoord.xy) * _BlurRadius4.xy; + + return o; + } + + #define SAMPLES_FLOAT 6.0f + #define SAMPLES_INT 6 + + half4 frag(v2f i) : SV_Target + { + half4 color = half4(0,0,0,0); + + for(int j = 0; j < SAMPLES_INT; j++) + { + half4 tmpColor = tex2D(_MainTex, i.uv.xy); + color += tmpColor; + + i.uv.xy += i.blurVector; + } + + return color / SAMPLES_FLOAT; + } + + ENDCG + +Subshader +{ + Blend One Zero + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + ENDCG + } // Pass +} // Subshader + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/RadialBlur.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/RadialBlur.shader.meta new file mode 100644 index 0000000..a8725c4 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/RadialBlur.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: f58445347fe2e4b8396487ed2bfa02ad +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SSAOShader.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SSAOShader.shader new file mode 100644 index 0000000..08a13cf --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SSAOShader.shader @@ -0,0 +1,283 @@ +Shader "Hidden/SSAO" { +Properties { + _MainTex ("", 2D) = "" {} + _RandomTexture ("", 2D) = "" {} + _SSAO ("", 2D) = "" {} +} +Subshader { + ZTest Always Cull Off ZWrite Off + +CGINCLUDE +// Common code used by several SSAO passes below +#include "UnityCG.cginc" +struct v2f_ao { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uvr : TEXCOORD1; +}; + +uniform float2 _NoiseScale; +float4 _CameraDepthNormalsTexture_ST; + +v2f_ao vert_ao (appdata_img v) +{ + v2f_ao o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _CameraDepthNormalsTexture); + o.uvr = v.texcoord.xy * _NoiseScale; + return o; +} + +sampler2D _CameraDepthNormalsTexture; +sampler2D _RandomTexture; +float4 _Params; // x=radius, y=minz, z=attenuation power, w=SSAO power + +// HLSL and GLSL do not support arbitrarily sized arrays as function parameters (eg. float bla[]), whereas Cg does. +#if !defined(UNITY_COMPILER_CG) + +# define INPUT_SAMPLE_COUNT 8 +# include "frag_ao.cginc" +# undef INPUT_SAMPLE_COUNT + +# define INPUT_SAMPLE_COUNT 14 +# include "frag_ao.cginc" +# undef INPUT_SAMPLE_COUNT + +# define INPUT_SAMPLE_COUNT 26 +# include "frag_ao.cginc" +# undef INPUT_SAMPLE_COUNT + +# define INPUT_SAMPLE_COUNT 34 +# include "frag_ao.cginc" +# undef INPUT_SAMPLE_COUNT + +#else +# define INPUT_SAMPLE_COUNT +# include "frag_ao.cginc" +#endif + +ENDCG + + // ---- SSAO pass, 8 samples + Pass { + +CGPROGRAM +#pragma vertex vert_ao +#pragma fragment frag +#pragma target 3.0 + + +half4 frag (v2f_ao i) : SV_Target +{ + #define SAMPLE_COUNT 8 + const float3 RAND_SAMPLES[SAMPLE_COUNT] = { + float3(0.01305719,0.5872321,-0.119337), + float3(0.3230782,0.02207272,-0.4188725), + float3(-0.310725,-0.191367,0.05613686), + float3(-0.4796457,0.09398766,-0.5802653), + float3(0.1399992,-0.3357702,0.5596789), + float3(-0.2484578,0.2555322,0.3489439), + float3(0.1871898,-0.702764,-0.2317479), + float3(0.8849149,0.2842076,0.368524), + }; + return frag_ao (i, SAMPLE_COUNT, RAND_SAMPLES); +} +ENDCG + + } + +// ---- SSAO pass, 14 samples + Pass { + +CGPROGRAM +#pragma vertex vert_ao +#pragma fragment frag +#pragma target 3.0 + + +half4 frag (v2f_ao i) : SV_Target +{ + #define SAMPLE_COUNT 14 + const float3 RAND_SAMPLES[SAMPLE_COUNT] = { + float3(0.4010039,0.8899381,-0.01751772), + float3(0.1617837,0.1338552,-0.3530486), + float3(-0.2305296,-0.1900085,0.5025396), + float3(-0.6256684,0.1241661,0.1163932), + float3(0.3820786,-0.3241398,0.4112825), + float3(-0.08829653,0.1649759,0.1395879), + float3(0.1891677,-0.1283755,-0.09873557), + float3(0.1986142,0.1767239,0.4380491), + float3(-0.3294966,0.02684341,-0.4021836), + float3(-0.01956503,-0.3108062,-0.410663), + float3(-0.3215499,0.6832048,-0.3433446), + float3(0.7026125,0.1648249,0.02250625), + float3(0.03704464,-0.939131,0.1358765), + float3(-0.6984446,-0.6003422,-0.04016943), + }; + return frag_ao (i, SAMPLE_COUNT, RAND_SAMPLES); +} +ENDCG + + } + +// ---- SSAO pass, 26 samples + Pass { + +CGPROGRAM +#pragma vertex vert_ao +#pragma fragment frag +#pragma target 3.0 + + +half4 frag (v2f_ao i) : SV_Target +{ + #define SAMPLE_COUNT 26 + const float3 RAND_SAMPLES[SAMPLE_COUNT] = { + float3(0.2196607,0.9032637,0.2254677), + float3(0.05916681,0.2201506,-0.1430302), + float3(-0.4152246,0.1320857,0.7036734), + float3(-0.3790807,0.1454145,0.100605), + float3(0.3149606,-0.1294581,0.7044517), + float3(-0.1108412,0.2162839,0.1336278), + float3(0.658012,-0.4395972,-0.2919373), + float3(0.5377914,0.3112189,0.426864), + float3(-0.2752537,0.07625949,-0.1273409), + float3(-0.1915639,-0.4973421,-0.3129629), + float3(-0.2634767,0.5277923,-0.1107446), + float3(0.8242752,0.02434147,0.06049098), + float3(0.06262707,-0.2128643,-0.03671562), + float3(-0.1795662,-0.3543862,0.07924347), + float3(0.06039629,0.24629,0.4501176), + float3(-0.7786345,-0.3814852,-0.2391262), + float3(0.2792919,0.2487278,-0.05185341), + float3(0.1841383,0.1696993,-0.8936281), + float3(-0.3479781,0.4725766,-0.719685), + float3(-0.1365018,-0.2513416,0.470937), + float3(0.1280388,-0.563242,0.3419276), + float3(-0.4800232,-0.1899473,0.2398808), + float3(0.6389147,0.1191014,-0.5271206), + float3(0.1932822,-0.3692099,-0.6060588), + float3(-0.3465451,-0.1654651,-0.6746758), + float3(0.2448421,-0.1610962,0.1289366), + }; + return frag_ao (i, SAMPLE_COUNT, RAND_SAMPLES); +} +ENDCG + + } + +// ---- Blur pass + Pass { +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#pragma target 3.0 +#include "UnityCG.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _CameraDepthNormalsTexture); + return o; +} + +sampler2D _SSAO; +float3 _TexelOffsetScale; + +inline half CheckSame (half4 n, half4 nn) +{ + // difference in normals + half2 diff = abs(n.xy - nn.xy); + half sn = (diff.x + diff.y) < 0.1; + // difference in depth + float z = DecodeFloatRG (n.zw); + float zz = DecodeFloatRG (nn.zw); + float zdiff = abs(z-zz) * _ProjectionParams.z; + half sz = zdiff < 0.2; + return sn * sz; +} + + +half4 frag( v2f i ) : SV_Target +{ + #define NUM_BLUR_SAMPLES 4 + + float2 o = _TexelOffsetScale.xy; + + half sum = tex2D(_SSAO, i.uv).r * (NUM_BLUR_SAMPLES + 1); + half denom = NUM_BLUR_SAMPLES + 1; + + half4 geom = tex2D (_CameraDepthNormalsTexture, i.uv); + + for (int s = 0; s < NUM_BLUR_SAMPLES; ++s) + { + float2 nuv = i.uv + o * (s+1); + half4 ngeom = tex2D (_CameraDepthNormalsTexture, nuv.xy); + half coef = (NUM_BLUR_SAMPLES - s) * CheckSame (geom, ngeom); + sum += tex2D (_SSAO, nuv.xy).r * coef; + denom += coef; + } + for (int s = 0; s < NUM_BLUR_SAMPLES; ++s) + { + float2 nuv = i.uv - o * (s+1); + half4 ngeom = tex2D (_CameraDepthNormalsTexture, nuv.xy); + half coef = (NUM_BLUR_SAMPLES - s) * CheckSame (geom, ngeom); + sum += tex2D (_SSAO, nuv.xy).r * coef; + denom += coef; + } + return sum / denom; +} +ENDCG + } + + // ---- Composite pass + Pass { +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" + +struct v2f { + float4 pos : SV_POSITION; + float2 uv[2] : TEXCOORD0; +}; + +sampler2D _MainTex; +half4 _MainTex_ST; + +sampler2D _SSAO; +half4 _SSAO_ST; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv[0] = UnityStereoScreenSpaceUVAdjust(MultiplyUV (UNITY_MATRIX_TEXTURE0, v.texcoord), _MainTex_ST); + o.uv[1] = UnityStereoScreenSpaceUVAdjust(MultiplyUV (UNITY_MATRIX_TEXTURE1, v.texcoord), _SSAO_ST); + return o; +} + + +half4 frag( v2f i ) : SV_Target +{ + half4 c = tex2D (_MainTex, i.uv[0]); + half ao = tex2D (_SSAO, i.uv[1]).r; + ao = pow (ao, _Params.w); + c.rgb *= ao; + return c; +} +ENDCG + } + +} + +Fallback off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SSAOShader.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SSAOShader.shader.meta new file mode 100644 index 0000000..0e2cdcc --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SSAOShader.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 43ca18288c424f645aaa1e9e07f04c50 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceAmbientObscurance.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceAmbientObscurance.shader new file mode 100644 index 0000000..96bf50a --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceAmbientObscurance.shader @@ -0,0 +1,415 @@ + +// This Ambient Occlusion image effect is based on "Scalable Ambient Obscurance": + +/** + +\author Morgan McGuire and Michael Mara, NVIDIA and Williams College, http://research.nvidia.com, http://graphics.cs.williams.edu + +Open Source under the "BSD" license: http://www.opensource.org/licenses/bsd-license.php + +Copyright (c) 2011-2012, NVIDIA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +Shader "Hidden/ScreenSpaceAmbientObscurance" +{ + Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _AOTex("", 2D) = "" {} + _Rand("", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + #if defined(SHADER_API_D3D11) || defined(SHADER_API_GLCORE) + #define NUM_SAMPLES (15) + #else + #define NUM_SAMPLES (11) + #endif + + #define FAR_PLANE_Z (300.0) + #define NUM_SPIRAL_TURNS (7) + #define bias (0.01) + + float _Radius; + float _Radius2; // _Radius * _Radius; + float _Intensity; + float4 _ProjInfo; + float4 _ProjInfoLeft; + float4 _ProjInfoRight; + float4x4 _ProjectionInv; // ref only + + sampler2D_float _CameraDepthTexture; + sampler2D _Rand; + sampler2D _AOTex; + sampler2D _MainTex; + + float4 _MainTex_TexelSize; + half4 _MainTex_ST; + + half4 _AOTex_ST; + half4 _CameraDepthTexture_ST; + + static const float gaussian[5] = { 0.153170, 0.144893, 0.122649, 0.092902, 0.062970 }; // stddev = 2.0 + + float2 _Axis; + + /** Increase to make edges crisper. Decrease to reduce temporal flicker. */ + #define EDGE_SHARPNESS (1.0) + + float _BlurFilterDistance; + #define SCALE _BlurFilterDistance + + /** Filter _Radius in pixels. This will be multiplied by SCALE. */ + #define R (4) + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uv2 : TEXCOORD1; + }; + + v2f vert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.uv2 = v.texcoord.xy; + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + o.uv2.y = 1-o.uv2.y; + #endif + return o; + } + + float3 ReconstructCSPosition(float2 S, float z) + { + float linEyeZ = LinearEyeDepth(z); +#ifdef UNITY_SINGLE_PASS_STEREO + float4 projInfo = (unity_StereoEyeIndex == 0) ? _ProjInfoLeft : _ProjInfoRight; + return float3((S.xy * projInfo.xy + projInfo.zw) * linEyeZ, linEyeZ); +#else + return float3(( S.xy * _ProjInfo.xy + _ProjInfo.zw) * linEyeZ, linEyeZ); +#endif + + /* + // for reference + float4 clipPos = float4(S*2.0-1.0, (z*2-1), 1); + float4 viewPos; + viewPos.x = dot((float4)_ProjectionInv[0], clipPos); + viewPos.y = dot((float4)_ProjectionInv[1], clipPos); + viewPos.w = dot((float4)_ProjectionInv[3], clipPos); + viewPos.z = z; + viewPos = viewPos/viewPos.w; + return viewPos.xyz; + */ + } + + float3 ReconstructCSFaceNormal(float3 C) { + return normalize(cross(ddy(C), ddx(C))); + } + + + /** Returns a unit vector and a screen-space _Radius for the tap on a unit disk (the caller should scale by the actual disk _Radius) */ + + float2 TapLocation(int sampleNumber, float spinAngle, out float ssR){ + // Radius relative to ssR + float alpha = float(sampleNumber + 0.5) * (1.0 / NUM_SAMPLES); + float angle = alpha * (NUM_SPIRAL_TURNS * 6.28) + spinAngle; + + ssR = alpha; + return float2(cos(angle), sin(angle)); + } + + /** Used for packing Z into the GB channels */ + float CSZToKey(float z) { + return saturate(z * (1.0 / FAR_PLANE_Z)); + } + + /** Used for packing Z into the GB channels */ + void packKey(float key, out float2 p) { + // Round to the nearest 1/256.0 + float temp = floor(key * 256.0); + + // Integer part + p.x = temp * (1.0 / 256.0); + + // Fractional part + p.y = key * 256.0 - temp; + } + + /** Returns a number on (0, 1) */ + float UnpackKey(float2 p) + { + return p.x * (256.0 / 257.0) + p.y * (1.0 / 257.0); + } + + + /** Read the camera-space position of the point at screen-space pixel ssP */ + float3 GetPosition(float2 ssP) { + float3 P; + + P.z = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(ssP.xy, _CameraDepthTexture_ST)); + + // Offset to pixel center + P = ReconstructCSPosition(float2(ssP) /*+ float2(0.5, 0.5)*/, P.z); + return P; + } + + /** Read the camera-space position of the point at screen-space pixel ssP + unitOffset * ssR. Assumes length(unitOffset) == 1 */ + float3 GetOffsetPosition(float2 ssC, float2 unitOffset, float ssR) + { + float2 ssP = saturate(float2(ssR*unitOffset) + ssC); + + float3 P; + P.z = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(ssP.xy, _CameraDepthTexture_ST)); + + // Offset to pixel center + P = ReconstructCSPosition(float2(ssP)/* + float2(0.5, 0.5)*/, P.z); + + return P; + } + + /** Compute the occlusion due to sample with index \a i about the pixel at \a ssC that corresponds + to camera-space point \a C with unit normal \a n_C, using maximum screen-space sampling _Radius \a ssDiskRadius */ + + float SampleAO(in float2 ssC, in float3 C, in float3 n_C, in float ssDiskRadius, in int tapIndex, in float randomPatternRotationAngle) + { + // Offset on the unit disk, spun for this pixel + float ssR; + float2 unitOffset = TapLocation(tapIndex, randomPatternRotationAngle, ssR); + ssR *= ssDiskRadius; + + // The occluding point in camera space + float3 Q = GetOffsetPosition(ssC, unitOffset, ssR); + + float3 v = Q - C; + + float vv = dot(v, v); + float vn = dot(v, n_C); + + const float epsilon = 0.01; + float f = max(_Radius2 - vv, 0.0); + return f * f * f * max((vn - bias) / (epsilon + vv), 0.0); + } + + float4 fragAO(v2f i) : SV_Target + { + float4 fragment = fixed4(1,1,1,1); + + // Pixel being shaded + float2 ssC = i.uv2.xy;// * _MainTex_TexelSize.zw; + + // View space point being shaded + float3 C = GetPosition(ssC); + + //return abs(float4(C.xyz,0)); + //if(abs(C.z)<0.31) + // return 1; + //return abs(C.z); + + packKey(CSZToKey(C.z), fragment.gb); + //packKey(CSZToKey(C.z), bilateralKey); + + float randomPatternRotationAngle = 1.0; + #if defined(SHADER_API_D3D11) || defined(SHADER_API_GLCORE) + int2 ssCInt = ssC.xy * _MainTex_TexelSize.zw; + randomPatternRotationAngle = frac(sin(dot(i.uv, float2(12.9898, 78.233))) * 43758.5453) * 1000.0; + #else + // TODO: make dx9 rand better + randomPatternRotationAngle = tex2D(_Rand, i.uv*12.0).x * 1000.0; + #endif + + // Reconstruct normals from positions. These will lead to 1-pixel black lines + // at depth discontinuities, however the blur will wipe those out so they are not visible + // in the final image. + float3 n_C = ReconstructCSFaceNormal(C); + + //return float4((n_C),0); + + // Choose the screen-space sample _Radius + // proportional to the projected area of the sphere + float ssDiskRadius = -_Radius / C.z; // -projScale * _Radius / C.z; // <::::: + + float sum = 0.0; + for (int l = 0; l < NUM_SAMPLES; ++l) { + sum += SampleAO(ssC, C, n_C, (ssDiskRadius), l, randomPatternRotationAngle); + } + + float temp = _Radius2 * _Radius; + sum /= temp * temp; + + float A = max(0.0, 1.0 - sum * _Intensity * (5.0 / NUM_SAMPLES)); + fragment.ra = float2(A,A); + + return fragment; + } + + float4 fragUpsample (v2f i) : SV_Target + { + float4 fragment = fixed4(1,1,1,1); + + // View space point being shaded + float3 C = GetPosition(i.uv.xy); + + packKey(CSZToKey(C.z), fragment.gb); + fragment.ra = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)).ra; + + return fragment; + } + + float4 fragApply (v2f i) : SV_Target + { + float4 ao = tex2D(_AOTex, UnityStereoScreenSpaceUVAdjust(i.uv2.xy, _AOTex_ST)); + return tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)) * ao.rrrr; + } + + float4 fragApplySoft (v2f i) : SV_Target + { + float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + + float ao = tex2D(_AOTex, UnityStereoScreenSpaceUVAdjust(i.uv2.xy, _AOTex_ST)).r; + ao += tex2D(_AOTex, UnityStereoScreenSpaceUVAdjust(i.uv2.xy, _AOTex_ST) + _MainTex_TexelSize.xy * 0.75).r; + ao += tex2D(_AOTex, UnityStereoScreenSpaceUVAdjust(i.uv2.xy, _AOTex_ST) - _MainTex_TexelSize.xy * 0.75).r; + ao += tex2D(_AOTex, UnityStereoScreenSpaceUVAdjust(i.uv2.xy, _AOTex_ST) + _MainTex_TexelSize.xy * float2(-0.75,0.75)).r; + ao += tex2D(_AOTex, UnityStereoScreenSpaceUVAdjust(i.uv2.xy, _AOTex_ST) - _MainTex_TexelSize.xy * float2(-0.75,0.75)).r; + + return color * float4(ao,ao,ao,5)/5; + } + + float4 fragBlurBL (v2f i) : SV_Target + { + float4 fragment = float4(1,1,1,1); + + float2 ssC = UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST); + + float4 temp = tex2Dlod(_MainTex, float4(UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST),0,0)); + + float2 passthrough2 = temp.gb; + float key = UnpackKey(passthrough2); + + float sum = temp.r; + + /* + if (key >= 0.999) { + // Sky pixel (if you aren't using depth keying, disable this test) + fragment.gb = passthrough2; + return fragment; + } + */ + + // Base weight for depth falloff. Increase this for more blurriness, decrease it for better edge discrimination + + float BASE = gaussian[0] * 0.5; // ole: i decreased + float totalWeight = BASE; + sum *= totalWeight; + + for (int r = -R; r <= R; ++r) { + // We already handled the zero case above. This loop should be unrolled and the branch discarded + if (r != 0) { + temp = tex2Dlod(_MainTex, float4(ssC + _Axis * _MainTex_TexelSize.xy * (r * SCALE),0,0) ); + float tapKey = UnpackKey(temp.gb); + float value = temp.r; + + // spatial domain: offset gaussian tap + float weight = 0.3 + gaussian[abs(r)]; + + // range domain (the "bilateral" weight). As depth difference increases, decrease weight. + weight *= max(0.0, 1.0 - (2000.0 * EDGE_SHARPNESS) * abs(tapKey - key)); + + sum += value * weight; + totalWeight += weight; + } + } + + const float epsilon = 0.0001; + fragment = sum / (totalWeight + epsilon); + + fragment.gb = passthrough2; + + return fragment; + } + + ENDCG + +SubShader { + + // 0: get ao + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragAO + #pragma target 3.0 + + ENDCG + } + + // 1: bilateral blur + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragBlurBL + #pragma target 3.0 + + ENDCG + } + + // 2: apply ao + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragApply + #pragma target 3.0 + + ENDCG + } + + // 3: apply with a slight box filter + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragApplySoft + #pragma target 3.0 + + ENDCG + } + + // 4: in case you want to blur in high rez for nicer z borders + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragUpsample + #pragma target 3.0 + + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceAmbientObscurance.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceAmbientObscurance.shader.meta new file mode 100644 index 0000000..dbe9a72 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceAmbientObscurance.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 95616c020c5604dda96cf76afbbc0272 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceRaytrace.cginc b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceRaytrace.cginc new file mode 100644 index 0000000..5397f38 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceRaytrace.cginc @@ -0,0 +1,261 @@ +/** +\author Michael Mara and Morgan McGuire, Casual Effects. 2015. +*/ + +#ifndef SCREEN_SPACE_RAYTRACE_INCLUDED +#define SCREEN_SPACE_RAYTRACE_INCLUDED + + +sampler2D_float _CameraDepthTexture; + + +float distanceSquared(float2 A, float2 B) { + A -= B; + return dot(A, A); +} + +float distanceSquared(float3 A, float3 B) { + A -= B; + return dot(A, A); +} + +void swap(inout float v0, inout float v1) { + float temp = v0; + v0 = v1; + v1 = temp; +} + + +bool isIntersecting(float rayZMin, float rayZMax, float sceneZ, float layerThickness) { + return (rayZMax >= sceneZ - layerThickness) && (rayZMin <= sceneZ); +} + +void rayIterations(inout float2 P, inout float stepDirection, inout float end, inout int stepCount, inout int maxSteps, inout bool intersecting, + inout float sceneZ, inout float2 dP, inout float3 Q, inout float3 dQ, inout float k, inout float dk, + inout float rayZMin, inout float rayZMax, inout float prevZMaxEstimate, inout bool permute, inout float2 hitPixel, + inout float2 invSize, inout float layerThickness) { + + UNITY_LOOP + for (; + ( (P.x * stepDirection) <= end) && + (stepCount < maxSteps) && + (!intersecting); + P += dP, Q.z += dQ.z, k += dk, stepCount += 1) { + + // The depth range that the ray covers within this loop iteration. + // Assume that the ray is moving in increasing z and swap if backwards. + rayZMin = prevZMaxEstimate; + //rayZMin = (dQ.z * -0.5 + Q.z) / (dk * -0.5 + k); + // Compute the value at 1/2 pixel into the future + rayZMax = (dQ.z * 0.5 + Q.z) / (dk * 0.5 + k); + prevZMaxEstimate = rayZMax; + if (rayZMin > rayZMax) { swap(rayZMin, rayZMax); } + + // Undo the homogeneous operation to obtain the camera-space + // Q at each point + hitPixel = permute ? P.yx : P; + + sceneZ = tex2Dlod(_CameraDepthTexture, float4(hitPixel * invSize,0,0)).r; + sceneZ = -LinearEyeDepth(sceneZ); + + intersecting = isIntersecting(rayZMin, rayZMax, sceneZ, layerThickness); + + } // pixel on ray + P -= dP, Q.z -= dQ.z, k -= dk; +} + +/** + \param csOrigin must have z < -0.01, and project within the valid screen rectangle + \param stepRate Set to 1.0 by default, higher to step faster + */ +bool castDenseScreenSpaceRay + (float3 csOrigin, + float3 csDirection, + float4x4 projectToPixelMatrix, + float2 csZBufferSize, + float3 clipInfo, + float jitterFraction, + int maxSteps, + float layerThickness, + float maxRayTraceDistance, + out float2 hitPixel, + int stepRate, + bool refine, + out float3 csHitPoint, + out float stepCount) { + + float2 invSize = float2(1.0 / csZBufferSize.x, 1.0 / csZBufferSize.y); + + // Initialize to off screen + hitPixel = float2(-1, -1); + + float nearPlaneZ = -0.01; + // Clip ray to a near plane in 3D (doesn't have to be *the* near plane, although that would be a good idea) + float rayLength = ((csOrigin.z + csDirection.z * maxRayTraceDistance) > nearPlaneZ) ? + ((nearPlaneZ - csOrigin.z) / csDirection.z) : + maxRayTraceDistance; + + float3 csEndPoint = csDirection * rayLength + csOrigin; + + // Project into screen space + // This matrix has a lot of zeroes in it. We could expand + // out these multiplies to avoid multiplying by zero + // ...but 16 MADDs are not a big deal compared to what's ahead + float4 H0 = mul(projectToPixelMatrix, float4(csOrigin, 1.0)); + float4 H1 = mul(projectToPixelMatrix, float4(csEndPoint, 1.0)); + + // There are a lot of divisions by w that can be turned into multiplications + // at some minor precision loss...and we need to interpolate these 1/w values + // anyway. + // + // Because the caller was required to clip to the near plane, + // this homogeneous division (projecting from 4D to 2D) is guaranteed + // to succeed. + float k0 = 1.0 / H0.w; + float k1 = 1.0 / H1.w; + + // Screen-space endpoints + float2 P0 = H0.xy * k0; + float2 P1 = H1.xy * k1; + + // Switch the original points to values that interpolate linearly in 2D: + float3 Q0 = csOrigin * k0; + float3 Q1 = csEndPoint * k1; + +#if 1 // Clipping to the screen coordinates. We could simply modify maxSteps instead + float yMax = csZBufferSize.y - 0.5; + float yMin = 0.5; + float xMax = csZBufferSize.x - 0.5; + float xMin = 0.5; + + // 2D interpolation parameter + float alpha = 0.0; + // P0 must be in bounds + if (P1.y > yMax || P1.y < yMin) { + float yClip = (P1.y > yMax) ? yMax : yMin; + float yAlpha = (P1.y - yClip) / (P1.y - P0.y); // Denominator is not zero, since P0 != P1 (or P0 would have been clipped!) + alpha = yAlpha; + } + + // P0 must be in bounds + if (P1.x > xMax || P1.x < xMin) { + float xClip = (P1.x > xMax) ? xMax : xMin; + float xAlpha = (P1.x - xClip) / (P1.x - P0.x); // Denominator is not zero, since P0 != P1 (or P0 would have been clipped!) + alpha = max(alpha, xAlpha); + } + + // These are all in homogeneous space, so they interpolate linearly + P1 = lerp(P1, P0, alpha); + k1 = lerp(k1, k0, alpha); + Q1 = lerp(Q1, Q0, alpha); +#endif + + // We're doing this to avoid divide by zero (rays exactly parallel to an eye ray) + P1 = (distanceSquared(P0, P1) < 0.0001) ? P0 + float2(0.01, 0.01) : P1; + + float2 delta = P1 - P0; + + // Assume horizontal + bool permute = false; + if (abs(delta.x) < abs(delta.y)) { + // More-vertical line. Create a permutation that swaps x and y in the output + permute = true; + + // Directly swizzle the inputs + delta = delta.yx; + P1 = P1.yx; + P0 = P0.yx; + } + + // From now on, "x" is the primary iteration direction and "y" is the secondary one + + float stepDirection = sign(delta.x); + float invdx = stepDirection / delta.x; + float2 dP = float2(stepDirection, invdx * delta.y); + + // Track the derivatives of Q and k + float3 dQ = (Q1 - Q0) * invdx; + float dk = (k1 - k0) * invdx; + + dP *= stepRate; + dQ *= stepRate; + dk *= stepRate; + + P0 += dP * jitterFraction; + Q0 += dQ * jitterFraction; + k0 += dk * jitterFraction; + + // Slide P from P0 to P1, (now-homogeneous) Q from Q0 to Q1, and k from k0 to k1 + float3 Q = Q0; + float k = k0; + + // We track the ray depth at +/- 1/2 pixel to treat pixels as clip-space solid + // voxels. Because the depth at -1/2 for a given pixel will be the same as at + // +1/2 for the previous iteration, we actually only have to compute one value + // per iteration. + float prevZMaxEstimate = csOrigin.z; + stepCount = 0.0; + float rayZMax = prevZMaxEstimate, rayZMin = prevZMaxEstimate; + float sceneZ = 100000; + + // P1.x is never modified after this point, so pre-scale it by + // the step direction for a signed comparison + float end = P1.x * stepDirection; + + bool intersecting = isIntersecting(rayZMin, rayZMax, sceneZ, layerThickness); + // We only advance the z field of Q in the inner loop, since + // Q.xy is never used until after the loop terminates + + //int rayIterations = min(maxSteps, stepsToGetOffscreen); + + + float2 P = P0; + + int originalStepCount = 0; + rayIterations(P, stepDirection, end, originalStepCount, maxSteps, intersecting, + sceneZ, dP, Q, dQ, k, dk, + rayZMin, rayZMax, prevZMaxEstimate, permute, hitPixel, + invSize, layerThickness); + + + stepCount = originalStepCount; + if (refine && intersecting && stepRate > 1) { + + + // We're going back a step. + P -= dP, Q.z -= dQ.z, k -= dk; + prevZMaxEstimate = Q.z / k; + rayZMin = prevZMaxEstimate; + rayZMax = prevZMaxEstimate; + + intersecting = false; + int refinementStepCount = 0; + int refinementMaxSteps = stepRate; + + float refinementConstant = 1.0 / stepRate; + dQ.z *= refinementConstant; + dP *= refinementConstant; + dk *= refinementConstant; + + // Refinement + rayIterations(P, stepDirection, end, refinementStepCount, refinementMaxSteps, intersecting, + sceneZ, dP, Q, dQ, k, dk, + rayZMin, rayZMax, prevZMaxEstimate, permute, hitPixel, + invSize, layerThickness); + stepCount += refinementStepCount * refinementConstant - 1.0; + //stepCount = refinementStepCount; + intersecting = true; + } + + + // Loop only advanced the Z component. Now that we know where we are going + // update xy + Q.xy += dQ.xy * stepCount; + // Q is a vector, so we are trying to get by with 1 division instead of 3. + csHitPoint = Q * (1.0 / k); + + return intersecting; +} + + +#endif // SCREEN_SPACE_RAYTRACE_INCLUDED diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceRaytrace.cginc.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceRaytrace.cginc.meta new file mode 100644 index 0000000..3a1c551 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ScreenSpaceRaytrace.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 26c67b7245085cf438e3d42d50d94f55 +timeCreated: 1425661779 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SepiaToneEffect.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SepiaToneEffect.shader new file mode 100644 index 0000000..692e676 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SepiaToneEffect.shader @@ -0,0 +1,39 @@ +Shader "Hidden/Sepiatone Effect" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert_img +#pragma fragment frag +#include "UnityCG.cginc" + +uniform sampler2D _MainTex; +half4 _MainTex_ST; + +fixed4 frag (v2f_img i) : SV_Target +{ + fixed4 original = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + + // get intensity value (Y part of YIQ color space) + fixed Y = dot (fixed3(0.299, 0.587, 0.114), original.rgb); + + // Convert to Sepia Tone by adding constant + fixed4 sepiaConvert = float4 (0.191, -0.054, -0.221, 0.0); + fixed4 output = sepiaConvert + Y; + output.a = original.a; + + return output; +} +ENDCG + + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SepiaToneEffect.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SepiaToneEffect.shader.meta new file mode 100644 index 0000000..34528f5 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SepiaToneEffect.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: b6aa781cad112c75d0008dfa8d76c639 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/ShowAlphaChannel.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ShowAlphaChannel.shader new file mode 100644 index 0000000..e321197 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ShowAlphaChannel.shader @@ -0,0 +1,54 @@ + + +Shader "Hidden/ShowAlphaChannel" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _EdgeTex ("_EdgeTex", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +uniform sampler2D _MainTex; +uniform sampler2D _EdgeTex; + +uniform float4 _MainTex_TexelSize; + +float filterRadius; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +v2f vert( appdata_img v ) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + + return o; +} + +half4 frag (v2f i) : SV_Target +{ + + half4 color = tex2D(_MainTex, i.uv.xy); + half edges = color.a; + + return edges; +} +ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/ShowAlphaChannel.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ShowAlphaChannel.shader.meta new file mode 100644 index 0000000..37d3f86 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/ShowAlphaChannel.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: da310021e2a4142429d95c537846dc38 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SimpleClear.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SimpleClear.shader new file mode 100644 index 0000000..009611c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SimpleClear.shader @@ -0,0 +1,41 @@ + + +Shader "Hidden/SimpleClear" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" + +uniform sampler2D _MainTex; +uniform float4 _MainTex_TexelSize; + +struct v2f { + float4 pos : SV_POSITION; +}; + +v2f vert( appdata_img v ) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + return o; +} + +half4 frag (v2f i) : SV_Target +{ + return half4(0,0,0,0); +} +ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SimpleClear.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SimpleClear.shader.meta new file mode 100644 index 0000000..eba30cb --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SimpleClear.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: f688f89ed5eb847c5b19c934a0f1e772 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SunShaftsComposite.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SunShaftsComposite.shader new file mode 100644 index 0000000..fc7b379 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SunShaftsComposite.shader @@ -0,0 +1,227 @@ +Shader "Hidden/SunShaftsComposite" { + Properties { + _MainTex ("Base", 2D) = "" {} + _ColorBuffer ("Color", 2D) = "" {} + _Skybox ("Skybox", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + #if UNITY_UV_STARTS_AT_TOP + float2 uv1 : TEXCOORD1; + #endif + }; + + struct v2f_radial { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 blurVector : TEXCOORD1; + }; + + sampler2D _MainTex; + sampler2D _ColorBuffer; + sampler2D _Skybox; + sampler2D_float _CameraDepthTexture; + + uniform half4 _SunThreshold; + + uniform half4 _SunColor; + uniform half4 _BlurRadius4; + uniform half4 _SunPosition; + uniform half4 _MainTex_TexelSize; + half4 _MainTex_ST; + half4 _ColorBuffer_ST; + half4 _Skybox_ST; + half4 _CameraDepthTexture_ST; + + + #define SAMPLES_FLOAT 6.0f + #define SAMPLES_INT 6 + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + o.uv1 = v.texcoord.xy; + if (_MainTex_TexelSize.y < 0) + o.uv1.y = 1-o.uv1.y; + #endif + + return o; + } + + half4 fragScreen(v2f i) : SV_Target { + half4 colorA = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + #if UNITY_UV_STARTS_AT_TOP + half4 colorB = tex2D (_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _ColorBuffer_ST)); + #else + half4 colorB = tex2D (_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _ColorBuffer_ST)); + #endif + half4 depthMask = saturate (colorB * _SunColor); + return 1.0f - (1.0f-colorA) * (1.0f-depthMask); + } + + half4 fragAdd(v2f i) : SV_Target { + half4 colorA = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + #if UNITY_UV_STARTS_AT_TOP + half4 colorB = tex2D (_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _ColorBuffer_ST)); + #else + half4 colorB = tex2D (_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _ColorBuffer_ST)); + #endif + half4 depthMask = saturate (colorB * _SunColor); + return colorA + depthMask; + } + + v2f_radial vert_radial( appdata_img v ) { + v2f_radial o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv.xy = v.texcoord.xy; + o.blurVector = (_SunPosition.xy - v.texcoord.xy) * _BlurRadius4.xy; + + return o; + } + + half4 frag_radial(v2f_radial i) : SV_Target + { + half4 color = half4(0,0,0,0); + for(int j = 0; j < SAMPLES_INT; j++) + { + half4 tmpColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + color += tmpColor; + i.uv.xy += i.blurVector; + } + return color / SAMPLES_FLOAT; + } + + half TransformColor (half4 skyboxValue) { + return dot(max(skyboxValue.rgb - _SunThreshold.rgb, half3(0,0,0)), half3(1,1,1)); // threshold and convert to greyscale + } + + half4 frag_depth (v2f i) : SV_Target { + #if UNITY_UV_STARTS_AT_TOP + float depthSample = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _CameraDepthTexture_ST)); + #else + float depthSample = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _CameraDepthTexture_ST)); + #endif + + half4 tex = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + + depthSample = Linear01Depth (depthSample); + + // consider maximum radius + #if UNITY_UV_STARTS_AT_TOP + half2 vec = _SunPosition.xy - i.uv1.xy; + #else + half2 vec = _SunPosition.xy - i.uv.xy; + #endif + half dist = saturate (_SunPosition.w - length (vec.xy)); + + half4 outColor = 0; + + // consider shafts blockers + if (depthSample > 0.99) + outColor = TransformColor (tex) * dist; + + return outColor; + } + + half4 frag_nodepth (v2f i) : SV_Target { + #if UNITY_UV_STARTS_AT_TOP + float4 sky = (tex2D (_Skybox, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _Skybox_ST))); + #else + float4 sky = (tex2D (_Skybox, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _Skybox_ST))); + #endif + + float4 tex = (tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST))); + + // consider maximum radius + #if UNITY_UV_STARTS_AT_TOP + half2 vec = _SunPosition.xy - i.uv1.xy; + #else + half2 vec = _SunPosition.xy - i.uv.xy; + #endif + half dist = saturate (_SunPosition.w - length (vec)); + + half4 outColor = 0; + + // find unoccluded sky pixels + // consider pixel values that differ significantly between framebuffer and sky-only buffer as occluded + if (Luminance ( abs(sky.rgb - tex.rgb)) < 0.2) + outColor = TransformColor (sky) * dist; + + return outColor; + } + + + + ENDCG + +Subshader { + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragScreen + + ENDCG + } + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert_radial + #pragma fragment frag_radial + + ENDCG + } + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag_depth + + ENDCG + } + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag_nodepth + + ENDCG + } + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragAdd + + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/SunShaftsComposite.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SunShaftsComposite.shader.meta new file mode 100644 index 0000000..82a0680 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/SunShaftsComposite.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: d3b1c8c1036784176946f5cfbfb7fe4c +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/Tonemapper.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/Tonemapper.shader new file mode 100644 index 0000000..e58f4ce --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/Tonemapper.shader @@ -0,0 +1,355 @@ +Shader "Hidden/Tonemapper" { + Properties { + _MainTex ("", 2D) = "black" {} + _SmallTex ("", 2D) = "grey" {} + _Curve ("", 2D) = "black" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + sampler2D _SmallTex; + sampler2D _Curve; + + float4 _HdrParams; + float2 intensity; + float4 _MainTex_TexelSize; + half4 _MainTex_ST; + float _AdaptionSpeed; + float _ExposureAdjustment; + float _RangeScale; + + v2f vert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + return o; + } + + float4 fragLog(v2f i) : SV_Target + { + const float EPSILON = 1e-4h; + + float fLogLumSum = 0.0f; + + fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); + fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); + fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); + fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); + + float avg = fLogLumSum / 4.0; + return float4(avg, avg, avg, avg); + } + + float4 fragExp(v2f i) : SV_Target + { + float2 lum = float2(0.0f, 0.0f); + + lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; + lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; + lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; + lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; + + lum = exp(lum / 4.0f); + + return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); + } + + float3 ToCIE(float3 FullScreenImage) + { + // RGB -> XYZ conversion + // http://www.w3.org/Graphics/Color/sRGB + // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) + // 0.4125 0.3576 0.1805 + // 0.2126 0.7152 0.0722 + // 0.0193 0.1192 0.9505 + + float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; + + float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); + + // XYZ -> Yxy conversion + + float3 Yxy; + + Yxy.r = XYZ.g; + + // x = X / (X + Y + Z) + // y = X / (X + Y + Z) + + float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); + + Yxy.gb = XYZ.rg / temp; + + return Yxy; + } + + float3 FromCIE(float3 Yxy) + { + float3 XYZ; + // Yxy -> XYZ conversion + XYZ.r = Yxy.r * Yxy.g / Yxy. b; + + // X = Y * x / y + XYZ.g = Yxy.r; + + // copy luminance Y + XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; + + // Z = Y * (1-x-y) / y + + // XYZ -> RGB conversion + // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) + // 3.2410 -1.5374 -0.4986 + // -0.9692 1.8760 0.0416 + // 0.0556 -0.2040 1.0570 + + float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; + + return mul(XYZ2RGB, XYZ); + } + + // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but + // scale with the OUT/IN luminance ratio,this is sooooo much faster + + float4 fragAdaptive(v2f i) : SV_Target + { + float avgLum = tex2D(_SmallTex, i.uv).x; + float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + + float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); + + float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); + + lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); + + //cie.r = lumScaled; + + color.rgb = color.rgb * (lumScaled / cieLum); + + //color.rgb = FromCIE(cie); + return color; + } + + float4 fragAdaptiveAutoWhite(v2f i) : SV_Target + { + float2 avgLum = tex2D(_SmallTex, i.uv).xy; + float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + + float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); + + float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); + + lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); + + //cie.r = lumScaled; + + color.rgb = color.rgb * (lumScaled / cieLum); + + //color.rgb = FromCIE(cie); + return color; + } + + float4 fragCurve(v2f i) : SV_Target + { + float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + float3 cie = ToCIE(color.rgb); + + // Remap to new lum range + float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; + cie.r = newLum; + color.rgb = FromCIE(cie); + + return color; + } + + float4 fragHable(v2f i) : SV_Target + { + const float A = 0.15; + const float B = 0.50; + const float C = 0.10; + const float D = 0.20; + const float E = 0.02; + const float F = 0.30; + const float W = 11.2; + + float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; + texColor *= _ExposureAdjustment; + + float ExposureBias = 2.0; + float3 x = ExposureBias*texColor; + float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; + + x = W; + float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); + float3 color = curr*whiteScale; + + // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage + + return float4(color, 1.0); + } + + // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) + float4 fragSimpleReinhard(v2f i) : SV_Target + { + float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + float lum = Luminance(texColor.rgb); + float lumTm = lum * _ExposureAdjustment; + float scale = lumTm / (1+lumTm); + return float4(texColor.rgb * scale / lum, texColor.a); + } + + float4 fragOptimizedHejiDawson(v2f i) : SV_Target + { + float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + texColor *= _ExposureAdjustment; + float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); + float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); + return retColor*retColor; + } + + float4 fragPhotographic(v2f i) : SV_Target + { + float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + return 1-exp2(-_ExposureAdjustment * texColor); + } + + float4 fragDownsample(v2f i) : SV_Target + { + float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); + float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); + float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); + float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); + + float4 average = (tapA+tapB+tapC+tapD)/4; + average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); + + return average; + } + + ENDCG + +Subshader { + // adaptive reinhhard apply + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAdaptive + ENDCG + } + + // 1 + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragLog + ENDCG + } + // 2 + Pass { + ZTest Always Cull Off ZWrite Off + Blend SrcAlpha OneMinusSrcAlpha + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragExp + ENDCG + } + // 3 + Pass { + ZTest Always Cull Off ZWrite Off + + Blend Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragExp + ENDCG + } + + // 4 user controllable tonemap curve + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragCurve + ENDCG + } + + // 5 tonemapping in uncharted + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragHable + ENDCG + } + + // 6 simple tonemapping based reinhard + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragSimpleReinhard + ENDCG + } + + // 7 OptimizedHejiDawson + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragOptimizedHejiDawson + ENDCG + } + + // 8 Photographic + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragPhotographic + ENDCG + } + + // 9 Downsample with auto white detection + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragDownsample + ENDCG + } + + // 10 adaptive reinhhard apply with auto white + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAdaptiveAutoWhite + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/Tonemapper.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/Tonemapper.shader.meta new file mode 100644 index 0000000..370e284 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/Tonemapper.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 003377fc2620a44939dadde6fe3f8190 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/TwirlEffect.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/TwirlEffect.shader new file mode 100644 index 0000000..b4201a5 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/TwirlEffect.shader @@ -0,0 +1,53 @@ +Shader "Hidden/Twirt Effect Shader" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" + +uniform sampler2D _MainTex; +uniform float4 _MainTex_TexelSize; +half4 _MainTex_ST; +uniform float4 _CenterRadius; +uniform float4x4 _RotationMatrix; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +v2f vert( appdata_img v ) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord - _CenterRadius.xy; + return o; +} + +float4 frag (v2f i) : SV_Target +{ + float2 offset = i.uv; + float2 distortedOffset = MultiplyUV (_RotationMatrix, offset.xy); + float2 tmp = offset / _CenterRadius.zw; + float t = min (1, length(tmp)); + + offset = lerp (distortedOffset, offset, t); + offset += _CenterRadius.xy; + + return tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(offset, _MainTex_ST)); +} +ENDCG + + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/TwirlEffect.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/TwirlEffect.shader.meta new file mode 100644 index 0000000..a11709f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/TwirlEffect.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 641b781cad112c75d0008dfa8d76c639 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/VignettingShader.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VignettingShader.shader new file mode 100644 index 0000000..d215697 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VignettingShader.shader @@ -0,0 +1,71 @@ +Shader "Hidden/Vignetting" { + Properties { + _MainTex ("Base", 2D) = "white" {} + _VignetteTex ("Vignette", 2D) = "white" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uv2 : TEXCOORD1; + }; + + sampler2D _MainTex; + sampler2D _VignetteTex; + + half _Intensity; + half _Blur; + + float4 _MainTex_TexelSize; + half4 _MainTex_ST; + half4 _VignetteTex_ST; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + o.uv2 = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + o.uv2.y = 1.0 - o.uv2.y; + #endif + + return o; + } + + half4 frag(v2f i) : SV_Target { + half2 coords = i.uv; + half2 uv = i.uv; + + coords = (coords - 0.5) * 2.0; + half coordDot = dot (coords,coords); + half4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST)); + + float mask = 1.0 - coordDot * _Intensity; + + half4 colorBlur = tex2D (_VignetteTex, UnityStereoScreenSpaceUVAdjust(i.uv2, _VignetteTex_ST)); + color = lerp (color, colorBlur, saturate (_Blur * coordDot)); + + return color * mask; + } + + ENDCG + +Subshader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } +} + +Fallback off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/VignettingShader.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VignettingShader.shader.meta new file mode 100644 index 0000000..2ecd872 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VignettingShader.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 627943dc7a9a74286b70a4f694a0acd5 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/VortexEffect.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VortexEffect.shader new file mode 100644 index 0000000..ef0e93a --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VortexEffect.shader @@ -0,0 +1,65 @@ +Shader "Hidden/Twist Effect" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader +{ + Pass + { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +uniform sampler2D _MainTex; + +uniform float4 _MainTex_ST; + +uniform float4 _MainTex_TexelSize; +uniform float _Angle; +uniform float4 _CenterRadius; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uvOrig : TEXCOORD1; +}; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + float2 uv = v.texcoord.xy - _CenterRadius.xy; + o.uv = TRANSFORM_TEX(uv, _MainTex); //MultiplyUV (UNITY_MATRIX_TEXTURE0, uv); + o.uvOrig = uv; + return o; +} + +float4 frag (v2f i) : SV_Target +{ + float2 offset = i.uvOrig; + float angle = 1.0 - length(offset / _CenterRadius.zw); + angle = max (0, angle); + angle = angle * angle * _Angle; + float cosLength, sinLength; + sincos (angle, sinLength, cosLength); + + float2 uv; + uv.x = cosLength * offset[0] - sinLength * offset[1]; + uv.y = sinLength * offset[0] + cosLength * offset[1]; + uv += _CenterRadius.xy; + + return tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST)); +} +ENDCG + + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/VortexEffect.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VortexEffect.shader.meta new file mode 100644 index 0000000..78ded6f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/VortexEffect.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 708b781cad112c75d0008dfa8d76c639 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing.meta new file mode 100644 index 0000000..34cabb7 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6d55b5e91b95c41739cdf4f804dd383d diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/DLAA.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/DLAA.shader new file mode 100644 index 0000000..b81ab50 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/DLAA.shader @@ -0,0 +1,345 @@ + +// +// modified and adapted DLAA code based on Dmitry Andreev's +// Directionally Localized Anti-Aliasing (DLAA) +// +// as seen in "The Force Unleashed 2" +// + +Shader "Hidden/DLAA" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +CGINCLUDE + + #include "UnityCG.cginc" + + uniform sampler2D _MainTex; + uniform float4 _MainTex_TexelSize; + half4 _MainTex_ST; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + #define LD( o, dx, dy ) o = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(texCoord + float2( dx, dy ) * _MainTex_TexelSize.xy, _MainTex_ST) ); + + float GetIntensity( float3 col ) + { + return dot( col, float3( 0.33f, 0.33f, 0.33f ) ); + } + + float4 highPassPre( float2 texCoord ) + { + LD(float4 sCenter, 0.0,0.0) + LD(float4 sUpLeft, -1.0,-1.0) + LD(float4 sUpRight, 1.0,-1.0) + LD(float4 sDownLeft, -1.0,1.0) + LD(float4 sDownRight, 1.0,1.0) + + float4 diff = 4.0f * abs( (sUpLeft + sUpRight + sDownLeft + sDownRight) - 4.0f * sCenter ); + float edgeMask = GetIntensity(diff.xyz); + + return float4(sCenter.rgb, edgeMask); + } + + // Softer (5-pixel wide high-pass) + /* + void HighPassEdgeHV (out float4 edge_h, out float4 edge_v, float4 center, float4 w_h, float4 w_v, float2 texCoord) { + edge_h = abs( w_h - 4.0f * center ) / 4.0f; + edge_v = abs( w_v - 4.0f * center ) / 4.0f; + } + + // Sharper (3-pixel wide high-pass) + void EdgeHV (out float4 edge_h, out float4 edge_v, float4 center, float2 texCoord) { + float4 left, right, top, bottom; + + LD( left, -1, 0 ) + LD( right, 1, 0 ) + LD( top, 0, -1 ) + LD( bottom, 0, 1 ) + + edge_h = abs( left + right - 2.0f * center ) / 2.0f; + edge_v = abs( top + bottom - 2.0f * center ) / 2.0f; + } + */ + + float4 edgeDetectAndBlur( float2 texCoord ) + { + float lambda = 3.0f; + float epsilon = 0.1f; + + // + // Short Edges + // + + float4 center, left_01, right_01, top_01, bottom_01; + + // sample 5x5 cross + LD( center, 0, 0 ) + LD( left_01, -1.5, 0 ) + LD( right_01, 1.5, 0 ) + LD( top_01, 0,-1.5 ) + LD( bottom_01, 0, 1.5 ) + + + float4 w_h = 2.0f * ( left_01 + right_01 ); + float4 w_v = 2.0f * ( top_01 + bottom_01 ); + + + // Softer (5-pixel wide high-pass) + float4 edge_h = abs( w_h - 4.0f * center ) / 4.0f; + float4 edge_v = abs( w_v - 4.0f * center ) / 4.0f; + + + float4 blurred_h = ( w_h + 2.0f * center ) / 6.0f; + float4 blurred_v = ( w_v + 2.0f * center ) / 6.0f; + + float edge_h_lum = GetIntensity( edge_h.xyz ); + float edge_v_lum = GetIntensity( edge_v.xyz ); + float blurred_h_lum = GetIntensity( blurred_h.xyz ); + float blurred_v_lum = GetIntensity( blurred_v.xyz ); + + float edge_mask_h = saturate( ( lambda * edge_h_lum - epsilon ) / blurred_v_lum ); + float edge_mask_v = saturate( ( lambda * edge_v_lum - epsilon ) / blurred_h_lum ); + + float4 clr = center; + clr = lerp( clr, blurred_h, edge_mask_v ); + clr = lerp( clr, blurred_v, edge_mask_h ); // blurrier version + + // + // Long Edges + // + + float4 h0, h1, h2, h3, h4, h5, h6, h7; + float4 v0, v1, v2, v3, v4, v5, v6, v7; + + // sample 16x16 cross (sparse-sample on X360, incremental kernel update on SPUs) + LD( h0, 1.5, 0 ) LD( h1, 3.5, 0 ) LD( h2, 5.5, 0 ) LD( h3, 7.5, 0 ) LD( h4, -1.5,0 ) LD( h5, -3.5,0 ) LD( h6, -5.5,0 ) LD( h7, -7.5,0 ) + LD( v0, 0, 1.5 ) LD( v1, 0, 3.5 ) LD( v2, 0, 5.5 ) LD( v3, 0, 7.5 ) LD( v4, 0,-1.5 ) LD( v5, 0,-3.5 ) LD( v6, 0,-5.5 ) LD( v7, 0,-7.5 ) + + float long_edge_mask_h = ( h0.a + h1.a + h2.a + h3.a + h4.a + h5.a + h6.a + h7.a ) / 8.0f; + float long_edge_mask_v = ( v0.a + v1.a + v2.a + v3.a + v4.a + v5.a + v6.a + v7.a ) / 8.0f; + + long_edge_mask_h = saturate( long_edge_mask_h * 2.0f - 1.0f ); + long_edge_mask_v = saturate( long_edge_mask_v * 2.0f - 1.0f ); + + float4 left, right, top, bottom; + + LD( left, -1, 0 ) + LD( right, 1, 0 ) + LD( top, 0, -1 ) + LD( bottom, 0, 1 ) + + if ( long_edge_mask_h > 0 || long_edge_mask_v > 0 ) // faster but less resistant to noise (TFU2 X360) + //if ( abs( long_edge_mask_h - long_edge_mask_v ) > 0.2f ) // resistant to noise (TFU2 SPUs) + { + float4 long_blurred_h = ( h0 + h1 + h2 + h3 + h4 + h5 + h6 + h7 ) / 8.0f; + float4 long_blurred_v = ( v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 ) / 8.0f; + + float lb_h_lum = GetIntensity( long_blurred_h.xyz ); + float lb_v_lum = GetIntensity( long_blurred_v.xyz ); + + float center_lum = GetIntensity( center.xyz ); + float left_lum = GetIntensity( left.xyz ); + float right_lum = GetIntensity( right.xyz ); + float top_lum = GetIntensity( top.xyz ); + float bottom_lum = GetIntensity( bottom.xyz ); + + float4 clr_v = center; + float4 clr_h = center; + + // we had to hack this because DIV by 0 gives some artefacts on different platforms + float hx = center_lum == top_lum ? 0.0 : saturate( 0 + ( lb_h_lum - top_lum ) / ( center_lum - top_lum ) ); + float hy = center_lum == bottom_lum ? 0.0 : saturate( 1 + ( lb_h_lum - center_lum ) / ( center_lum - bottom_lum ) ); + float vx = center_lum == left_lum ? 0.0 : saturate( 0 + ( lb_v_lum - left_lum ) / ( center_lum - left_lum ) ); + float vy = center_lum == right_lum ? 0.0 : saturate( 1 + ( lb_v_lum - center_lum ) / ( center_lum - right_lum ) ); + + float4 vhxy = float4( vx, vy, hx, hy ); + //vhxy = vhxy == float4( 0, 0, 0, 0 ) ? float4( 1, 1, 1, 1 ) : vhxy; + + clr_v = lerp( left , clr_v, vhxy.x ); + clr_v = lerp( right , clr_v, vhxy.y ); + clr_h = lerp( top , clr_h, vhxy.z ); + clr_h = lerp( bottom, clr_h, vhxy.w ); + + clr = lerp( clr, clr_v, long_edge_mask_v ); + clr = lerp( clr, clr_h, long_edge_mask_h ); + } + + return clr; + } + + float4 edgeDetectAndBlurSharper(float2 texCoord) + { + float lambda = 3.0f; + float epsilon = 0.1f; + + // + // Short Edges + // + + float4 center, left_01, right_01, top_01, bottom_01; + + // sample 5x5 cross + LD( center, 0, 0 ) + LD( left_01, -1.5, 0 ) + LD( right_01, 1.5, 0 ) + LD( top_01, 0,-1.5 ) + LD( bottom_01, 0, 1.5 ) + + + float4 w_h = 2.0f * ( left_01 + right_01 ); + float4 w_v = 2.0f * ( top_01 + bottom_01 ); + + // Sharper (3-pixel wide high-pass) + float4 left, right, top, bottom; + + LD( left, -1, 0 ) + LD( right, 1, 0 ) + LD( top, 0, -1 ) + LD( bottom, 0, 1 ) + + float4 edge_h = abs( left + right - 2.0f * center ) / 2.0f; + float4 edge_v = abs( top + bottom - 2.0f * center ) / 2.0f; + + float4 blurred_h = ( w_h + 2.0f * center ) / 6.0f; + float4 blurred_v = ( w_v + 2.0f * center ) / 6.0f; + + float edge_h_lum = GetIntensity( edge_h.xyz ); + float edge_v_lum = GetIntensity( edge_v.xyz ); + float blurred_h_lum = GetIntensity( blurred_h.xyz ); + float blurred_v_lum = GetIntensity( blurred_v.xyz ); + + float edge_mask_h = saturate( ( lambda * edge_h_lum - epsilon ) / blurred_v_lum ); + float edge_mask_v = saturate( ( lambda * edge_v_lum - epsilon ) / blurred_h_lum ); + + float4 clr = center; + clr = lerp( clr, blurred_h, edge_mask_v ); + clr = lerp( clr, blurred_v, edge_mask_h * 0.5f ); // TFU2 uses 1.0f instead of 0.5f + + // + // Long Edges + // + + float4 h0, h1, h2, h3, h4, h5, h6, h7; + float4 v0, v1, v2, v3, v4, v5, v6, v7; + + // sample 16x16 cross (sparse-sample on X360, incremental kernel update on SPUs) + LD( h0, 1.5, 0 ) LD( h1, 3.5, 0 ) LD( h2, 5.5, 0 ) LD( h3, 7.5, 0 ) LD( h4, -1.5,0 ) LD( h5, -3.5,0 ) LD( h6, -5.5,0 ) LD( h7, -7.5,0 ) + LD( v0, 0, 1.5 ) LD( v1, 0, 3.5 ) LD( v2, 0, 5.5 ) LD( v3, 0, 7.5 ) LD( v4, 0,-1.5 ) LD( v5, 0,-3.5 ) LD( v6, 0,-5.5 ) LD( v7, 0,-7.5 ) + + float long_edge_mask_h = ( h0.a + h1.a + h2.a + h3.a + h4.a + h5.a + h6.a + h7.a ) / 8.0f; + float long_edge_mask_v = ( v0.a + v1.a + v2.a + v3.a + v4.a + v5.a + v6.a + v7.a ) / 8.0f; + + long_edge_mask_h = saturate( long_edge_mask_h * 2.0f - 1.0f ); + long_edge_mask_v = saturate( long_edge_mask_v * 2.0f - 1.0f ); + + //if ( long_edge_mask_h > 0 || long_edge_mask_v > 0 ) // faster but less resistant to noise (TFU2 X360) + if ( abs( long_edge_mask_h - long_edge_mask_v ) > 0.2f ) // resistant to noise (TFU2 SPUs) + { + float4 long_blurred_h = ( h0 + h1 + h2 + h3 + h4 + h5 + h6 + h7 ) / 8.0f; + float4 long_blurred_v = ( v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 ) / 8.0f; + + float lb_h_lum = GetIntensity( long_blurred_h.xyz ); + float lb_v_lum = GetIntensity( long_blurred_v.xyz ); + + float center_lum = GetIntensity( center.xyz ); + float left_lum = GetIntensity( left.xyz ); + float right_lum = GetIntensity( right.xyz ); + float top_lum = GetIntensity( top.xyz ); + float bottom_lum = GetIntensity( bottom.xyz ); + + float4 clr_v = center; + float4 clr_h = center; + + // we had to hack this because DIV by 0 gives some artefacts on different platforms + float hx = center_lum == top_lum ? 0.0 : saturate( 0 + ( lb_h_lum - top_lum ) / ( center_lum - top_lum ) ); + float hy = center_lum == bottom_lum ? 0.0 : saturate( 1 + ( lb_h_lum - center_lum ) / ( center_lum - bottom_lum ) ); + float vx = center_lum == left_lum ? 0.0 : saturate( 0 + ( lb_v_lum - left_lum ) / ( center_lum - left_lum ) ); + float vy = center_lum == right_lum ? 0.0 : saturate( 1 + ( lb_v_lum - center_lum ) / ( center_lum - right_lum ) ); + + float4 vhxy = float4( vx, vy, hx, hy ); + //vhxy = vhxy == float4( 0, 0, 0, 0 ) ? float4( 1, 1, 1, 1 ) : vhxy; + + clr_v = lerp( left , clr_v, vhxy.x ); + clr_v = lerp( right , clr_v, vhxy.y ); + clr_h = lerp( top , clr_h, vhxy.z ); + clr_h = lerp( bottom, clr_h, vhxy.w ); + + clr = lerp( clr, clr_v, long_edge_mask_v ); + clr = lerp( clr, clr_h, long_edge_mask_h ); + } + + return clr; + } + + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + float2 uv = v.texcoord.xy; + o.uv.xy = uv; + + return o; + } + + half4 fragFirst (v2f i) : SV_Target { + return highPassPre (i.uv); + } + + half4 fragSecond (v2f i) : SV_Target { + return edgeDetectAndBlur( i.uv ); + } + + half4 fragThird (v2f i) : SV_Target { + return edgeDetectAndBlurSharper( i.uv ); + } + +ENDCG + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragFirst + #pragma exclude_renderers d3d11_9x + + ENDCG + } + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragSecond + #pragma target 3.0 + #pragma exclude_renderers d3d11_9x + + ENDCG + } + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragThird + #pragma target 3.0 + + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/DLAA.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/DLAA.shader.meta new file mode 100644 index 0000000..8db070d --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/DLAA.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 017ca72b9e8a749058d13ebd527e98fa +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA2.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA2.shader new file mode 100644 index 0000000..c639798 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA2.shader @@ -0,0 +1,189 @@ +Shader "Hidden/FXAA II" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM + +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#pragma target 3.0 + +#define FXAA_HLSL_3 1 + +/*============================================================================ + + FXAA v2 CONSOLE by TIMOTHY LOTTES @ NVIDIA + +============================================================================*/ + +/*============================================================================ + API PORTING +============================================================================*/ +#ifndef FXAA_GLSL_120 + #define FXAA_GLSL_120 0 +#endif +#ifndef FXAA_GLSL_130 + #define FXAA_GLSL_130 0 +#endif +#ifndef FXAA_HLSL_3 + #define FXAA_HLSL_3 0 +#endif +#ifndef FXAA_HLSL_4 + #define FXAA_HLSL_4 0 +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_GLSL_120 + // Requires, + // #version 120 + // #extension GL_EXT_gpu_shader4 : enable + #define int2 ivec2 + #define float2 vec2 + #define float3 vec3 + #define float4 vec4 + #define FxaaInt2 ivec2 + #define FxaaFloat2 vec2 + #define FxaaSat(a) clamp((a), 0.0, 1.0) + #define FxaaTex sampler2D + #define FxaaTexLod0(t, p) texture2DLod(t, p, 0.0) + #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o) +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_GLSL_130 + // Requires "#version 130" or better + #define int2 ivec2 + #define float2 vec2 + #define float3 vec3 + #define float4 vec4 + #define FxaaInt2 ivec2 + #define FxaaFloat2 vec2 + #define FxaaSat(a) clamp((a), 0.0, 1.0) + #define FxaaTex sampler2D + #define FxaaTexLod0(t, p) textureLod(t, p, 0.0) + #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_HLSL_3 + #define int2 float2 + #define FxaaInt2 float2 + #define FxaaFloat2 float2 + #define FxaaSat(a) saturate((a)) + #define FxaaTex sampler2D + #define FxaaTexLod0(t, p) tex2Dlod(t, float4(UnityStereoScreenSpaceUVAdjust(p, _MainTex_ST), 0.0, 0.0)) + #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(UnityStereoScreenSpaceUVAdjust(p + (o * r), _MainTex_ST), 0, 0)) +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_HLSL_4 + #define FxaaInt2 int2 + #define FxaaFloat2 float2 + #define FxaaSat(a) saturate((a)) + struct FxaaTex { SamplerState smpl; Texture2D tex; }; + #define FxaaTexLod0(t, p) t.tex.SampleLevel(t.smpl, UnityStereoScreenSpaceUVAdjust(p, _MainTex_ST), 0.0) + #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, UnityStereoScreenSpaceUVAdjust(p, _MainTex_ST), 0.0, o) +#endif + + +/*============================================================================ + + VERTEX SHADER + +============================================================================*/ +float4 FxaaVertexShader( +float2 pos, // Both x and y range {-1.0 to 1.0 across screen}. +float2 rcpFrame) { // {1.0/frameWidth, 1.0/frameHeight} +/*--------------------------------------------------------------------------*/ + #define FXAA_SUBPIX_SHIFT (1.0/4.0) +/*--------------------------------------------------------------------------*/ + float4 posPos; + posPos.xy = (pos.xy * 0.5) + 0.5; + posPos.zw = posPos.xy - (rcpFrame * (0.5 + FXAA_SUBPIX_SHIFT)); + return posPos; } + +/*============================================================================ + + PIXEL SHADER + +============================================================================*/ +half4 _MainTex_ST; + +float3 FxaaPixelShader( +float4 posPos, // Output of FxaaVertexShader interpolated across screen. +FxaaTex tex, // Input texture. +float2 rcpFrame) { // Constant {1.0/frameWidth, 1.0/frameHeight}. +/*--------------------------------------------------------------------------*/ + #define FXAA_REDUCE_MIN (1.0/128.0) + #define FXAA_REDUCE_MUL (1.0/8.0) + #define FXAA_SPAN_MAX 8.0 +/*--------------------------------------------------------------------------*/ + float3 rgbNW = FxaaTexLod0(tex, posPos.zw).xyz; + float3 rgbNE = FxaaTexOff(tex, posPos.zw, FxaaInt2(1,0), rcpFrame.xy).xyz; + float3 rgbSW = FxaaTexOff(tex, posPos.zw, FxaaInt2(0,1), rcpFrame.xy).xyz; + float3 rgbSE = FxaaTexOff(tex, posPos.zw, FxaaInt2(1,1), rcpFrame.xy).xyz; + float3 rgbM = FxaaTexLod0(tex, posPos.xy).xyz; +/*--------------------------------------------------------------------------*/ + float3 luma = float3(0.299, 0.587, 0.114); + float lumaNW = dot(rgbNW, luma); + float lumaNE = dot(rgbNE, luma); + float lumaSW = dot(rgbSW, luma); + float lumaSE = dot(rgbSE, luma); + float lumaM = dot(rgbM, luma); +/*--------------------------------------------------------------------------*/ + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); + float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); +/*--------------------------------------------------------------------------*/ + float2 dir; + dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); + dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); +/*--------------------------------------------------------------------------*/ + float dirReduce = max( + (lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), + FXAA_REDUCE_MIN); + float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce); + dir = min(FxaaFloat2( FXAA_SPAN_MAX, FXAA_SPAN_MAX), + max(FxaaFloat2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), + dir * rcpDirMin)) * rcpFrame.xy; +/*--------------------------------------------------------------------------*/ + float3 rgbA = (1.0/2.0) * ( + FxaaTexLod0(tex, posPos.xy + dir * (1.0/3.0 - 0.5)).xyz + + FxaaTexLod0(tex, posPos.xy + dir * (2.0/3.0 - 0.5)).xyz); + float3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( + FxaaTexLod0(tex, posPos.xy + dir * (0.0/3.0 - 0.5)).xyz + + FxaaTexLod0(tex, posPos.xy + dir * (3.0/3.0 - 0.5)).xyz); + float lumaB = dot(rgbB, luma); + if((lumaB < lumaMin) || (lumaB > lumaMax)) return rgbA; + return rgbB; } + + +struct v2f { + float4 pos : SV_POSITION; + float4 uv : TEXCOORD0; +}; + +float4 _MainTex_TexelSize; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = FxaaVertexShader (v.texcoord.xy*2-1, _MainTex_TexelSize.xy); + return o; +} + +sampler2D _MainTex; + +float4 frag (v2f i) : SV_Target +{ + return float4(FxaaPixelShader(i.uv, _MainTex, _MainTex_TexelSize.xy).xyz, 0.0f); +} + +ENDCG + } +} + +Fallback off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA2.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA2.shader.meta new file mode 100644 index 0000000..365db5f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA2.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: cd5b323dcc592457790ff18b528f5e67 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA3Console.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA3Console.shader new file mode 100644 index 0000000..78f1c2d --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA3Console.shader @@ -0,0 +1,173 @@ + + +/*============================================================================ + +source taken from + + + NVIDIA FXAA 3.11 by TIMOTHY LOTTES + + +and adapted and ported to Unity by Unity Technologies + + +------------------------------------------------------------------------------ +COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED. +------------------------------------------------------------------------------ +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED +*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA +OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR +CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, +OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE +THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +============================================================================*/ + + +Shader "Hidden/FXAA III (Console)" { + Properties { + _MainTex ("-", 2D) = "white" {} + _EdgeThresholdMin ("Edge threshold min",float) = 0.125 + _EdgeThreshold("Edge Threshold", float) = 0.25 + _EdgeSharpness("Edge sharpness",float) = 4.0 + } + SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + + #include "UnityCG.cginc" + + uniform sampler2D _MainTex; + uniform half _EdgeThresholdMin; + uniform half _EdgeThreshold; + uniform half _EdgeSharpness; + half4 _MainTex_ST; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 interpolatorA : TEXCOORD1; + float4 interpolatorB : TEXCOORD2; + float4 interpolatorC : TEXCOORD3; + }; + + float4 _MainTex_TexelSize; + + v2f vert (appdata_img v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = v.texcoord.xy; + + float4 extents; + float2 offset = ( _MainTex_TexelSize.xy ) * 0.5f; + extents.xy = v.texcoord.xy - offset; + extents.zw = v.texcoord.xy + offset; + + float4 rcpSize; + rcpSize.xy = -_MainTex_TexelSize.xy * 0.5f; + rcpSize.zw = _MainTex_TexelSize.xy * 0.5f; +#if defined (SHADER_API_PSP2) + //cg compiler linker bug workaround + float almostzero = v.texcoord.x*0.000001f; + rcpSize.x += almostzero; +#endif + o.interpolatorA = extents; + o.interpolatorB = rcpSize; + o.interpolatorC = rcpSize; + + o.interpolatorC.xy *= 4.0; + o.interpolatorC.zw *= 4.0; + + return o; + } + +// hacky support for NaCl +#if defined(SHADER_API_GLES) && defined(SHADER_API_DESKTOP) + #define FxaaTexTop(t, p) tex2D(t, UnityStereoScreenSpaceUVAdjust(p, _MainTex_ST)) +#else + #define FxaaTexTop(t, p) tex2Dlod(t, float4(UnityStereoScreenSpaceUVAdjust(p, _MainTex_ST), 0.0, 0.0)) +#endif + + inline half TexLuminance( float2 uv ) + { + return Luminance(FxaaTexTop(_MainTex, uv).rgb); + } + + half3 FxaaPixelShader(float2 pos, float4 extents, float4 rcpSize, float4 rcpSize2) + { + half lumaNw = TexLuminance(extents.xy); + half lumaSw = TexLuminance(extents.xw); + half lumaNe = TexLuminance(extents.zy); + half lumaSe = TexLuminance(extents.zw); + + half3 centre = FxaaTexTop(_MainTex, pos).rgb; + half lumaCentre = Luminance(centre); + + half lumaMaxNwSw = max( lumaNw , lumaSw ); + lumaNe += 1.0/384.0; + half lumaMinNwSw = min( lumaNw , lumaSw ); + + half lumaMaxNeSe = max( lumaNe , lumaSe ); + half lumaMinNeSe = min( lumaNe , lumaSe ); + + half lumaMax = max( lumaMaxNeSe, lumaMaxNwSw ); + half lumaMin = min( lumaMinNeSe, lumaMinNwSw ); + + half lumaMaxScaled = lumaMax * _EdgeThreshold; + + half lumaMinCentre = min( lumaMin , lumaCentre ); + half lumaMaxScaledClamped = max( _EdgeThresholdMin , lumaMaxScaled ); + half lumaMaxCentre = max( lumaMax , lumaCentre ); + half dirSWMinusNE = lumaSw - lumaNe; + half lumaMaxCMinusMinC = lumaMaxCentre - lumaMinCentre; + half dirSEMinusNW = lumaSe - lumaNw; + + if(lumaMaxCMinusMinC < lumaMaxScaledClamped) + return centre; + + half2 dir; + dir.x = dirSWMinusNE + dirSEMinusNW; + dir.y = dirSWMinusNE - dirSEMinusNW; + + dir = normalize(dir); + half3 col1 = FxaaTexTop(_MainTex, pos.xy - dir * rcpSize.zw).rgb; + half3 col2 = FxaaTexTop(_MainTex, pos.xy + dir * rcpSize.zw).rgb; + + half dirAbsMinTimesC = min( abs( dir.x ) , abs( dir.y ) ) * _EdgeSharpness; + dir = clamp(dir.xy/dirAbsMinTimesC, -2.0, 2.0); + + half3 col3 = FxaaTexTop(_MainTex, pos.xy - dir * rcpSize2.zw).rgb; + half3 col4 = FxaaTexTop(_MainTex, pos.xy + dir * rcpSize2.zw).rgb; + + half3 rgbyA = col1 + col2; + half3 rgbyB = ((col3 + col4) * 0.25) + (rgbyA * 0.25); + + if((Luminance(rgbyA) < lumaMin) || (Luminance(rgbyB) > lumaMax)) + return rgbyA * 0.5; + else + return rgbyB; + } + + half4 frag (v2f i) : SV_Target + { + half3 color = FxaaPixelShader(i.uv, i.interpolatorA, i.interpolatorB, i.interpolatorC); + return half4(color, 1.0); + } + + ENDCG + } + } + FallBack Off +} + diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA3Console.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA3Console.shader.meta new file mode 100644 index 0000000..6306815 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAA3Console.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: c547503fff0e8482ea5793727057041c +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset2.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset2.shader new file mode 100644 index 0000000..feb6710 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset2.shader @@ -0,0 +1,829 @@ +Shader "Hidden/FXAA Preset 2" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#pragma target 3.0 + +// doesn't make sense to have this on consoles, it'll fallback to FXAA2 +#pragma exclude_renderers xbox360 ps3 gles + + +#define FXAA_HLSL_3 1 +#define FXAA_PRESET 2 + + +// Copyright (c) 2010 NVIDIA Corporation. All rights reserved. +// +// TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED +// *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS +// OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS +// BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES +// WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, +// BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) +// ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS +// BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +/*============================================================================ + + FXAA + +============================================================================*/ + +/*============================================================================ + API PORTING +============================================================================*/ +#ifndef FXAA_GLSL_120 + #define FXAA_GLSL_120 0 +#endif +#ifndef FXAA_GLSL_130 + #define FXAA_GLSL_130 0 +#endif +#ifndef FXAA_HLSL_3 + #define FXAA_HLSL_3 0 +#endif +#ifndef FXAA_HLSL_4 + #define FXAA_HLSL_4 0 +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_GLSL_120 + // Requires, + // #version 120 + // #extension GL_EXT_gpu_shader4 : enable + #define int2 ivec2 + #define float2 vec2 + #define float3 vec3 + #define float4 vec4 + #define FxaaBool3 bvec3 + #define FxaaInt2 ivec2 + #define FxaaFloat2 vec2 + #define FxaaFloat3 vec3 + #define FxaaFloat4 vec4 + #define FxaaBool2Float(a) mix(0.0, 1.0, (a)) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) mix((f), (t), (b)) + #define FxaaTex sampler2D +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_GLSL_130 + // Requires "#version 130" or better + #define int2 ivec2 + #define float2 vec2 + #define float3 vec3 + #define float4 vec4 + #define FxaaBool3 bvec3 + #define FxaaInt2 ivec2 + #define FxaaFloat2 vec2 + #define FxaaFloat3 vec3 + #define FxaaFloat4 vec4 + #define FxaaBool2Float(a) mix(0.0, 1.0, (a)) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) mix((f), (t), (b)) + #define FxaaTex sampler2D +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_HLSL_3 + #define int2 float2 + #define FxaaInt2 float2 + #define FxaaFloat2 float2 + #define FxaaFloat3 float3 + #define FxaaFloat4 float4 + #define FxaaBool2Float(a) (a) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) ((f)*(!b) + (t)*(b)) + #define FxaaTex sampler2D +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_HLSL_4 + #define FxaaInt2 int2 + #define FxaaFloat2 float2 + #define FxaaFloat3 float3 + #define FxaaFloat4 float4 + #define FxaaBool2Float(a) (a) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) ((f)*(!b) + (t)*(b)) + struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#endif +/*--------------------------------------------------------------------------*/ +#define FxaaToFloat3(a) FxaaFloat3((a), (a), (a)) +/*--------------------------------------------------------------------------*/ +half4 _MainTex_ST; + +float4 FxaaTexLod0(FxaaTex tex, float2 pos) { + #if FXAA_GLSL_120 + return texture2DLod(tex, pos.xy, 0.0); + #endif + #if FXAA_GLSL_130 + return textureLod(tex, pos.xy, 0.0); + #endif + #if FXAA_HLSL_3 + return tex2Dlod(tex, float4(UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), 0.0, 0.0)); + #endif + #if FXAA_HLSL_4 + return tex.tex.SampleLevel(tex.smpl, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), 0.0); + #endif +} +/*--------------------------------------------------------------------------*/ +float4 FxaaTexGrad(FxaaTex tex, float2 pos, float2 grad) { + #if FXAA_GLSL_120 + return texture2DGrad(tex, pos.xy, grad, grad); + #endif + #if FXAA_GLSL_130 + return textureGrad(tex, pos.xy, grad, grad); + #endif + #if FXAA_HLSL_3 + return tex2Dgrad(tex, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), grad, grad); + #endif + #if FXAA_HLSL_4 + return tex.tex.SampleGrad(tex.smpl, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), grad, grad); + #endif +} +/*--------------------------------------------------------------------------*/ +float4 FxaaTexOff(FxaaTex tex, float2 pos, int2 off, float2 rcpFrame) { + #if FXAA_GLSL_120 + return texture2DLodOffset(tex, pos.xy, 0.0, off.xy); + #endif + #if FXAA_GLSL_130 + return textureLodOffset(tex, pos.xy, 0.0, off.xy); + #endif + #if FXAA_HLSL_3 + return tex2Dlod(tex, float4(UnityStereoScreenSpaceUVAdjust(pos.xy + (off * rcpFrame), _MainTex_ST), 0, 0)); + #endif + #if FXAA_HLSL_4 + return tex.tex.SampleLevel(tex.smpl, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), 0.0, off.xy); + #endif +} + +/*============================================================================ + SRGB KNOBS +------------------------------------------------------------------------------ +FXAA_SRGB_ROP - Set to 1 when applying FXAA to an sRGB back buffer (DX10/11). + This will do the sRGB to linear transform, + as ROP will expect linear color from this shader, + and this shader works in non-linear color. +============================================================================*/ +#define FXAA_SRGB_ROP 0 + +/*============================================================================ + DEBUG KNOBS +------------------------------------------------------------------------------ +All debug knobs draw FXAA-untouched pixels in FXAA computed luma (monochrome). + +FXAA_DEBUG_PASSTHROUGH - Red for pixels which are filtered by FXAA with a + yellow tint on sub-pixel aliasing filtered by FXAA. +FXAA_DEBUG_HORZVERT - Blue for horizontal edges, gold for vertical edges. +FXAA_DEBUG_PAIR - Blue/green for the 2 pixel pair choice. +FXAA_DEBUG_NEGPOS - Red/blue for which side of center of span. +FXAA_DEBUG_OFFSET - Red/blue for -/+ x, gold/skyblue for -/+ y. +============================================================================*/ +#ifndef FXAA_DEBUG_PASSTHROUGH + #define FXAA_DEBUG_PASSTHROUGH 0 +#endif +#ifndef FXAA_DEBUG_HORZVERT + #define FXAA_DEBUG_HORZVERT 0 +#endif +#ifndef FXAA_DEBUG_PAIR + #define FXAA_DEBUG_PAIR 0 +#endif +#ifndef FXAA_DEBUG_NEGPOS + #define FXAA_DEBUG_NEGPOS 0 +#endif +#ifndef FXAA_DEBUG_OFFSET + #define FXAA_DEBUG_OFFSET 0 +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_DEBUG_PASSTHROUGH || FXAA_DEBUG_HORZVERT || FXAA_DEBUG_PAIR + #define FXAA_DEBUG 1 +#endif +#if FXAA_DEBUG_NEGPOS || FXAA_DEBUG_OFFSET + #define FXAA_DEBUG 1 +#endif +#ifndef FXAA_DEBUG + #define FXAA_DEBUG 0 +#endif + +/*============================================================================ + COMPILE-IN KNOBS +------------------------------------------------------------------------------ +FXAA_PRESET - Choose compile-in knob preset 0-5. +------------------------------------------------------------------------------ +FXAA_EDGE_THRESHOLD - The minimum amount of local contrast required + to apply algorithm. + 1.0/3.0 - too little + 1.0/4.0 - good start + 1.0/8.0 - applies to more edges + 1.0/16.0 - overkill +------------------------------------------------------------------------------ +FXAA_EDGE_THRESHOLD_MIN - Trims the algorithm from processing darks. + Perf optimization. + 1.0/32.0 - visible limit (smaller isn't visible) + 1.0/16.0 - good compromise + 1.0/12.0 - upper limit (seeing artifacts) +------------------------------------------------------------------------------ +FXAA_SEARCH_STEPS - Maximum number of search steps for end of span. +------------------------------------------------------------------------------ +FXAA_SEARCH_ACCELERATION - How much to accelerate search, + 1 - no acceleration + 2 - skip by 2 pixels + 3 - skip by 3 pixels + 4 - skip by 4 pixels +------------------------------------------------------------------------------ +FXAA_SEARCH_THRESHOLD - Controls when to stop searching. + 1.0/4.0 - seems to be the best quality wise +------------------------------------------------------------------------------ +FXAA_SUBPIX_FASTER - Turn on lower quality but faster subpix path. + Not recomended, but used in preset 0. +------------------------------------------------------------------------------ +FXAA_SUBPIX - Toggle subpix filtering. + 0 - turn off + 1 - turn on + 2 - turn on full (ignores FXAA_SUBPIX_TRIM and CAP) +------------------------------------------------------------------------------ +FXAA_SUBPIX_TRIM - Controls sub-pixel aliasing removal. + 1.0/2.0 - low removal + 1.0/3.0 - medium removal + 1.0/4.0 - default removal + 1.0/8.0 - high removal + 0.0 - complete removal +------------------------------------------------------------------------------ +FXAA_SUBPIX_CAP - Insures fine detail is not completely removed. + This is important for the transition of sub-pixel detail, + like fences and wires. + 3.0/4.0 - default (medium amount of filtering) + 7.0/8.0 - high amount of filtering + 1.0 - no capping of sub-pixel aliasing removal +============================================================================*/ +#ifndef FXAA_PRESET + #define FXAA_PRESET 3 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 0) + #define FXAA_EDGE_THRESHOLD (1.0/4.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/12.0) + #define FXAA_SEARCH_STEPS 2 + #define FXAA_SEARCH_ACCELERATION 4 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 1 + #define FXAA_SUBPIX_CAP (2.0/3.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 1) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/16.0) + #define FXAA_SEARCH_STEPS 4 + #define FXAA_SEARCH_ACCELERATION 3 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 2) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 8 + #define FXAA_SEARCH_ACCELERATION 2 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 3) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 16 + #define FXAA_SEARCH_ACCELERATION 1 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 4) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 24 + #define FXAA_SEARCH_ACCELERATION 1 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 5) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 32 + #define FXAA_SEARCH_ACCELERATION 1 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#define FXAA_SUBPIX_TRIM_SCALE (1.0/(1.0 - FXAA_SUBPIX_TRIM)) + +/*============================================================================ + HELPERS +============================================================================*/ +// Return the luma, the estimation of luminance from rgb inputs. +// This approximates luma using one FMA instruction, +// skipping normalization and tossing out blue. +// FxaaLuma() will range 0.0 to 2.963210702. +float FxaaLuma(float3 rgb) { + return rgb.y * (0.587/0.299) + rgb.x; } +/*--------------------------------------------------------------------------*/ +float3 FxaaLerp3(float3 a, float3 b, float amountOfA) { + return (FxaaToFloat3(-amountOfA) * b) + + ((a * FxaaToFloat3(amountOfA)) + b); } +/*--------------------------------------------------------------------------*/ +// Support any extra filtering before returning color. +float3 FxaaFilterReturn(float3 rgb) { + #if FXAA_SRGB_ROP + // Do sRGB encoded value to linear conversion. + return FxaaSel3( + rgb * FxaaToFloat3(1.0/12.92), + FxaaPow3( + rgb * FxaaToFloat3(1.0/1.055) + FxaaToFloat3(0.055/1.055), + FxaaToFloat3(2.4)), + rgb > FxaaToFloat3(0.04045)); + #else + return rgb; + #endif +} + +/*============================================================================ + VERTEX SHADER +============================================================================*/ +float2 FxaaVertexShader( +// Both x and y range {-1.0 to 1.0 across screen}. +float2 inPos) { + float2 pos; + pos.xy = (inPos.xy * FxaaFloat2(0.5, 0.5)) + FxaaFloat2(0.5, 0.5); + return pos; } + +/*============================================================================ + + PIXEL SHADER + +============================================================================*/ +float3 FxaaPixelShader( +// Output of FxaaVertexShader interpolated across screen. +// xy -> actual texture position {0.0 to 1.0} +float2 pos, +// Input texture. +FxaaTex tex, +// RCPFRAME SHOULD PIXEL SHADER CONSTANTS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// {1.0/frameWidth, 1.0/frameHeight} +float2 rcpFrame) { + +/*---------------------------------------------------------------------------- + EARLY EXIT IF LOCAL CONTRAST BELOW EDGE DETECT LIMIT +------------------------------------------------------------------------------ +Majority of pixels of a typical image do not require filtering, +often pixels are grouped into blocks which could benefit from early exit +right at the beginning of the algorithm. +Given the following neighborhood, + + N + W M E + S + +If the difference in local maximum and minimum luma (contrast "range") +is lower than a threshold proportional to the maximum local luma ("rangeMax"), +then the shader early exits (no visible aliasing). +This threshold is clamped at a minimum value ("FXAA_EDGE_THRESHOLD_MIN") +to avoid processing in really dark areas. +----------------------------------------------------------------------------*/ + float3 rgbN = FxaaTexOff(tex, pos.xy, FxaaInt2( 0,-1), rcpFrame).xyz; + float3 rgbW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1, 0), rcpFrame).xyz; + float3 rgbM = FxaaTexOff(tex, pos.xy, FxaaInt2( 0, 0), rcpFrame).xyz; + float3 rgbE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1, 0), rcpFrame).xyz; + float3 rgbS = FxaaTexOff(tex, pos.xy, FxaaInt2( 0, 1), rcpFrame).xyz; + float lumaN = FxaaLuma(rgbN); + float lumaW = FxaaLuma(rgbW); + float lumaM = FxaaLuma(rgbM); + float lumaE = FxaaLuma(rgbE); + float lumaS = FxaaLuma(rgbS); + float rangeMin = min(lumaM, min(min(lumaN, lumaW), min(lumaS, lumaE))); + float rangeMax = max(lumaM, max(max(lumaN, lumaW), max(lumaS, lumaE))); + float range = rangeMax - rangeMin; + #if FXAA_DEBUG + float lumaO = lumaM / (1.0 + (0.587/0.299)); + #endif + if(range < max(FXAA_EDGE_THRESHOLD_MIN, rangeMax * FXAA_EDGE_THRESHOLD)) { + #if FXAA_DEBUG + return FxaaFilterReturn(FxaaToFloat3(lumaO)); + #endif + return FxaaFilterReturn(rgbM); } + #if FXAA_SUBPIX > 0 + #if FXAA_SUBPIX_FASTER + float3 rgbL = (rgbN + rgbW + rgbE + rgbS + rgbM) * + FxaaToFloat3(1.0/5.0); + #else + float3 rgbL = rgbN + rgbW + rgbM + rgbE + rgbS; + #endif + #endif + +/*---------------------------------------------------------------------------- + COMPUTE LOWPASS +------------------------------------------------------------------------------ +FXAA computes a local neighborhood lowpass value as follows, + + (N + W + E + S)/4 + +Then uses the ratio of the contrast range of the lowpass +and the range found in the early exit check, +as a sub-pixel aliasing detection filter. +When FXAA detects sub-pixel aliasing (such as single pixel dots), +it later blends in "blendL" amount +of a lowpass value (computed in the next section) to the final result. +----------------------------------------------------------------------------*/ + #if FXAA_SUBPIX != 0 + float lumaL = (lumaN + lumaW + lumaE + lumaS) * 0.25; + float rangeL = abs(lumaL - lumaM); + #endif + #if FXAA_SUBPIX == 1 + float blendL = max(0.0, + (rangeL / range) - FXAA_SUBPIX_TRIM) * FXAA_SUBPIX_TRIM_SCALE; + blendL = min(FXAA_SUBPIX_CAP, blendL); + #endif + #if FXAA_SUBPIX == 2 + float blendL = rangeL / range; + #endif + #if FXAA_DEBUG_PASSTHROUGH + #if FXAA_SUBPIX == 0 + float blendL = 0.0; + #endif + return FxaaFilterReturn( + FxaaFloat3(1.0, blendL/FXAA_SUBPIX_CAP, 0.0)); + #endif + +/*---------------------------------------------------------------------------- + CHOOSE VERTICAL OR HORIZONTAL SEARCH +------------------------------------------------------------------------------ +FXAA uses the following local neighborhood, + + NW N NE + W M E + SW S SE + +To compute an edge amount for both vertical and horizontal directions. +Note edge detect filters like Sobel fail on single pixel lines through M. +FXAA takes the weighted average magnitude of the high-pass values +for rows and columns as an indication of local edge amount. + +A lowpass value for anti-sub-pixel-aliasing is computed as + (N+W+E+S+M+NW+NE+SW+SE)/9. +This full box pattern has higher quality than other options. + +Note following this block, both vertical and horizontal cases +flow in parallel (reusing the horizontal variables). +----------------------------------------------------------------------------*/ + float3 rgbNW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1,-1), rcpFrame).xyz; + float3 rgbNE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1,-1), rcpFrame).xyz; + float3 rgbSW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1, 1), rcpFrame).xyz; + float3 rgbSE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1, 1), rcpFrame).xyz; + #if (FXAA_SUBPIX_FASTER == 0) && (FXAA_SUBPIX > 0) + rgbL += (rgbNW + rgbNE + rgbSW + rgbSE); + rgbL *= FxaaToFloat3(1.0/9.0); + #endif + float lumaNW = FxaaLuma(rgbNW); + float lumaNE = FxaaLuma(rgbNE); + float lumaSW = FxaaLuma(rgbSW); + float lumaSE = FxaaLuma(rgbSE); + float edgeVert = + abs((0.25 * lumaNW) + (-0.5 * lumaN) + (0.25 * lumaNE)) + + abs((0.50 * lumaW ) + (-1.0 * lumaM) + (0.50 * lumaE )) + + abs((0.25 * lumaSW) + (-0.5 * lumaS) + (0.25 * lumaSE)); + float edgeHorz = + abs((0.25 * lumaNW) + (-0.5 * lumaW) + (0.25 * lumaSW)) + + abs((0.50 * lumaN ) + (-1.0 * lumaM) + (0.50 * lumaS )) + + abs((0.25 * lumaNE) + (-0.5 * lumaE) + (0.25 * lumaSE)); + bool horzSpan = edgeHorz >= edgeVert; + #if FXAA_DEBUG_HORZVERT + if(horzSpan) return FxaaFilterReturn(FxaaFloat3(1.0, 0.75, 0.0)); + else return FxaaFilterReturn(FxaaFloat3(0.0, 0.50, 1.0)); + #endif + float lengthSign = horzSpan ? -rcpFrame.y : -rcpFrame.x; + if(!horzSpan) lumaN = lumaW; + if(!horzSpan) lumaS = lumaE; + float gradientN = abs(lumaN - lumaM); + float gradientS = abs(lumaS - lumaM); + lumaN = (lumaN + lumaM) * 0.5; + lumaS = (lumaS + lumaM) * 0.5; + +/*---------------------------------------------------------------------------- + CHOOSE SIDE OF PIXEL WHERE GRADIENT IS HIGHEST +------------------------------------------------------------------------------ +This chooses a pixel pair. +For "horzSpan == true" this will be a vertical pair, + + [N] N + [M] or [M] + S [S] + +Note following this block, both {N,M} and {S,M} cases +flow in parallel (reusing the {N,M} variables). + +This pair of image rows or columns is searched below +in the positive and negative direction +until edge status changes +(or the maximum number of search steps is reached). +----------------------------------------------------------------------------*/ + bool pairN = gradientN >= gradientS; + #if FXAA_DEBUG_PAIR + if(pairN) return FxaaFilterReturn(FxaaFloat3(0.0, 0.0, 1.0)); + else return FxaaFilterReturn(FxaaFloat3(0.0, 1.0, 0.0)); + #endif + if(!pairN) lumaN = lumaS; + if(!pairN) gradientN = gradientS; + if(!pairN) lengthSign *= -1.0; + float2 posN; + posN.x = pos.x + (horzSpan ? 0.0 : lengthSign * 0.5); + posN.y = pos.y + (horzSpan ? lengthSign * 0.5 : 0.0); + +/*---------------------------------------------------------------------------- + CHOOSE SEARCH LIMITING VALUES +------------------------------------------------------------------------------ +Search limit (+/- gradientN) is a function of local gradient. +----------------------------------------------------------------------------*/ + gradientN *= FXAA_SEARCH_THRESHOLD; + +/*---------------------------------------------------------------------------- + SEARCH IN BOTH DIRECTIONS UNTIL FIND LUMA PAIR AVERAGE IS OUT OF RANGE +------------------------------------------------------------------------------ +This loop searches either in vertical or horizontal directions, +and in both the negative and positive direction in parallel. +This loop fusion is faster than searching separately. + +The search is accelerated using FXAA_SEARCH_ACCELERATION length box filter +via anisotropic filtering with specified texture gradients. +----------------------------------------------------------------------------*/ + float2 posP = posN; + float2 offNP = horzSpan ? + FxaaFloat2(rcpFrame.x, 0.0) : + FxaaFloat2(0.0f, rcpFrame.y); + float lumaEndN = lumaN; + float lumaEndP = lumaN; + bool doneN = false; + bool doneP = false; + #if FXAA_SEARCH_ACCELERATION == 1 + posN += offNP * FxaaFloat2(-1.0, -1.0); + posP += offNP * FxaaFloat2( 1.0, 1.0); + #endif + #if FXAA_SEARCH_ACCELERATION == 2 + posN += offNP * FxaaFloat2(-1.5, -1.5); + posP += offNP * FxaaFloat2( 1.5, 1.5); + offNP *= FxaaFloat2(2.0, 2.0); + #endif + #if FXAA_SEARCH_ACCELERATION == 3 + posN += offNP * FxaaFloat2(-2.0, -2.0); + posP += offNP * FxaaFloat2( 2.0, 2.0); + offNP *= FxaaFloat2(3.0, 3.0); + #endif + #if FXAA_SEARCH_ACCELERATION == 4 + posN += offNP * FxaaFloat2(-2.5, -2.5); + posP += offNP * FxaaFloat2( 2.5, 2.5); + offNP *= FxaaFloat2(4.0, 4.0); + #endif + for(int i = 0; i < FXAA_SEARCH_STEPS; i++) { + #if FXAA_SEARCH_ACCELERATION == 1 + if(!doneN) lumaEndN = + FxaaLuma(FxaaTexLod0(tex, posN.xy).xyz); + if(!doneP) lumaEndP = + FxaaLuma(FxaaTexLod0(tex, posP.xy).xyz); + #else + if(!doneN) lumaEndN = + FxaaLuma(FxaaTexGrad(tex, posN.xy, offNP).xyz); + if(!doneP) lumaEndP = + FxaaLuma(FxaaTexGrad(tex, posP.xy, offNP).xyz); + #endif + doneN = doneN || (abs(lumaEndN - lumaN) >= gradientN); + doneP = doneP || (abs(lumaEndP - lumaN) >= gradientN); + if(doneN && doneP) break; + if(!doneN) posN -= offNP; + if(!doneP) posP += offNP; } + +/*---------------------------------------------------------------------------- + HANDLE IF CENTER IS ON POSITIVE OR NEGATIVE SIDE +------------------------------------------------------------------------------ +FXAA uses the pixel's position in the span +in combination with the values (lumaEnd*) at the ends of the span, +to determine filtering. + +This step computes which side of the span the pixel is on. +On negative side if dstN < dstP, + + posN pos posP + |-----------|------|------------------| + | | | | + |<--dstN--->|<---------dstP---------->| + | + span center + +----------------------------------------------------------------------------*/ + float dstN = horzSpan ? pos.x - posN.x : pos.y - posN.y; + float dstP = horzSpan ? posP.x - pos.x : posP.y - pos.y; + bool directionN = dstN < dstP; + #if FXAA_DEBUG_NEGPOS + if(directionN) return FxaaFilterReturn(FxaaFloat3(1.0, 0.0, 0.0)); + else return FxaaFilterReturn(FxaaFloat3(0.0, 0.0, 1.0)); + #endif + lumaEndN = directionN ? lumaEndN : lumaEndP; + +/*---------------------------------------------------------------------------- + CHECK IF PIXEL IS IN SECTION OF SPAN WHICH GETS NO FILTERING +------------------------------------------------------------------------------ +If both the pair luma at the end of the span (lumaEndN) +and middle pixel luma (lumaM) +are on the same side of the middle pair average luma (lumaN), +then don't filter. + +Cases, + +(1.) "L", + + lumaM + | + V XXXXXXXX <- other line averaged + XXXXXXX[X]XXXXXXXXXXX <- source pixel line + | . | + -------------------------- + [ ]xxxxxx[x]xx[X]XXXXXX <- pair average + -------------------------- + ^ ^ ^ ^ + | | | | + . |<---->|<---------- no filter region + . | | | + . center | | + . | lumaEndN + . | . + . lumaN . + . . + |<--- span -->| + + +(2.) "^" and "-", + + <- other line averaged + XXXXX[X]XXX <- source pixel line + | | | + -------------------------- + [ ]xxxx[x]xx[ ] <- pair average + -------------------------- + | | | + |<--->|<--->|<---------- filter both sides + + +(3.) "v" and inverse of "-", + + XXXXXX XXXXXXXXX <- other line averaged + XXXXXXXXXXX[X]XXXXXXXXXXXX <- source pixel line + | | | + -------------------------- + XXXX[X]xxxx[x]xx[X]XXXXXXX <- pair average + -------------------------- + | | | + |<--->|<--->|<---------- don't filter both! + + +Note the "v" case for FXAA requires no filtering. +This is because the inverse of the "-" case is the "v". +Filtering "v" case turns open spans like this, + + XXXXXXXXX + +Into this (which is not desired), + + x+. .+x + XXXXXXXXX + +----------------------------------------------------------------------------*/ + if(((lumaM - lumaN) < 0.0) == ((lumaEndN - lumaN) < 0.0)) + lengthSign = 0.0; + +/*---------------------------------------------------------------------------- + COMPUTE SUB-PIXEL OFFSET AND FILTER SPAN +------------------------------------------------------------------------------ +FXAA filters using a bilinear texture fetch offset +from the middle pixel M towards the center of the pair (NM below). +Maximum filtering will be half way between pair. +Reminder, at this point in the code, +the {N,M} pair is also reused for all cases: {S,M}, {W,M}, and {E,M}. + + +-------+ + | | 0.5 offset + | N | | + | | V + +-------+....--- + | | + | M...|....--- + | | ^ + +-------+ | + . . 0.0 offset + . S . + . . + ......... + +Position on span is used to compute sub-pixel filter offset using simple ramp, + + posN posP + |\ |<------- 0.5 pixel offset into pair pixel + | \ | + | \ | + ---.......|...\..........|<------- 0.25 pixel offset into pair pixel + ^ | ^\ | + | | | \ | + V | | \ | + ---.......|===|==========|<------- 0.0 pixel offset (ie M pixel) + ^ . | ^ . + | . pos | . + | . . | . + | . . center . + | . . . + | |<->|<---------.-------- dstN + | . . . + | . |<-------->|<------- dstP + | . . + | |<------------>|<------- spanLength + | + subPixelOffset + +----------------------------------------------------------------------------*/ + float spanLength = (dstP + dstN); + dstN = directionN ? dstN : dstP; + float subPixelOffset = (0.5 + (dstN * (-1.0/spanLength))) * lengthSign; + #if FXAA_DEBUG_OFFSET + float ox = horzSpan ? 0.0 : subPixelOffset*2.0/rcpFrame.x; + float oy = horzSpan ? subPixelOffset*2.0/rcpFrame.y : 0.0; + if(ox < 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(1.0, 0.0, 0.0), -ox)); + if(ox > 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(0.0, 0.0, 1.0), ox)); + if(oy < 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(1.0, 0.6, 0.2), -oy)); + if(oy > 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(0.2, 0.6, 1.0), oy)); + return FxaaFilterReturn(FxaaFloat3(lumaO, lumaO, lumaO)); + #endif + float3 rgbF = FxaaTexLod0(tex, FxaaFloat2( + pos.x + (horzSpan ? 0.0 : subPixelOffset), + pos.y + (horzSpan ? subPixelOffset : 0.0))).xyz; + #if FXAA_SUBPIX == 0 + return FxaaFilterReturn(rgbF); + #else + return FxaaFilterReturn(FxaaLerp3(rgbL, rgbF, blendL)); + #endif +} + + + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + return o; +} + +sampler2D _MainTex; +float4 _MainTex_TexelSize; + +float4 frag (v2f i) : SV_Target +{ + return float4(FxaaPixelShader(i.uv.xy, _MainTex, _MainTex_TexelSize.xy).xyz, 0.0f); +} + +ENDCG + } +} + +Fallback "Hidden/FXAA II" +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset2.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset2.shader.meta new file mode 100644 index 0000000..a0d603d --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset2.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 6f1418cffd12146f2a83be795f6fa5a7 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset3.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset3.shader new file mode 100644 index 0000000..4b2f4ef --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset3.shader @@ -0,0 +1,828 @@ +Shader "Hidden/FXAA Preset 3" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#include "UnityCG.cginc" +#pragma target 3.0 + +// Not very practical on consoles/mobile, and PS3 Cg takes ages to compile this :( +#pragma exclude_renderers xbox360 ps3 gles + +#define FXAA_HLSL_3 1 +#define FXAA_PRESET 3 + + +// Copyright (c) 2010 NVIDIA Corporation. All rights reserved. +// +// TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED +// *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS +// OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS +// BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES +// WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, +// BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) +// ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS +// BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +/*============================================================================ + + FXAA + +============================================================================*/ + +/*============================================================================ + API PORTING +============================================================================*/ +#ifndef FXAA_GLSL_120 + #define FXAA_GLSL_120 0 +#endif +#ifndef FXAA_GLSL_130 + #define FXAA_GLSL_130 0 +#endif +#ifndef FXAA_HLSL_3 + #define FXAA_HLSL_3 0 +#endif +#ifndef FXAA_HLSL_4 + #define FXAA_HLSL_4 0 +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_GLSL_120 + // Requires, + // #version 120 + // #extension GL_EXT_gpu_shader4 : enable + #define int2 ivec2 + #define float2 vec2 + #define float3 vec3 + #define float4 vec4 + #define FxaaBool3 bvec3 + #define FxaaInt2 ivec2 + #define FxaaFloat2 vec2 + #define FxaaFloat3 vec3 + #define FxaaFloat4 vec4 + #define FxaaBool2Float(a) mix(0.0, 1.0, (a)) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) mix((f), (t), (b)) + #define FxaaTex sampler2D +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_GLSL_130 + // Requires "#version 130" or better + #define int2 ivec2 + #define float2 vec2 + #define float3 vec3 + #define float4 vec4 + #define FxaaBool3 bvec3 + #define FxaaInt2 ivec2 + #define FxaaFloat2 vec2 + #define FxaaFloat3 vec3 + #define FxaaFloat4 vec4 + #define FxaaBool2Float(a) mix(0.0, 1.0, (a)) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) mix((f), (t), (b)) + #define FxaaTex sampler2D +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_HLSL_3 + #define int2 float2 + #define FxaaInt2 float2 + #define FxaaFloat2 float2 + #define FxaaFloat3 float3 + #define FxaaFloat4 float4 + #define FxaaBool2Float(a) (a) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) ((f)*(!b) + (t)*(b)) + #define FxaaTex sampler2D +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_HLSL_4 + #define FxaaInt2 int2 + #define FxaaFloat2 float2 + #define FxaaFloat3 float3 + #define FxaaFloat4 float4 + #define FxaaBool2Float(a) (a) + #define FxaaPow3(x, y) pow(x, y) + #define FxaaSel3(f, t, b) ((f)*(!b) + (t)*(b)) + struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#endif +/*--------------------------------------------------------------------------*/ +#define FxaaToFloat3(a) FxaaFloat3((a), (a), (a)) +/*--------------------------------------------------------------------------*/ +half4 _MainTex_ST; + +float4 FxaaTexLod0(FxaaTex tex, float2 pos) { + #if FXAA_GLSL_120 + return texture2DLod(tex, pos.xy, 0.0); + #endif + #if FXAA_GLSL_130 + return textureLod(tex, pos.xy, 0.0); + #endif + #if FXAA_HLSL_3 + return tex2Dlod(tex, float4(UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), 0.0, 0.0)); + #endif + #if FXAA_HLSL_4 + return tex.tex.SampleLevel(tex.smpl, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), 0.0); + #endif +} +/*--------------------------------------------------------------------------*/ +float4 FxaaTexGrad(FxaaTex tex, float2 pos, float2 grad) { + #if FXAA_GLSL_120 + return texture2DGrad(tex, pos.xy, grad, grad); + #endif + #if FXAA_GLSL_130 + return textureGrad(tex, pos.xy, grad, grad); + #endif + #if FXAA_HLSL_3 + return tex2Dgrad(tex, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), grad, grad); + #endif + #if FXAA_HLSL_4 + return tex.tex.SampleGrad(tex.smpl, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), grad, grad); + #endif +} +/*--------------------------------------------------------------------------*/ +float4 FxaaTexOff(FxaaTex tex, float2 pos, int2 off, float2 rcpFrame) { + #if FXAA_GLSL_120 + return texture2DLodOffset(tex, pos.xy, 0.0, off.xy); + #endif + #if FXAA_GLSL_130 + return textureLodOffset(tex, pos.xy, 0.0, off.xy); + #endif + #if FXAA_HLSL_3 + return tex2Dlod(tex, float4(UnityStereoScreenSpaceUVAdjust(pos.xy + (off * rcpFrame), _MainTex_ST), 0, 0)); + #endif + #if FXAA_HLSL_4 + return tex.tex.SampleLevel(tex.smpl, UnityStereoScreenSpaceUVAdjust(pos.xy, _MainTex_ST), 0.0, off.xy); + #endif +} + +/*============================================================================ + SRGB KNOBS +------------------------------------------------------------------------------ +FXAA_SRGB_ROP - Set to 1 when applying FXAA to an sRGB back buffer (DX10/11). + This will do the sRGB to linear transform, + as ROP will expect linear color from this shader, + and this shader works in non-linear color. +============================================================================*/ +#define FXAA_SRGB_ROP 0 + +/*============================================================================ + DEBUG KNOBS +------------------------------------------------------------------------------ +All debug knobs draw FXAA-untouched pixels in FXAA computed luma (monochrome). + +FXAA_DEBUG_PASSTHROUGH - Red for pixels which are filtered by FXAA with a + yellow tint on sub-pixel aliasing filtered by FXAA. +FXAA_DEBUG_HORZVERT - Blue for horizontal edges, gold for vertical edges. +FXAA_DEBUG_PAIR - Blue/green for the 2 pixel pair choice. +FXAA_DEBUG_NEGPOS - Red/blue for which side of center of span. +FXAA_DEBUG_OFFSET - Red/blue for -/+ x, gold/skyblue for -/+ y. +============================================================================*/ +#ifndef FXAA_DEBUG_PASSTHROUGH + #define FXAA_DEBUG_PASSTHROUGH 0 +#endif +#ifndef FXAA_DEBUG_HORZVERT + #define FXAA_DEBUG_HORZVERT 0 +#endif +#ifndef FXAA_DEBUG_PAIR + #define FXAA_DEBUG_PAIR 0 +#endif +#ifndef FXAA_DEBUG_NEGPOS + #define FXAA_DEBUG_NEGPOS 0 +#endif +#ifndef FXAA_DEBUG_OFFSET + #define FXAA_DEBUG_OFFSET 0 +#endif +/*--------------------------------------------------------------------------*/ +#if FXAA_DEBUG_PASSTHROUGH || FXAA_DEBUG_HORZVERT || FXAA_DEBUG_PAIR + #define FXAA_DEBUG 1 +#endif +#if FXAA_DEBUG_NEGPOS || FXAA_DEBUG_OFFSET + #define FXAA_DEBUG 1 +#endif +#ifndef FXAA_DEBUG + #define FXAA_DEBUG 0 +#endif + +/*============================================================================ + COMPILE-IN KNOBS +------------------------------------------------------------------------------ +FXAA_PRESET - Choose compile-in knob preset 0-5. +------------------------------------------------------------------------------ +FXAA_EDGE_THRESHOLD - The minimum amount of local contrast required + to apply algorithm. + 1.0/3.0 - too little + 1.0/4.0 - good start + 1.0/8.0 - applies to more edges + 1.0/16.0 - overkill +------------------------------------------------------------------------------ +FXAA_EDGE_THRESHOLD_MIN - Trims the algorithm from processing darks. + Perf optimization. + 1.0/32.0 - visible limit (smaller isn't visible) + 1.0/16.0 - good compromise + 1.0/12.0 - upper limit (seeing artifacts) +------------------------------------------------------------------------------ +FXAA_SEARCH_STEPS - Maximum number of search steps for end of span. +------------------------------------------------------------------------------ +FXAA_SEARCH_ACCELERATION - How much to accelerate search, + 1 - no acceleration + 2 - skip by 2 pixels + 3 - skip by 3 pixels + 4 - skip by 4 pixels +------------------------------------------------------------------------------ +FXAA_SEARCH_THRESHOLD - Controls when to stop searching. + 1.0/4.0 - seems to be the best quality wise +------------------------------------------------------------------------------ +FXAA_SUBPIX_FASTER - Turn on lower quality but faster subpix path. + Not recomended, but used in preset 0. +------------------------------------------------------------------------------ +FXAA_SUBPIX - Toggle subpix filtering. + 0 - turn off + 1 - turn on + 2 - turn on full (ignores FXAA_SUBPIX_TRIM and CAP) +------------------------------------------------------------------------------ +FXAA_SUBPIX_TRIM - Controls sub-pixel aliasing removal. + 1.0/2.0 - low removal + 1.0/3.0 - medium removal + 1.0/4.0 - default removal + 1.0/8.0 - high removal + 0.0 - complete removal +------------------------------------------------------------------------------ +FXAA_SUBPIX_CAP - Insures fine detail is not completely removed. + This is important for the transition of sub-pixel detail, + like fences and wires. + 3.0/4.0 - default (medium amount of filtering) + 7.0/8.0 - high amount of filtering + 1.0 - no capping of sub-pixel aliasing removal +============================================================================*/ +#ifndef FXAA_PRESET + #define FXAA_PRESET 3 +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 0) + #define FXAA_EDGE_THRESHOLD (1.0/4.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/12.0) + #define FXAA_SEARCH_STEPS 2 + #define FXAA_SEARCH_ACCELERATION 4 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 1 + #define FXAA_SUBPIX_CAP (2.0/3.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 1) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/16.0) + #define FXAA_SEARCH_STEPS 4 + #define FXAA_SEARCH_ACCELERATION 3 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 2) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 8 + #define FXAA_SEARCH_ACCELERATION 2 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 3) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 16 + #define FXAA_SEARCH_ACCELERATION 1 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 4) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 24 + #define FXAA_SEARCH_ACCELERATION 1 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#if (FXAA_PRESET == 5) + #define FXAA_EDGE_THRESHOLD (1.0/8.0) + #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) + #define FXAA_SEARCH_STEPS 32 + #define FXAA_SEARCH_ACCELERATION 1 + #define FXAA_SEARCH_THRESHOLD (1.0/4.0) + #define FXAA_SUBPIX 1 + #define FXAA_SUBPIX_FASTER 0 + #define FXAA_SUBPIX_CAP (3.0/4.0) + #define FXAA_SUBPIX_TRIM (1.0/4.0) +#endif +/*--------------------------------------------------------------------------*/ +#define FXAA_SUBPIX_TRIM_SCALE (1.0/(1.0 - FXAA_SUBPIX_TRIM)) + +/*============================================================================ + HELPERS +============================================================================*/ +// Return the luma, the estimation of luminance from rgb inputs. +// This approximates luma using one FMA instruction, +// skipping normalization and tossing out blue. +// FxaaLuma() will range 0.0 to 2.963210702. +float FxaaLuma(float3 rgb) { + return rgb.y * (0.587/0.299) + rgb.x; } +/*--------------------------------------------------------------------------*/ +float3 FxaaLerp3(float3 a, float3 b, float amountOfA) { + return (FxaaToFloat3(-amountOfA) * b) + + ((a * FxaaToFloat3(amountOfA)) + b); } +/*--------------------------------------------------------------------------*/ +// Support any extra filtering before returning color. +float3 FxaaFilterReturn(float3 rgb) { + #if FXAA_SRGB_ROP + // Do sRGB encoded value to linear conversion. + return FxaaSel3( + rgb * FxaaToFloat3(1.0/12.92), + FxaaPow3( + rgb * FxaaToFloat3(1.0/1.055) + FxaaToFloat3(0.055/1.055), + FxaaToFloat3(2.4)), + rgb > FxaaToFloat3(0.04045)); + #else + return rgb; + #endif +} + +/*============================================================================ + VERTEX SHADER +============================================================================*/ +float2 FxaaVertexShader( +// Both x and y range {-1.0 to 1.0 across screen}. +float2 inPos) { + float2 pos; + pos.xy = (inPos.xy * FxaaFloat2(0.5, 0.5)) + FxaaFloat2(0.5, 0.5); + return pos; } + +/*============================================================================ + + PIXEL SHADER + +============================================================================*/ +float3 FxaaPixelShader( +// Output of FxaaVertexShader interpolated across screen. +// xy -> actual texture position {0.0 to 1.0} +float2 pos, +// Input texture. +FxaaTex tex, +// RCPFRAME SHOULD PIXEL SHADER CONSTANTS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// {1.0/frameWidth, 1.0/frameHeight} +float2 rcpFrame) { + +/*---------------------------------------------------------------------------- + EARLY EXIT IF LOCAL CONTRAST BELOW EDGE DETECT LIMIT +------------------------------------------------------------------------------ +Majority of pixels of a typical image do not require filtering, +often pixels are grouped into blocks which could benefit from early exit +right at the beginning of the algorithm. +Given the following neighborhood, + + N + W M E + S + +If the difference in local maximum and minimum luma (contrast "range") +is lower than a threshold proportional to the maximum local luma ("rangeMax"), +then the shader early exits (no visible aliasing). +This threshold is clamped at a minimum value ("FXAA_EDGE_THRESHOLD_MIN") +to avoid processing in really dark areas. +----------------------------------------------------------------------------*/ + float3 rgbN = FxaaTexOff(tex, pos.xy, FxaaInt2( 0,-1), rcpFrame).xyz; + float3 rgbW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1, 0), rcpFrame).xyz; + float3 rgbM = FxaaTexOff(tex, pos.xy, FxaaInt2( 0, 0), rcpFrame).xyz; + float3 rgbE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1, 0), rcpFrame).xyz; + float3 rgbS = FxaaTexOff(tex, pos.xy, FxaaInt2( 0, 1), rcpFrame).xyz; + float lumaN = FxaaLuma(rgbN); + float lumaW = FxaaLuma(rgbW); + float lumaM = FxaaLuma(rgbM); + float lumaE = FxaaLuma(rgbE); + float lumaS = FxaaLuma(rgbS); + float rangeMin = min(lumaM, min(min(lumaN, lumaW), min(lumaS, lumaE))); + float rangeMax = max(lumaM, max(max(lumaN, lumaW), max(lumaS, lumaE))); + float range = rangeMax - rangeMin; + #if FXAA_DEBUG + float lumaO = lumaM / (1.0 + (0.587/0.299)); + #endif + if(range < max(FXAA_EDGE_THRESHOLD_MIN, rangeMax * FXAA_EDGE_THRESHOLD)) { + #if FXAA_DEBUG + return FxaaFilterReturn(FxaaToFloat3(lumaO)); + #endif + return FxaaFilterReturn(rgbM); } + #if FXAA_SUBPIX > 0 + #if FXAA_SUBPIX_FASTER + float3 rgbL = (rgbN + rgbW + rgbE + rgbS + rgbM) * + FxaaToFloat3(1.0/5.0); + #else + float3 rgbL = rgbN + rgbW + rgbM + rgbE + rgbS; + #endif + #endif + +/*---------------------------------------------------------------------------- + COMPUTE LOWPASS +------------------------------------------------------------------------------ +FXAA computes a local neighborhood lowpass value as follows, + + (N + W + E + S)/4 + +Then uses the ratio of the contrast range of the lowpass +and the range found in the early exit check, +as a sub-pixel aliasing detection filter. +When FXAA detects sub-pixel aliasing (such as single pixel dots), +it later blends in "blendL" amount +of a lowpass value (computed in the next section) to the final result. +----------------------------------------------------------------------------*/ + #if FXAA_SUBPIX != 0 + float lumaL = (lumaN + lumaW + lumaE + lumaS) * 0.25; + float rangeL = abs(lumaL - lumaM); + #endif + #if FXAA_SUBPIX == 1 + float blendL = max(0.0, + (rangeL / range) - FXAA_SUBPIX_TRIM) * FXAA_SUBPIX_TRIM_SCALE; + blendL = min(FXAA_SUBPIX_CAP, blendL); + #endif + #if FXAA_SUBPIX == 2 + float blendL = rangeL / range; + #endif + #if FXAA_DEBUG_PASSTHROUGH + #if FXAA_SUBPIX == 0 + float blendL = 0.0; + #endif + return FxaaFilterReturn( + FxaaFloat3(1.0, blendL/FXAA_SUBPIX_CAP, 0.0)); + #endif + +/*---------------------------------------------------------------------------- + CHOOSE VERTICAL OR HORIZONTAL SEARCH +------------------------------------------------------------------------------ +FXAA uses the following local neighborhood, + + NW N NE + W M E + SW S SE + +To compute an edge amount for both vertical and horizontal directions. +Note edge detect filters like Sobel fail on single pixel lines through M. +FXAA takes the weighted average magnitude of the high-pass values +for rows and columns as an indication of local edge amount. + +A lowpass value for anti-sub-pixel-aliasing is computed as + (N+W+E+S+M+NW+NE+SW+SE)/9. +This full box pattern has higher quality than other options. + +Note following this block, both vertical and horizontal cases +flow in parallel (reusing the horizontal variables). +----------------------------------------------------------------------------*/ + float3 rgbNW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1,-1), rcpFrame).xyz; + float3 rgbNE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1,-1), rcpFrame).xyz; + float3 rgbSW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1, 1), rcpFrame).xyz; + float3 rgbSE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1, 1), rcpFrame).xyz; + #if (FXAA_SUBPIX_FASTER == 0) && (FXAA_SUBPIX > 0) + rgbL += (rgbNW + rgbNE + rgbSW + rgbSE); + rgbL *= FxaaToFloat3(1.0/9.0); + #endif + float lumaNW = FxaaLuma(rgbNW); + float lumaNE = FxaaLuma(rgbNE); + float lumaSW = FxaaLuma(rgbSW); + float lumaSE = FxaaLuma(rgbSE); + float edgeVert = + abs((0.25 * lumaNW) + (-0.5 * lumaN) + (0.25 * lumaNE)) + + abs((0.50 * lumaW ) + (-1.0 * lumaM) + (0.50 * lumaE )) + + abs((0.25 * lumaSW) + (-0.5 * lumaS) + (0.25 * lumaSE)); + float edgeHorz = + abs((0.25 * lumaNW) + (-0.5 * lumaW) + (0.25 * lumaSW)) + + abs((0.50 * lumaN ) + (-1.0 * lumaM) + (0.50 * lumaS )) + + abs((0.25 * lumaNE) + (-0.5 * lumaE) + (0.25 * lumaSE)); + bool horzSpan = edgeHorz >= edgeVert; + #if FXAA_DEBUG_HORZVERT + if(horzSpan) return FxaaFilterReturn(FxaaFloat3(1.0, 0.75, 0.0)); + else return FxaaFilterReturn(FxaaFloat3(0.0, 0.50, 1.0)); + #endif + float lengthSign = horzSpan ? -rcpFrame.y : -rcpFrame.x; + if(!horzSpan) lumaN = lumaW; + if(!horzSpan) lumaS = lumaE; + float gradientN = abs(lumaN - lumaM); + float gradientS = abs(lumaS - lumaM); + lumaN = (lumaN + lumaM) * 0.5; + lumaS = (lumaS + lumaM) * 0.5; + +/*---------------------------------------------------------------------------- + CHOOSE SIDE OF PIXEL WHERE GRADIENT IS HIGHEST +------------------------------------------------------------------------------ +This chooses a pixel pair. +For "horzSpan == true" this will be a vertical pair, + + [N] N + [M] or [M] + S [S] + +Note following this block, both {N,M} and {S,M} cases +flow in parallel (reusing the {N,M} variables). + +This pair of image rows or columns is searched below +in the positive and negative direction +until edge status changes +(or the maximum number of search steps is reached). +----------------------------------------------------------------------------*/ + bool pairN = gradientN >= gradientS; + #if FXAA_DEBUG_PAIR + if(pairN) return FxaaFilterReturn(FxaaFloat3(0.0, 0.0, 1.0)); + else return FxaaFilterReturn(FxaaFloat3(0.0, 1.0, 0.0)); + #endif + if(!pairN) lumaN = lumaS; + if(!pairN) gradientN = gradientS; + if(!pairN) lengthSign *= -1.0; + float2 posN; + posN.x = pos.x + (horzSpan ? 0.0 : lengthSign * 0.5); + posN.y = pos.y + (horzSpan ? lengthSign * 0.5 : 0.0); + +/*---------------------------------------------------------------------------- + CHOOSE SEARCH LIMITING VALUES +------------------------------------------------------------------------------ +Search limit (+/- gradientN) is a function of local gradient. +----------------------------------------------------------------------------*/ + gradientN *= FXAA_SEARCH_THRESHOLD; + +/*---------------------------------------------------------------------------- + SEARCH IN BOTH DIRECTIONS UNTIL FIND LUMA PAIR AVERAGE IS OUT OF RANGE +------------------------------------------------------------------------------ +This loop searches either in vertical or horizontal directions, +and in both the negative and positive direction in parallel. +This loop fusion is faster than searching separately. + +The search is accelerated using FXAA_SEARCH_ACCELERATION length box filter +via anisotropic filtering with specified texture gradients. +----------------------------------------------------------------------------*/ + float2 posP = posN; + float2 offNP = horzSpan ? + FxaaFloat2(rcpFrame.x, 0.0) : + FxaaFloat2(0.0f, rcpFrame.y); + float lumaEndN = lumaN; + float lumaEndP = lumaN; + bool doneN = false; + bool doneP = false; + #if FXAA_SEARCH_ACCELERATION == 1 + posN += offNP * FxaaFloat2(-1.0, -1.0); + posP += offNP * FxaaFloat2( 1.0, 1.0); + #endif + #if FXAA_SEARCH_ACCELERATION == 2 + posN += offNP * FxaaFloat2(-1.5, -1.5); + posP += offNP * FxaaFloat2( 1.5, 1.5); + offNP *= FxaaFloat2(2.0, 2.0); + #endif + #if FXAA_SEARCH_ACCELERATION == 3 + posN += offNP * FxaaFloat2(-2.0, -2.0); + posP += offNP * FxaaFloat2( 2.0, 2.0); + offNP *= FxaaFloat2(3.0, 3.0); + #endif + #if FXAA_SEARCH_ACCELERATION == 4 + posN += offNP * FxaaFloat2(-2.5, -2.5); + posP += offNP * FxaaFloat2( 2.5, 2.5); + offNP *= FxaaFloat2(4.0, 4.0); + #endif + for(int i = 0; i < FXAA_SEARCH_STEPS; i++) { + #if FXAA_SEARCH_ACCELERATION == 1 + if(!doneN) lumaEndN = + FxaaLuma(FxaaTexLod0(tex, posN.xy).xyz); + if(!doneP) lumaEndP = + FxaaLuma(FxaaTexLod0(tex, posP.xy).xyz); + #else + if(!doneN) lumaEndN = + FxaaLuma(FxaaTexGrad(tex, posN.xy, offNP).xyz); + if(!doneP) lumaEndP = + FxaaLuma(FxaaTexGrad(tex, posP.xy, offNP).xyz); + #endif + doneN = doneN || (abs(lumaEndN - lumaN) >= gradientN); + doneP = doneP || (abs(lumaEndP - lumaN) >= gradientN); + if(doneN && doneP) break; + if(!doneN) posN -= offNP; + if(!doneP) posP += offNP; } + +/*---------------------------------------------------------------------------- + HANDLE IF CENTER IS ON POSITIVE OR NEGATIVE SIDE +------------------------------------------------------------------------------ +FXAA uses the pixel's position in the span +in combination with the values (lumaEnd*) at the ends of the span, +to determine filtering. + +This step computes which side of the span the pixel is on. +On negative side if dstN < dstP, + + posN pos posP + |-----------|------|------------------| + | | | | + |<--dstN--->|<---------dstP---------->| + | + span center + +----------------------------------------------------------------------------*/ + float dstN = horzSpan ? pos.x - posN.x : pos.y - posN.y; + float dstP = horzSpan ? posP.x - pos.x : posP.y - pos.y; + bool directionN = dstN < dstP; + #if FXAA_DEBUG_NEGPOS + if(directionN) return FxaaFilterReturn(FxaaFloat3(1.0, 0.0, 0.0)); + else return FxaaFilterReturn(FxaaFloat3(0.0, 0.0, 1.0)); + #endif + lumaEndN = directionN ? lumaEndN : lumaEndP; + +/*---------------------------------------------------------------------------- + CHECK IF PIXEL IS IN SECTION OF SPAN WHICH GETS NO FILTERING +------------------------------------------------------------------------------ +If both the pair luma at the end of the span (lumaEndN) +and middle pixel luma (lumaM) +are on the same side of the middle pair average luma (lumaN), +then don't filter. + +Cases, + +(1.) "L", + + lumaM + | + V XXXXXXXX <- other line averaged + XXXXXXX[X]XXXXXXXXXXX <- source pixel line + | . | + -------------------------- + [ ]xxxxxx[x]xx[X]XXXXXX <- pair average + -------------------------- + ^ ^ ^ ^ + | | | | + . |<---->|<---------- no filter region + . | | | + . center | | + . | lumaEndN + . | . + . lumaN . + . . + |<--- span -->| + + +(2.) "^" and "-", + + <- other line averaged + XXXXX[X]XXX <- source pixel line + | | | + -------------------------- + [ ]xxxx[x]xx[ ] <- pair average + -------------------------- + | | | + |<--->|<--->|<---------- filter both sides + + +(3.) "v" and inverse of "-", + + XXXXXX XXXXXXXXX <- other line averaged + XXXXXXXXXXX[X]XXXXXXXXXXXX <- source pixel line + | | | + -------------------------- + XXXX[X]xxxx[x]xx[X]XXXXXXX <- pair average + -------------------------- + | | | + |<--->|<--->|<---------- don't filter both! + + +Note the "v" case for FXAA requires no filtering. +This is because the inverse of the "-" case is the "v". +Filtering "v" case turns open spans like this, + + XXXXXXXXX + +Into this (which is not desired), + + x+. .+x + XXXXXXXXX + +----------------------------------------------------------------------------*/ + if(((lumaM - lumaN) < 0.0) == ((lumaEndN - lumaN) < 0.0)) + lengthSign = 0.0; + +/*---------------------------------------------------------------------------- + COMPUTE SUB-PIXEL OFFSET AND FILTER SPAN +------------------------------------------------------------------------------ +FXAA filters using a bilinear texture fetch offset +from the middle pixel M towards the center of the pair (NM below). +Maximum filtering will be half way between pair. +Reminder, at this point in the code, +the {N,M} pair is also reused for all cases: {S,M}, {W,M}, and {E,M}. + + +-------+ + | | 0.5 offset + | N | | + | | V + +-------+....--- + | | + | M...|....--- + | | ^ + +-------+ | + . . 0.0 offset + . S . + . . + ......... + +Position on span is used to compute sub-pixel filter offset using simple ramp, + + posN posP + |\ |<------- 0.5 pixel offset into pair pixel + | \ | + | \ | + ---.......|...\..........|<------- 0.25 pixel offset into pair pixel + ^ | ^\ | + | | | \ | + V | | \ | + ---.......|===|==========|<------- 0.0 pixel offset (ie M pixel) + ^ . | ^ . + | . pos | . + | . . | . + | . . center . + | . . . + | |<->|<---------.-------- dstN + | . . . + | . |<-------->|<------- dstP + | . . + | |<------------>|<------- spanLength + | + subPixelOffset + +----------------------------------------------------------------------------*/ + float spanLength = (dstP + dstN); + dstN = directionN ? dstN : dstP; + float subPixelOffset = (0.5 + (dstN * (-1.0/spanLength))) * lengthSign; + #if FXAA_DEBUG_OFFSET + float ox = horzSpan ? 0.0 : subPixelOffset*2.0/rcpFrame.x; + float oy = horzSpan ? subPixelOffset*2.0/rcpFrame.y : 0.0; + if(ox < 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(1.0, 0.0, 0.0), -ox)); + if(ox > 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(0.0, 0.0, 1.0), ox)); + if(oy < 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(1.0, 0.6, 0.2), -oy)); + if(oy > 0.0) return FxaaFilterReturn( + FxaaLerp3(FxaaToFloat3(lumaO), + FxaaFloat3(0.2, 0.6, 1.0), oy)); + return FxaaFilterReturn(FxaaFloat3(lumaO, lumaO, lumaO)); + #endif + float3 rgbF = FxaaTexLod0(tex, FxaaFloat2( + pos.x + (horzSpan ? 0.0 : subPixelOffset), + pos.y + (horzSpan ? subPixelOffset : 0.0))).xyz; + #if FXAA_SUBPIX == 0 + return FxaaFilterReturn(rgbF); + #else + return FxaaFilterReturn(FxaaLerp3(rgbL, rgbF, blendL)); + #endif +} + + + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +v2f vert (appdata_img v) +{ + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + return o; +} + +sampler2D _MainTex; +float4 _MainTex_TexelSize; + +float4 frag (v2f i) : SV_Target +{ + return float4(FxaaPixelShader(i.uv.xy, _MainTex, _MainTex_TexelSize.xy).xyz, 0.0f); +} + +ENDCG + } +} + +Fallback "Hidden/FXAA II" +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset3.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset3.shader.meta new file mode 100644 index 0000000..053bdbf --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/FXAAPreset3.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: c182fa94a5a0a4c02870641efcd38cd5 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/NFAA.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/NFAA.shader new file mode 100644 index 0000000..a633739 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/NFAA.shader @@ -0,0 +1,149 @@ + +Shader "Hidden/NFAA" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _BlurTex ("Base (RGB)", 2D) = "white" {} + +} + +CGINCLUDE + +#include "UnityCG.cginc" + +uniform sampler2D _MainTex; +uniform float4 _MainTex_TexelSize; +half4 _MainTex_ST; +uniform float _OffsetScale; +uniform float _BlurRadius; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv[8] : TEXCOORD0; +}; + + v2f vert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + float2 uv = v.texcoord.xy; + + float2 up = float2(0.0, _MainTex_TexelSize.y) * _OffsetScale; + float2 right = float2(_MainTex_TexelSize.x, 0.0) * _OffsetScale; + + o.uv[0].xy = uv + up; + o.uv[1].xy = uv - up; + o.uv[2].xy = uv + right; + o.uv[3].xy = uv - right; + o.uv[4].xy = uv - right + up; + o.uv[5].xy = uv - right -up; + o.uv[6].xy = uv + right + up; + o.uv[7].xy = uv + right -up; + + return o; + } + + half4 frag (v2f i) : SV_Target + { + // get luminance values + // maybe: experiment with different luminance calculations + float topL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0], _MainTex_ST)).rgb ); + float bottomL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1], _MainTex_ST)).rgb ); + float rightL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[2], _MainTex_ST)).rgb ); + float leftL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[3], _MainTex_ST)).rgb ); + float leftTopL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4], _MainTex_ST)).rgb ); + float leftBottomL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[5], _MainTex_ST)).rgb ); + float rightBottomL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[6], _MainTex_ST)).rgb ); + float rightTopL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[7], _MainTex_ST)).rgb ); + + // 2 triangle subtractions + float sum0 = dot(float3(1,1,1), float3(rightTopL,bottomL,leftTopL)); + float sum1 = dot(float3(1,1,1), float3(leftBottomL,topL,rightBottomL)); + float sum2 = dot(float3(1,1,1), float3(leftTopL,rightL,leftBottomL)); + float sum3 = dot(float3(1,1,1), float3(rightBottomL,leftL,rightTopL)); + + // figure out "normal" + float2 blurDir = half2((sum0-sum1), (sum3-sum2)); + blurDir *= _MainTex_TexelSize.xy * _BlurRadius; + + // reconstruct normal uv + float2 uv_ = (i.uv[0] + i.uv[1]) * 0.5; + + float4 returnColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_, _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_+ blurDir.xy, _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_ - blurDir.xy, _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_ + float2(blurDir.x, -blurDir.y), _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_ - float2(blurDir.x, -blurDir.y), _MainTex_ST)); + + return returnColor * 0.2; + } + + half4 fragDebug (v2f i) : SV_Target + { + // get luminance values + // maybe: experiment with different luminance calculations + float topL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0], _MainTex_ST)).rgb ); + float bottomL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1], _MainTex_ST)).rgb ); + float rightL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[2], _MainTex_ST)).rgb ); + float leftL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[3], _MainTex_ST)).rgb ); + float leftTopL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4], _MainTex_ST)).rgb ); + float leftBottomL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[5], _MainTex_ST)).rgb ); + float rightBottomL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[6], _MainTex_ST)).rgb ); + float rightTopL = Luminance( tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[7], _MainTex_ST)).rgb ); + + // 2 triangle subtractions + float sum0 = dot(float3(1,1,1), float3(rightTopL,bottomL,leftTopL)); + float sum1 = dot(float3(1,1,1), float3(leftBottomL,topL,rightBottomL)); + float sum2 = dot(float3(1,1,1), float3(leftTopL,rightL,leftBottomL)); + float sum3 = dot(float3(1,1,1), float3(rightBottomL,leftL,rightTopL)); + + // figure out "normal" + float2 blurDir = half2((sum0-sum1), (sum3-sum2)); + blurDir *= _MainTex_TexelSize.xy * _BlurRadius; + + // reconstruct normal uv + float2 uv_ = (i.uv[0] + i.uv[1]) * 0.5; + + float4 returnColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_, _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_+ blurDir.xy, _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_ - blurDir.xy, _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_ + float2(blurDir.x, -blurDir.y), _MainTex_ST)); + returnColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(uv_ - float2(blurDir.x, -blurDir.y), _MainTex_ST)); + + blurDir = half2((sum0-sum1), (sum3-sum2)) * _BlurRadius; + return half4(normalize( half3(blurDir,1) * 0.5 + 0.5), 1); + return returnColor * 0.2; + } + +ENDCG + +SubShader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma exclude_renderers d3d11_9x + + ENDCG + } + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragDebug + #pragma target 3.0 + #pragma exclude_renderers d3d11_9x + + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/NFAA.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/NFAA.shader.meta new file mode 100644 index 0000000..af7b4b6 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/NFAA.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: ce0cb2621f6d84e21a87414e471a3cce +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/SSAA.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/SSAA.shader new file mode 100644 index 0000000..04f32b7 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/SSAA.shader @@ -0,0 +1,86 @@ + +Shader "Hidden/SSAA" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} +} + +// very simple & fast AA by Emmanuel Julien + +SubShader { + Pass { + + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + uniform sampler2D _MainTex; + uniform float4 _MainTex_TexelSize; + half4 _MainTex_ST; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv[5] : TEXCOORD0; + }; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + float2 uv = v.texcoord.xy; + + float w = 1.75; + + float2 up = float2(0.0, _MainTex_TexelSize.y) * w; + float2 right = float2(_MainTex_TexelSize.x, 0.0) * w; + + o.uv[0].xy = uv - up; + o.uv[1].xy = uv - right; + o.uv[2].xy = uv + right; + o.uv[3].xy = uv + up; + + o.uv[4].xy = uv; + + return o; + } + + half4 frag (v2f i) : SV_Target + { + half4 outColor; + + float t = Luminance( tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0], _MainTex_ST)).xyz ); + float l = Luminance( tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1], _MainTex_ST)).xyz); + float r = Luminance( tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[2], _MainTex_ST)).xyz); + float b = Luminance( tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[3], _MainTex_ST)).xyz); + + half2 n = half2( -( t - b ), r - l ); + float nl = length( n ); + + if ( nl < (1.0 / 16.0) ) + outColor = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4], _MainTex_ST) ); + else { + n *= _MainTex_TexelSize.xy / nl; + + half4 o = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4], _MainTex_ST)); + half4 t0 = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4] + n * 0.5, _MainTex_ST)) * 0.9; + half4 t1 = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4] - n * 0.5, _MainTex_ST)) * 0.9; + half4 t2 = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4] + n, _MainTex_ST)) * 0.75; + half4 t3 = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4] - n, _MainTex_ST)) * 0.75; + + outColor = (o + t0 + t1 + t2 + t3) / 4.3; + } + + return outColor; + } + + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/SSAA.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/SSAA.shader.meta new file mode 100644 index 0000000..e972317 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_Antialiasing/SSAA.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: b3728d1488b02490cbd196c7941bf1f8 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares.meta new file mode 100644 index 0000000..3bdce38 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d6ef58fc6f637406bbe6814a19c377f8 diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/Blend.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/Blend.shader new file mode 100644 index 0000000..d73b379 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/Blend.shader @@ -0,0 +1,116 @@ +Shader "Hidden/Blend" { + Properties { + _MainTex ("Screen Blended", 2D) = "" {} + _ColorBuffer ("Color", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv[2] : TEXCOORD0; + }; + struct v2f_mt { + float4 pos : SV_POSITION; + float2 uv[4] : TEXCOORD0; + }; + + sampler2D _ColorBuffer; + sampler2D _MainTex; + + half _Intensity; + half4 _ColorBuffer_TexelSize; + half4 _ColorBuffer_ST; + half4 _MainTex_TexelSize; + half4 _MainTex_ST; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv[0] = v.texcoord.xy; + o.uv[1] = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_ColorBuffer_TexelSize.y < 0) + o.uv[1].y = 1-o.uv[1].y; + #endif + + return o; + } + + v2f_mt vertMultiTap( appdata_img v ) { + v2f_mt o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv[0] = v.texcoord.xy + _MainTex_TexelSize.xy * 0.5; + o.uv[1] = v.texcoord.xy - _MainTex_TexelSize.xy * 0.5; + o.uv[2] = v.texcoord.xy - _MainTex_TexelSize.xy * half2(1,-1) * 0.5; + o.uv[3] = v.texcoord.xy + _MainTex_TexelSize.xy * half2(1,-1) * 0.5; + return o; + } + + half4 fragScreen (v2f i) : SV_Target { + half4 toBlend = saturate (tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0], _MainTex_ST)) * _Intensity); + return 1-(1-toBlend)*(1-tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[1], _ColorBuffer_ST))); + } + + half4 fragAdd (v2f i) : SV_Target { + return tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)) * _Intensity + tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[1], _ColorBuffer_ST)); + } + + half4 fragVignetteBlend (v2f i) : SV_Target { + return tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)) * tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[0], _ColorBuffer_ST)); + } + + half4 fragMultiTap (v2f_mt i) : SV_Target { + half4 outColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)); + outColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1].xy, _MainTex_ST)); + outColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[2].xy, _MainTex_ST)); + outColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[3].xy, _MainTex_ST)); + return outColor * 0.25; + } + + ENDCG + +Subshader { + ZTest Always Cull Off ZWrite Off + + // 0: nicer & softer "screen" blend mode + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragScreen + ENDCG + } + + // 1: simple "add" blend mode + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAdd + ENDCG + } + // 2: used for "stable" downsampling + Pass { + + CGPROGRAM + #pragma vertex vertMultiTap + #pragma fragment fragMultiTap + ENDCG + } + // 3: vignette blending + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragVignetteBlend + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/Blend.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/Blend.shader.meta new file mode 100644 index 0000000..e9a742b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/Blend.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 53b3960ee3d3d4a5caa8d5473d120187 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendForBloom.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendForBloom.shader new file mode 100644 index 0000000..8e4b020 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendForBloom.shader @@ -0,0 +1,222 @@ +Shader "Hidden/BlendForBloom" { + Properties { + _MainTex ("Screen Blended", 2D) = "" {} + _ColorBuffer ("Color", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv[2] : TEXCOORD0; + }; + struct v2f_mt { + float4 pos : SV_POSITION; + float2 uv[5] : TEXCOORD0; + }; + + sampler2D _ColorBuffer; + sampler2D _MainTex; + + half _Intensity; + half4 _ColorBuffer_TexelSize; + half4 _ColorBuffer_ST; + half4 _MainTex_TexelSize; + half4 _MainTex_ST; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv[0] = v.texcoord.xy; + o.uv[1] = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_ColorBuffer_TexelSize.y < 0) + o.uv[1].y = 1-o.uv[1].y; + #endif + + return o; + } + + v2f_mt vertMultiTap( appdata_img v ) { + v2f_mt o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv[4] = v.texcoord.xy; + o.uv[0] = v.texcoord.xy + _MainTex_TexelSize.xy * 0.5; + o.uv[1] = v.texcoord.xy - _MainTex_TexelSize.xy * 0.5; + o.uv[2] = v.texcoord.xy - _MainTex_TexelSize.xy * half2(1,-1) * 0.5; + o.uv[3] = v.texcoord.xy + _MainTex_TexelSize.xy * half2(1,-1) * 0.5; + return o; + } + + half4 fragScreen (v2f i) : SV_Target { + half4 addedbloom = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)) * _Intensity; + half4 screencolor = tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[1], _ColorBuffer_ST)); + return 1-(1-addedbloom)*(1-screencolor); + } + + half4 fragScreenCheap(v2f i) : SV_Target { + half4 addedbloom = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)) * _Intensity; + half4 screencolor = tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[1], _ColorBuffer_ST)); + return 1-(1-addedbloom)*(1-screencolor); + } + + half4 fragAdd (v2f i) : SV_Target { + half4 addedbloom = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)); + half4 screencolor = tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[1], _ColorBuffer_ST)); + return _Intensity * addedbloom + screencolor; + } + + half4 fragAddCheap (v2f i) : SV_Target { + half4 addedbloom = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)); + half4 screencolor = tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[1], _ColorBuffer_ST)); + return _Intensity * addedbloom + screencolor; + } + + half4 fragVignetteMul (v2f i) : SV_Target { + return tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)) * tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[0], _ColorBuffer_ST)); + } + + half4 fragVignetteBlend (v2f i) : SV_Target { + return half4(1,1,1, tex2D(_ColorBuffer, UnityStereoScreenSpaceUVAdjust(i.uv[0], _ColorBuffer_ST)).r); + } + + half4 fragClear (v2f i) : SV_Target { + return 0; + } + + half4 fragAddOneOne (v2f i) : SV_Target { + half4 addedColors = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)); + return addedColors * _Intensity; + } + + half4 frag1Tap (v2f i) : SV_Target { + return tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)); + } + + half4 fragMultiTapMax (v2f_mt i) : SV_Target { + half4 outColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[4].xy, _MainTex_ST)); + outColor = max(outColor, tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST))); + outColor = max(outColor, tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1].xy, _MainTex_ST))); + outColor = max(outColor, tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[2].xy, _MainTex_ST))); + outColor = max(outColor, tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[3].xy, _MainTex_ST))); + return outColor; + } + + half4 fragMultiTapBlur (v2f_mt i) : SV_Target { + half4 outColor = 0; + outColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)); + outColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1].xy, _MainTex_ST)); + outColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[2].xy, _MainTex_ST)); + outColor += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[3].xy, _MainTex_ST)); + return outColor/4; + } + + ENDCG + +Subshader { + ZTest Always Cull Off ZWrite Off + + // 0: nicer & softer "screen" blend mode + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragScreen + ENDCG + } + + // 1: "add" blend mode + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAdd + ENDCG + } + // 2: several taps, maxxed + Pass { + + CGPROGRAM + #pragma vertex vertMultiTap + #pragma fragment fragMultiTapMax + ENDCG + } + // 3: vignette blending + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragVignetteMul + ENDCG + } + // 4: nicer & softer "screen" blend mode(cheapest) + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragScreenCheap + ENDCG + } + // 5: "add" blend mode (cheapest) + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAddCheap + ENDCG + } + // 6: used for "stable" downsampling (blur) + Pass { + + CGPROGRAM + #pragma vertex vertMultiTap + #pragma fragment fragMultiTapBlur + ENDCG + } + // 7: vignette blending (blend to dest) + Pass { + + Blend Zero SrcAlpha + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragVignetteBlend + ENDCG + } + // 8: clear + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragClear + ENDCG + } + // 9: fragAddOneOne + Pass { + + Blend One One + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAddOneOne + ENDCG + } + // 10: max blend + Pass { + + BlendOp Max + Blend One One + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag1Tap + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendForBloom.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendForBloom.shader.meta new file mode 100644 index 0000000..1737d9f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendForBloom.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 7856cbff0a0ca45c787d5431eb805bb0 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendOneOne.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendOneOne.shader new file mode 100644 index 0000000..433a772 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendOneOne.shader @@ -0,0 +1,49 @@ +Shader "Hidden/BlendOneOne" { + Properties { + _MainTex ("-", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + half4 _MainTex_ST; + half _Intensity; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + return o; + } + + half4 frag(v2f i) : SV_Target { + return tex2D(_MainTex, i.uv) * _Intensity; + } + + ENDCG + +Subshader { + + Pass { + BlendOp Add + Blend One One + + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendOneOne.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendOneOne.shader.meta new file mode 100644 index 0000000..007df7f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlendOneOne.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: f7898d203e9b94c0dbe2bf9dd5cb32c0 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlurAndFlares.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlurAndFlares.shader new file mode 100644 index 0000000..25d07a4 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlurAndFlares.shader @@ -0,0 +1,203 @@ +Shader "Hidden/BlurAndFlares" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + _NonBlurredTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + }; + + struct v2f_opts { + half4 pos : SV_POSITION; + half2 uv[7] : TEXCOORD0; + }; + + struct v2f_blur { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half4 uv01 : TEXCOORD1; + half4 uv23 : TEXCOORD2; + half4 uv45 : TEXCOORD3; + half4 uv67 : TEXCOORD4; + }; + + half4 _Offsets; + half4 _TintColor; + + half _StretchWidth; + half2 _Threshhold; + half _Saturation; + + half4 _MainTex_TexelSize; + half4 _MainTex_ST; + + sampler2D _MainTex; + sampler2D _NonBlurredTex; + + v2f vert (appdata_img v) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + return o; + } + + v2f_blur vertWithMultiCoords2 (appdata_img v) { + v2f_blur o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uv01 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * half4(1,1, -1,-1), _MainTex_ST); + o.uv23 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * half4(1,1, -1,-1) * 2.0, _MainTex_ST); + o.uv45 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * half4(1,1, -1,-1) * 3.0, _MainTex_ST); + o.uv67 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * half4(1,1, -1,-1) * 4.0, _MainTex_ST); + o.uv67 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * half4(1,1, -1,-1) * 5.0, _MainTex_ST); + return o; + } + + v2f_opts vertStretch (appdata_img v) { + v2f_opts o; + o.pos = UnityObjectToClipPos(v.vertex); + half b = _StretchWidth; + o.uv[0] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uv[1] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + b * 2.0 * _Offsets.xy, _MainTex_ST); + o.uv[2] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - b * 2.0 * _Offsets.xy, _MainTex_ST); + o.uv[3] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + b * 4.0 * _Offsets.xy, _MainTex_ST); + o.uv[4] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - b * 4.0 * _Offsets.xy, _MainTex_ST); + o.uv[5] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + b * 6.0 * _Offsets.xy, _MainTex_ST); + o.uv[6] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - b * 6.0 * _Offsets.xy, _MainTex_ST); + return o; + } + + v2f_opts vertWithMultiCoords (appdata_img v) { + v2f_opts o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv[0] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uv[1] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 0.5 * _MainTex_TexelSize.xy * _Offsets.xy, _MainTex_ST); + o.uv[2] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - 0.5 * _MainTex_TexelSize.xy * _Offsets.xy, _MainTex_ST); + o.uv[3] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 1.5 * _MainTex_TexelSize.xy * _Offsets.xy, _MainTex_ST); + o.uv[4] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - 1.5 * _MainTex_TexelSize.xy * _Offsets.xy, _MainTex_ST); + o.uv[5] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 2.5 * _MainTex_TexelSize.xy * _Offsets.xy, _MainTex_ST); + o.uv[6] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - 2.5 * _MainTex_TexelSize.xy * _Offsets.xy, _MainTex_ST); + return o; + } + + half4 fragPostNoBlur (v2f i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv); + return color * 1.0/(1.0 + Luminance(color.rgb) + 0.5); // this also makes it a little noisy + } + + half4 fragGaussBlur (v2f_blur i) : SV_Target { + half4 color = half4 (0,0,0,0); + color += 0.225 * tex2D (_MainTex, i.uv); + color += 0.150 * tex2D (_MainTex, i.uv01.xy); + color += 0.150 * tex2D (_MainTex, i.uv01.zw); + color += 0.110 * tex2D (_MainTex, i.uv23.xy); + color += 0.110 * tex2D (_MainTex, i.uv23.zw); + color += 0.075 * tex2D (_MainTex, i.uv45.xy); + color += 0.075 * tex2D (_MainTex, i.uv45.zw); + color += 0.0525 * tex2D (_MainTex, i.uv67.xy); + color += 0.0525 * tex2D (_MainTex, i.uv67.zw); + return color; + } + + half4 fragPreAndCut (v2f_opts i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv[0]); + color += tex2D (_MainTex, i.uv[1]); + color += tex2D (_MainTex, i.uv[2]); + color += tex2D (_MainTex, i.uv[3]); + color += tex2D (_MainTex, i.uv[4]); + color += tex2D (_MainTex, i.uv[5]); + color += tex2D (_MainTex, i.uv[6]); + color = max(color / 7.0 - _Threshhold.xxxx, float4(0,0,0,0)); + half lum = Luminance(color.rgb); + color.rgb = lerp(half3(lum,lum,lum), color.rgb, _Saturation) * _TintColor.rgb; + return color; + } + + half4 fragStretch (v2f_opts i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv[0]); + color = max (color, tex2D (_MainTex, i.uv[1])); + color = max (color, tex2D (_MainTex, i.uv[2])); + color = max (color, tex2D (_MainTex, i.uv[3])); + color = max (color, tex2D (_MainTex, i.uv[4])); + color = max (color, tex2D (_MainTex, i.uv[5])); + color = max (color, tex2D (_MainTex, i.uv[6])); + return color; + } + + half4 fragPost (v2f_opts i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv[0]); + color += tex2D (_MainTex, i.uv[1]); + color += tex2D (_MainTex, i.uv[2]); + color += tex2D (_MainTex, i.uv[3]); + color += tex2D (_MainTex, i.uv[4]); + color += tex2D (_MainTex, i.uv[5]); + color += tex2D (_MainTex, i.uv[6]); + return color * 1.0/(7.0 + Luminance(color.rgb) + 0.5); // this also makes it a little noisy + } + + ENDCG + +Subshader { + ZTest Always Cull Off ZWrite Off + Pass { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragPostNoBlur + + ENDCG + } + + Pass { + + CGPROGRAM + + #pragma vertex vertStretch + #pragma fragment fragStretch + + ENDCG + } + + // 2 + Pass { + + CGPROGRAM + + #pragma vertex vertWithMultiCoords + #pragma fragment fragPreAndCut + + ENDCG + } + + // 3 + Pass { + + CGPROGRAM + + #pragma vertex vertWithMultiCoords + #pragma fragment fragPost + + ENDCG + } + // 4 + Pass { + + CGPROGRAM + + #pragma vertex vertWithMultiCoords2 + #pragma fragment fragGaussBlur + + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlurAndFlares.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlurAndFlares.shader.meta new file mode 100644 index 0000000..a0ed0ba --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BlurAndFlares.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: be6e39cf196f146d5be72fbefb18ed75 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter.shader new file mode 100644 index 0000000..e103949 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter.shader @@ -0,0 +1,58 @@ +Shader "Hidden/BrightPassFilterForBloom" +{ + Properties + { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + half4 _MainTex_ST; + + half4 threshold; + half useSrcAlphaAsMask; + + v2f vert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + return o; + } + + half4 frag(v2f i) : SV_Target + { + half4 color = tex2D(_MainTex, i.uv); + //color = color * saturate((color-threshhold.x) * 75.0); // didn't go well with HDR and din't make sense + color = color * lerp(1.0, color.a, useSrcAlphaAsMask); + color = max(half4(0,0,0,0), color-threshold.x); + return color; + } + + ENDCG + + Subshader + { + Pass + { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + ENDCG + } + } + Fallback off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter.shader.meta new file mode 100644 index 0000000..35204d1 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 186c4c0d31e314f049595dcbaf4ca129 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter2.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter2.shader new file mode 100644 index 0000000..23bc853 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter2.shader @@ -0,0 +1,75 @@ +Shader "Hidden/BrightPassFilter2" +{ + Properties + { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + half4 _MainTex_ST; + + half4 _Threshhold; + + v2f vert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + return o; + } + + half4 fragScalarThresh(v2f i) : SV_Target + { + half4 color = tex2D(_MainTex, i.uv); + color.rgb = color.rgb; + color.rgb = max(half3(0,0,0), color.rgb-_Threshhold.xxx); + return color; + } + + half4 fragColorThresh(v2f i) : SV_Target + { + half4 color = tex2D(_MainTex, i.uv); + color.rgb = max(half3(0,0,0), color.rgb-_Threshhold.rgb); + return color; + } + + ENDCG + + Subshader + { + Pass + { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragScalarThresh + + ENDCG + } + + Pass + { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragColorThresh + + ENDCG + } + } + Fallback off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter2.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter2.shader.meta new file mode 100644 index 0000000..b55de0e --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/BrightPassFilter2.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 0aeaa4cb29f5d4e9c8455f04c8575c8c +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/LensFlareCreate.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/LensFlareCreate.shader new file mode 100644 index 0000000..37c912c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/LensFlareCreate.shader @@ -0,0 +1,61 @@ +Shader "Hidden/LensFlareCreate" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv[4] : TEXCOORD0; + }; + + fixed4 colorA; + fixed4 colorB; + fixed4 colorC; + fixed4 colorD; + + sampler2D _MainTex; + half4 _MainTex_ST; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv[0] = UnityStereoScreenSpaceUVAdjust(( ( v.texcoord.xy - 0.5 ) * -0.85 ) + 0.5, _MainTex_ST); + o.uv[1] = UnityStereoScreenSpaceUVAdjust(( ( v.texcoord.xy - 0.5 ) * -1.45 ) + 0.5, _MainTex_ST); + o.uv[2] = UnityStereoScreenSpaceUVAdjust(( ( v.texcoord.xy - 0.5 ) * -2.55 ) + 0.5, _MainTex_ST); + o.uv[3] = UnityStereoScreenSpaceUVAdjust(( ( v.texcoord.xy - 0.5 ) * -4.15 ) + 0.5, _MainTex_ST); + return o; + } + + fixed4 frag(v2f i) : SV_Target { + fixed4 color = float4 (0,0,0,0); + color += tex2D(_MainTex, i.uv[0] ) * colorA; + color += tex2D(_MainTex, i.uv[1] ) * colorB; + color += tex2D(_MainTex, i.uv[2] ) * colorC; + color += tex2D(_MainTex, i.uv[3] ) * colorD; + return color; + } + + ENDCG + +Subshader { + Blend One One + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/LensFlareCreate.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/LensFlareCreate.shader.meta new file mode 100644 index 0000000..cd9c241 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/LensFlareCreate.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 459fe69d2f6d74ddb92f04dbf45a866b +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBloom.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBloom.shader new file mode 100644 index 0000000..2425b56 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBloom.shader @@ -0,0 +1,287 @@ + +Shader "Hidden/FastBloom" { + Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _Bloom ("Bloom (RGB)", 2D) = "black" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _Bloom; + + uniform half4 _MainTex_TexelSize; + half4 _MainTex_ST; + + uniform half4 _Parameter; + uniform half4 _OffsetsA; + uniform half4 _OffsetsB; + + #define ONE_MINUS_THRESHHOLD_TIMES_INTENSITY _Parameter.w + #define THRESHHOLD _Parameter.z + + struct v2f_simple + { + float4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + + #if UNITY_UV_STARTS_AT_TOP + half2 uv2 : TEXCOORD1; + #endif + }; + + v2f_simple vertBloom ( appdata_img v ) + { + v2f_simple o; + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST); + + #if UNITY_UV_STARTS_AT_TOP + o.uv2 = o.uv; + if (_MainTex_TexelSize.y < 0.0) + o.uv.y = 1.0 - o.uv.y; + #endif + + return o; + } + + struct v2f_tap + { + float4 pos : SV_POSITION; + half2 uv20 : TEXCOORD0; + half2 uv21 : TEXCOORD1; + half2 uv22 : TEXCOORD2; + half2 uv23 : TEXCOORD3; + }; + + v2f_tap vert4Tap ( appdata_img v ) + { + v2f_tap o; + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv20 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy, _MainTex_ST); + o.uv21 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h,-0.5h), _MainTex_ST); + o.uv22 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy * half2(0.5h,-0.5h), _MainTex_ST); + o.uv23 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h,0.5h), _MainTex_ST); + + return o; + } + + fixed4 fragBloom ( v2f_simple i ) : SV_Target + { + #if UNITY_UV_STARTS_AT_TOP + + fixed4 color = tex2D(_MainTex, i.uv2); + return color + tex2D(_Bloom, i.uv); + + #else + + fixed4 color = tex2D(_MainTex, i.uv); + return color + tex2D(_Bloom, i.uv); + + #endif + } + + fixed4 fragDownsample ( v2f_tap i ) : SV_Target + { + fixed4 color = tex2D (_MainTex, i.uv20); + color += tex2D (_MainTex, i.uv21); + color += tex2D (_MainTex, i.uv22); + color += tex2D (_MainTex, i.uv23); + return max(color/4 - THRESHHOLD, 0) * ONE_MINUS_THRESHHOLD_TIMES_INTENSITY; + } + + // weight curves + + static const half curve[7] = { 0.0205, 0.0855, 0.232, 0.324, 0.232, 0.0855, 0.0205 }; // gauss'ish blur weights + + static const half4 curve4[7] = { half4(0.0205,0.0205,0.0205,0), half4(0.0855,0.0855,0.0855,0), half4(0.232,0.232,0.232,0), + half4(0.324,0.324,0.324,1), half4(0.232,0.232,0.232,0), half4(0.0855,0.0855,0.0855,0), half4(0.0205,0.0205,0.0205,0) }; + + struct v2f_withBlurCoords8 + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + half2 offs : TEXCOORD1; + }; + + struct v2f_withBlurCoordsSGX + { + float4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half4 offs[3] : TEXCOORD1; + }; + + v2f_withBlurCoords8 vertBlurHorizontal (appdata_img v) + { + v2f_withBlurCoords8 o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = half4(v.texcoord.xy,1,1); + o.offs = _MainTex_TexelSize.xy * half2(1.0, 0.0) * _Parameter.x; + + return o; + } + + v2f_withBlurCoords8 vertBlurVertical (appdata_img v) + { + v2f_withBlurCoords8 o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = half4(v.texcoord.xy,1,1); + o.offs = _MainTex_TexelSize.xy * half2(0.0, 1.0) * _Parameter.x; + + return o; + } + + half4 fragBlur8 ( v2f_withBlurCoords8 i ) : SV_Target + { + half2 uv = i.uv.xy; + half2 netFilterWidth = i.offs; + half2 coords = uv - netFilterWidth * 3.0; + + half4 color = 0; + for( int l = 0; l < 7; l++ ) + { + half4 tap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(coords, _MainTex_ST)); + color += tap * curve4[l]; + coords += netFilterWidth; + } + return color; + } + + + v2f_withBlurCoordsSGX vertBlurHorizontalSGX (appdata_img v) + { + v2f_withBlurCoordsSGX o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = v.texcoord.xy; + + half offsetMagnitude = _MainTex_TexelSize.x * _Parameter.x; + o.offs[0] = v.texcoord.xyxy + offsetMagnitude * half4(-3.0h, 0.0h, 3.0h, 0.0h); + o.offs[1] = v.texcoord.xyxy + offsetMagnitude * half4(-2.0h, 0.0h, 2.0h, 0.0h); + o.offs[2] = v.texcoord.xyxy + offsetMagnitude * half4(-1.0h, 0.0h, 1.0h, 0.0h); + + return o; + } + + v2f_withBlurCoordsSGX vertBlurVerticalSGX (appdata_img v) + { + v2f_withBlurCoordsSGX o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = half4(v.texcoord.xy,1,1); + + half offsetMagnitude = _MainTex_TexelSize.y * _Parameter.x; + o.offs[0] = v.texcoord.xyxy + offsetMagnitude * half4(0.0h, -3.0h, 0.0h, 3.0h); + o.offs[1] = v.texcoord.xyxy + offsetMagnitude * half4(0.0h, -2.0h, 0.0h, 2.0h); + o.offs[2] = v.texcoord.xyxy + offsetMagnitude * half4(0.0h, -1.0h, 0.0h, 1.0h); + + return o; + } + + half4 fragBlurSGX ( v2f_withBlurCoordsSGX i ) : SV_Target + { + half2 uv = i.uv.xy; + + half4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)) * curve4[3]; + + for( int l = 0; l < 3; l++ ) + { + half4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.offs[l].xy, _MainTex_ST)); + half4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.offs[l].zw, _MainTex_ST)); + color += (tapA + tapB) * curve4[l]; + } + + return color; + + } + + ENDCG + + SubShader { + ZTest Off Cull Off ZWrite Off Blend Off + + // 0 + Pass { + + CGPROGRAM + #pragma vertex vertBloom + #pragma fragment fragBloom + + ENDCG + + } + + // 1 + Pass { + + CGPROGRAM + + #pragma vertex vert4Tap + #pragma fragment fragDownsample + + ENDCG + + } + + // 2 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurVertical + #pragma fragment fragBlur8 + + ENDCG + } + + // 3 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurHorizontal + #pragma fragment fragBlur8 + + ENDCG + } + + // alternate blur + // 4 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurVerticalSGX + #pragma fragment fragBlurSGX + + ENDCG + } + + // 5 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurHorizontalSGX + #pragma fragment fragBlurSGX + + ENDCG + } + } + + FallBack Off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBloom.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBloom.shader.meta new file mode 100644 index 0000000..db93b36 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBloom.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 68a00c837b82e4c6d92e7da765dc5f1d +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBlur.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBlur.shader new file mode 100644 index 0000000..ade7e51 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBlur.shader @@ -0,0 +1,234 @@ + +Shader "Hidden/FastBlur" { + Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _Bloom ("Bloom (RGB)", 2D) = "black" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _Bloom; + + uniform half4 _MainTex_TexelSize; + half4 _MainTex_ST; + + half4 _Bloom_ST; + + uniform half4 _Parameter; + + + + struct v2f_tap + { + float4 pos : SV_POSITION; + half2 uv20 : TEXCOORD0; + half2 uv21 : TEXCOORD1; + half2 uv22 : TEXCOORD2; + half2 uv23 : TEXCOORD3; + }; + + v2f_tap vert4Tap ( appdata_img v ) + { + v2f_tap o; + + o.pos = UnityObjectToClipPos(v.vertex); + o.uv20 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy, _MainTex_ST); + o.uv21 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h,-0.5h), _MainTex_ST); + o.uv22 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy * half2(0.5h,-0.5h), _MainTex_ST); + o.uv23 = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h,0.5h), _MainTex_ST); + + return o; + } + + fixed4 fragDownsample ( v2f_tap i ) : SV_Target + { + fixed4 color = tex2D (_MainTex, i.uv20); + color += tex2D (_MainTex, i.uv21); + color += tex2D (_MainTex, i.uv22); + color += tex2D (_MainTex, i.uv23); + return color / 4; + } + + // weight curves + + static const half curve[7] = { 0.0205, 0.0855, 0.232, 0.324, 0.232, 0.0855, 0.0205 }; // gauss'ish blur weights + + static const half4 curve4[7] = { half4(0.0205,0.0205,0.0205,0), half4(0.0855,0.0855,0.0855,0), half4(0.232,0.232,0.232,0), + half4(0.324,0.324,0.324,1), half4(0.232,0.232,0.232,0), half4(0.0855,0.0855,0.0855,0), half4(0.0205,0.0205,0.0205,0) }; + + struct v2f_withBlurCoords8 + { + float4 pos : SV_POSITION; + half4 uv : TEXCOORD0; + half2 offs : TEXCOORD1; + }; + + struct v2f_withBlurCoordsSGX + { + float4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half4 offs[3] : TEXCOORD1; + }; + + v2f_withBlurCoords8 vertBlurHorizontal (appdata_img v) + { + v2f_withBlurCoords8 o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = half4(v.texcoord.xy,1,1); + o.offs = _MainTex_TexelSize.xy * half2(1.0, 0.0) * _Parameter.x; + + return o; + } + + v2f_withBlurCoords8 vertBlurVertical (appdata_img v) + { + v2f_withBlurCoords8 o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = half4(v.texcoord.xy,1,1); + o.offs = _MainTex_TexelSize.xy * half2(0.0, 1.0) * _Parameter.x; + + return o; + } + + half4 fragBlur8 ( v2f_withBlurCoords8 i ) : SV_Target + { + half2 uv = i.uv.xy; + half2 netFilterWidth = i.offs; + half2 coords = uv - netFilterWidth * 3.0; + + half4 color = 0; + for( int l = 0; l < 7; l++ ) + { + half4 tap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(coords, _MainTex_ST)); + color += tap * curve4[l]; + coords += netFilterWidth; + } + return color; + } + + + v2f_withBlurCoordsSGX vertBlurHorizontalSGX (appdata_img v) + { + v2f_withBlurCoordsSGX o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + + half offsetMagnitude = _MainTex_TexelSize.x * _Parameter.x; + o.offs[0] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsetMagnitude * half4(-3.0h, 0.0h, 3.0h, 0.0h), _MainTex_ST); + o.offs[1] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsetMagnitude * half4(-2.0h, 0.0h, 2.0h, 0.0h), _MainTex_ST); + o.offs[2] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsetMagnitude * half4(-1.0h, 0.0h, 1.0h, 0.0h), _MainTex_ST); + + return o; + } + + v2f_withBlurCoordsSGX vertBlurVerticalSGX (appdata_img v) + { + v2f_withBlurCoordsSGX o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = half4(UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST),1,1); + + half offsetMagnitude = _MainTex_TexelSize.y * _Parameter.x; + o.offs[0] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsetMagnitude * half4(0.0h, -3.0h, 0.0h, 3.0h), _MainTex_ST); + o.offs[1] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsetMagnitude * half4(0.0h, -2.0h, 0.0h, 2.0h), _MainTex_ST); + o.offs[2] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsetMagnitude * half4(0.0h, -1.0h, 0.0h, 1.0h), _MainTex_ST); + + return o; + } + + half4 fragBlurSGX ( v2f_withBlurCoordsSGX i ) : SV_Target + { + half2 uv = i.uv.xy; + + half4 color = tex2D(_MainTex, i.uv) * curve4[3]; + + for( int l = 0; l < 3; l++ ) + { + half4 tapA = tex2D(_MainTex, i.offs[l].xy); + half4 tapB = tex2D(_MainTex, i.offs[l].zw); + color += (tapA + tapB) * curve4[l]; + } + + return color; + + } + + ENDCG + + SubShader { + ZTest Off Cull Off ZWrite Off Blend Off + + // 0 + Pass { + + CGPROGRAM + + #pragma vertex vert4Tap + #pragma fragment fragDownsample + + ENDCG + + } + + // 1 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurVertical + #pragma fragment fragBlur8 + + ENDCG + } + + // 2 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurHorizontal + #pragma fragment fragBlur8 + + ENDCG + } + + // alternate blur + // 3 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurVerticalSGX + #pragma fragment fragBlurSGX + + ENDCG + } + + // 4 + Pass { + ZTest Always + Cull Off + + CGPROGRAM + + #pragma vertex vertBlurHorizontalSGX + #pragma fragment fragBlurSGX + + ENDCG + } + } + + FallBack Off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBlur.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBlur.shader.meta new file mode 100644 index 0000000..6770288 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MobileBlur.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: f9d5fa183cd6b45eeb1491f74863cd91 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MultiPassHollywoodFlares.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MultiPassHollywoodFlares.shader new file mode 100644 index 0000000..dfce037 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MultiPassHollywoodFlares.shader @@ -0,0 +1,155 @@ +Shader "Hidden/MultipassHollywoodFlares" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + _NonBlurredTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + }; + + struct v2f_opts { + half4 pos : SV_POSITION; + half2 uv[7] : TEXCOORD0; + }; + + half4 offsets; + half4 tintColor; + + half stretchWidth; + half2 _Threshhold; + + half4 _MainTex_TexelSize; + half4 _MainTex_ST; + + sampler2D _MainTex; + sampler2D _NonBlurredTex; + + v2f vert (appdata_img v) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord.xy; + return o; + } + + v2f_opts vertStretch (appdata_img v) { + v2f_opts o; + o.pos = UnityObjectToClipPos(v.vertex); + half b = stretchWidth; + o.uv[0] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uv[1] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + b * 2.0 * offsets.xy, _MainTex_ST); + o.uv[2] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - b * 2.0 * offsets.xy, _MainTex_ST); + o.uv[3] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + b * 4.0 * offsets.xy, _MainTex_ST); + o.uv[4] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - b * 4.0 * offsets.xy, _MainTex_ST); + o.uv[5] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + b * 6.0 * offsets.xy, _MainTex_ST); + o.uv[6] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - b * 6.0 * offsets.xy, _MainTex_ST); + return o; + } + + v2f_opts vertVerticalCoords (appdata_img v) { + v2f_opts o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv[0] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uv[1] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 0.5 * _MainTex_TexelSize.xy * half2(0,1), _MainTex_ST); + o.uv[2] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - 0.5 * _MainTex_TexelSize.xy * half2(0,1), _MainTex_ST); + o.uv[3] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 1.5 * _MainTex_TexelSize.xy * half2(0,1), _MainTex_ST); + o.uv[4] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - 1.5 * _MainTex_TexelSize.xy * half2(0,1), _MainTex_ST); + o.uv[5] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 2.5 * _MainTex_TexelSize.xy * half2(0,1), _MainTex_ST); + o.uv[6] = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy - 2.5 * _MainTex_TexelSize.xy * half2(0,1), _MainTex_ST); + return o; + } + + // deprecated + half4 fragPrepare (v2f i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv); + half4 colorNb = tex2D (_NonBlurredTex, i.uv); + return color * tintColor * 0.5 + colorNb * normalize (tintColor) * 0.5; + } + + + half4 fragPreAndCut (v2f_opts i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv[0]); + color += tex2D (_MainTex, i.uv[1]); + color += tex2D (_MainTex, i.uv[2]); + color += tex2D (_MainTex, i.uv[3]); + color += tex2D (_MainTex, i.uv[4]); + color += tex2D (_MainTex, i.uv[5]); + color += tex2D (_MainTex, i.uv[6]); + return max(color / 7.0 - _Threshhold.x, 0.0) * _Threshhold.y * tintColor; + } + + half4 fragStretch (v2f_opts i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv[0]); + color = max (color, tex2D (_MainTex, i.uv[1])); + color = max (color, tex2D (_MainTex, i.uv[2])); + color = max (color, tex2D (_MainTex, i.uv[3])); + color = max (color, tex2D (_MainTex, i.uv[4])); + color = max (color, tex2D (_MainTex, i.uv[5])); + color = max (color, tex2D (_MainTex, i.uv[6])); + return color; + } + + half4 fragPost (v2f_opts i) : SV_Target { + half4 color = tex2D (_MainTex, i.uv[0]); + color += tex2D (_MainTex, i.uv[1]); + color += tex2D (_MainTex, i.uv[2]); + color += tex2D (_MainTex, i.uv[3]); + color += tex2D (_MainTex, i.uv[4]); + color += tex2D (_MainTex, i.uv[5]); + color += tex2D (_MainTex, i.uv[6]); + return color * 1.0/(7.0 + Luminance(color.rgb) + 0.5); // this also makes it a little noisy + } + + ENDCG + +Subshader { + ZTest Always Cull Off ZWrite Off + Pass { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragPrepare + + ENDCG + } + + Pass { + + CGPROGRAM + + #pragma vertex vertStretch + #pragma fragment fragStretch + + ENDCG + } + + Pass { + + CGPROGRAM + + #pragma vertex vertVerticalCoords + #pragma fragment fragPreAndCut + + ENDCG + } + + Pass { + + CGPROGRAM + + #pragma vertex vertVerticalCoords + #pragma fragment fragPost + + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MultiPassHollywoodFlares.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MultiPassHollywoodFlares.shader.meta new file mode 100644 index 0000000..62c6a79 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/MultiPassHollywoodFlares.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: e2baf3cae8edc4daf94c9adc2154be00 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/SeparableBlurPlus.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/SeparableBlurPlus.shader new file mode 100644 index 0000000..d3246c1 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/SeparableBlurPlus.shader @@ -0,0 +1,70 @@ +Shader "Hidden/SeparableBlurPlus" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half4 uv01 : TEXCOORD1; + half4 uv23 : TEXCOORD2; + half4 uv45 : TEXCOORD3; + half4 uv67 : TEXCOORD4; + }; + + half4 offsets; + + sampler2D _MainTex; + half4 _MainTex_ST; + + v2f vert (appdata_img v) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv.xy = v.texcoord.xy; + + o.uv01 = v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1); + o.uv23 = v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1) * 2.0; + o.uv45 = v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1) * 3.0; + o.uv67 = v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1) * 4.5; + o.uv67 = v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1) * 6.5; + + return o; + } + + half4 frag (v2f i) : SV_Target { + half4 color = half4 (0,0,0,0); + + color += 0.225 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); + color += 0.150 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv01.xy, _MainTex_ST)); + color += 0.150 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv01.zw, _MainTex_ST)); + color += 0.110 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv23.xy, _MainTex_ST)); + color += 0.110 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv23.zw, _MainTex_ST)); + color += 0.075 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv45.xy, _MainTex_ST)); + color += 0.075 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv45.zw, _MainTex_ST)); + color += 0.0525 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv67.xy, _MainTex_ST)); + color += 0.0525 * tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv67.zw, _MainTex_ST)); + + return color; + } + + ENDCG + +Subshader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/SeparableBlurPlus.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/SeparableBlurPlus.shader.meta new file mode 100644 index 0000000..f675def --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/SeparableBlurPlus.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: a9df009a214e24a5ebbf271595f8d5b6 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/VignetteShader.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/VignetteShader.shader new file mode 100644 index 0000000..5110706 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/VignetteShader.shader @@ -0,0 +1,57 @@ +Shader "Hidden/VignetteShader" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _MainTex; + + float4 _MainTex_TexelSize; + float vignetteIntensity; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv = v.texcoord.xy; + return o; + } + + half4 frag(v2f i) : SV_Target { + half2 coords = i.uv; + half2 uv = i.uv; + + coords = (coords - 0.5) * 2.0; + half coordDot = dot (coords,coords); + half4 color = tex2D (_MainTex, uv); + + float mask = 1.0 - coordDot * vignetteIntensity; + return color * mask; + } + + ENDCG + +Subshader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/VignetteShader.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/VignetteShader.shader.meta new file mode 100644 index 0000000..63b6b76 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_BloomAndFlares/VignetteShader.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 562f620336e024ac99992ff05725a89a +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField.meta new file mode 100644 index 0000000..955cea4 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d9cccf980fcb7441d85b8b3b5c2d2c34 diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/Bokeh34.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/Bokeh34.shader new file mode 100644 index 0000000..7fdb621 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/Bokeh34.shader @@ -0,0 +1,79 @@ + +Shader "Hidden/Dof/Bokeh34" { +Properties { + _MainTex ("Base (RGB)", 2D) = "white" {} + _Source ("Base (RGB)", 2D) = "black" {} +} + +SubShader { + CGINCLUDE + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _Source; + + uniform half4 _ArScale; + uniform half _Intensity; + uniform half4 _Source_TexelSize; + half4 _Source_ST; + + struct v2f { + half4 pos : SV_POSITION; + half2 uv2 : TEXCOORD0; + half4 source : TEXCOORD1; + }; + + #define COC bokeh.a + + v2f vert (appdata_full v) + { + v2f o; + + o.pos = v.vertex; + + o.uv2.xy = v.texcoord.xy;// * 2.0; <- needed when using Triangles.js and not Quads.js + + #if UNITY_UV_STARTS_AT_TOP + float4 bokeh = tex2Dlod (_Source, half4 (UnityStereoScreenSpaceUVAdjust(v.texcoord1.xy * half2(1,-1) + half2(0,1), _Source_ST), 0, 0)); + #else + float4 bokeh = tex2Dlod (_Source, half4 (UnityStereoScreenSpaceUVAdjust(v.texcoord1.xy, _Source_ST), 0, 0)); + #endif + + o.source = bokeh; + + o.pos.xy += (v.texcoord.xy * 2.0 - 1.0) * _ArScale.xy * COC;// + _ArScale.zw * coc; + o.source.rgb *= _Intensity; + + return o; + } + + + half4 frag (v2f i) : SV_Target + { + half4 color = tex2D (_MainTex, i.uv2.xy); + color.rgb *= i.source.rgb; + color.a *= Luminance(i.source.rgb*0.25); + return color; + } + + ENDCG + + Pass { + Blend OneMinusDstColor One + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment frag + + ENDCG + } + +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/Bokeh34.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/Bokeh34.shader.meta new file mode 100644 index 0000000..f8047da --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/Bokeh34.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 57cdacf9b217546aaa18edf39a6151c0 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfField34.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfField34.shader new file mode 100644 index 0000000..d94241c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfField34.shader @@ -0,0 +1,479 @@ + Shader "Hidden/Dof/DepthOfField34" { + Properties { + _MainTex ("Base", 2D) = "" {} + _TapLowBackground ("TapLowBackground", 2D) = "" {} + _TapLowForeground ("TapLowForeground", 2D) = "" {} + _TapMedium ("TapMedium", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + half4 pos : SV_POSITION; + half2 uv1 : TEXCOORD0; + }; + + struct v2fDofApply { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + }; + + struct v2fRadius { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half4 uv1[4] : TEXCOORD1; + }; + + struct v2fDown { + half4 pos : SV_POSITION; + half2 uv0 : TEXCOORD0; + half2 uv[2] : TEXCOORD1; + }; + + sampler2D _MainTex; + sampler2D_float _CameraDepthTexture; + sampler2D _TapLowBackground; + sampler2D _TapLowForeground; + sampler2D _TapMedium; + + half4 _CurveParams; + half _ForegroundBlurExtrude; + uniform half3 _Threshhold; + uniform float4 _MainTex_TexelSize; + half4 _MainTex_ST; + uniform float2 _InvRenderTargetSize; + half4 _CameraDepthTexture_ST; + half4 _TapLowBackground_ST; + half4 _TapLowForeground_ST; + half4 _TapMedium_ST; + + v2f vert( appdata_img v ) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv1.xy = v.texcoord.xy; + return o; + } + + v2fRadius vertWithRadius( appdata_img v ) { + v2fRadius o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + + const half2 blurOffsets[4] = { + half2(-0.5, +1.5), + half2(+0.5, -1.5), + half2(+1.5, +0.5), + half2(-1.5, -0.5) + }; + + o.uv1[0].xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 5.0 * _MainTex_TexelSize.xy * blurOffsets[0], _MainTex_ST); + o.uv1[1].xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 5.0 * _MainTex_TexelSize.xy * blurOffsets[1], _MainTex_ST); + o.uv1[2].xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 5.0 * _MainTex_TexelSize.xy * blurOffsets[2], _MainTex_ST); + o.uv1[3].xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 5.0 * _MainTex_TexelSize.xy * blurOffsets[3], _MainTex_ST); + + o.uv1[0].zw = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 3.0 * _MainTex_TexelSize.xy * blurOffsets[0], _MainTex_ST); + o.uv1[1].zw = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 3.0 * _MainTex_TexelSize.xy * blurOffsets[1], _MainTex_ST); + o.uv1[2].zw = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 3.0 * _MainTex_TexelSize.xy * blurOffsets[2], _MainTex_ST); + o.uv1[3].zw = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy + 3.0 * _MainTex_TexelSize.xy * blurOffsets[3], _MainTex_ST); + + return o; + } + + v2fDofApply vertDofApply( appdata_img v ) { + v2fDofApply o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = v.texcoord.xy; + return o; + } + + v2fDown vertDownsampleWithCocConserve(appdata_img v) { + v2fDown o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv0.xy = v.texcoord.xy; + o.uv[0].xy = v.texcoord.xy + half2(-1.0,-1.0) * _InvRenderTargetSize; + o.uv[1].xy = v.texcoord.xy + half2(1.0,-1.0) * _InvRenderTargetSize; + return o; + } + + half4 BokehPrereqs (sampler2D tex, half4 uv1[4], half4 center, half considerCoc) { + + // @NOTE 1: + // we are checking for 3 things in order to create a bokeh. + // goal is to get the highest bang for the buck. + // 1.) contrast/frequency should be very high (otherwise bokeh mostly unvisible) + // 2.) luminance should be high + // 3.) no occluder nearby (stored in alpha channel) + + // @NOTE 2: about the alpha channel in littleBlur: + // the alpha channel stores an heuristic on how likely it is + // that there is no bokeh occluder nearby. + // if we didn't' check for that, we'd get very noise bokeh + // popping because of the sudden contrast changes + + half4 sampleA = tex2D(tex, uv1[0].zw); + half4 sampleB = tex2D(tex, uv1[1].zw); + half4 sampleC = tex2D(tex, uv1[2].zw); + half4 sampleD = tex2D(tex, uv1[3].zw); + + half4 littleBlur = 0.125 * (sampleA + sampleB + sampleC + sampleD); + + sampleA = tex2D(tex, uv1[0].xy); + sampleB = tex2D(tex, uv1[1].xy); + sampleC = tex2D(tex, uv1[2].xy); + sampleD = tex2D(tex, uv1[3].xy); + + littleBlur += 0.125 * (sampleA + sampleB + sampleC + sampleD); + + littleBlur = lerp (littleBlur, center, saturate(100.0 * considerCoc * abs(littleBlur.a - center.a))); + + return littleBlur; + } + + half4 fragDownsampleWithCocConserve(v2fDown i) : SV_Target { + half2 rowOfs[4]; + + rowOfs[0] = half2(0.0, 0.0); + rowOfs[1] = half2(0.0, _InvRenderTargetSize.y); + rowOfs[2] = half2(0.0, _InvRenderTargetSize.y) * 2.0; + rowOfs[3] = half2(0.0, _InvRenderTargetSize.y) * 3.0; + + half4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv0.xy, _MainTex_ST)); + + half4 sampleA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy + rowOfs[0], _MainTex_ST)); + half4 sampleB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1].xy + rowOfs[0], _MainTex_ST)); + half4 sampleC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy + rowOfs[2], _MainTex_ST)); + half4 sampleD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[1].xy + rowOfs[2], _MainTex_ST)); + + color += sampleA + sampleB + sampleC + sampleD; + color *= 0.2; + + // @NOTE we are doing max on the alpha channel for 2 reasons: + // 1) foreground blur likes a slightly bigger radius + // 2) otherwise we get an ugly outline between high blur- and medium blur-areas + // drawback: we get a little bit of color bleeding + + color.a = max(max(sampleA.a, sampleB.a), max(sampleC.a, sampleD.a)); + + return color; + } + + half4 fragDofApplyBg (v2fDofApply i) : SV_Target { + half4 tapHigh = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + i.uv.xy = i.uv.xy * half2(1,-1)+half2(0,1); + #endif + + half4 tapLow = tex2D (_TapLowBackground, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapLowBackground_ST)); // already mixed with medium blur + tapHigh = lerp (tapHigh, tapLow, tapHigh.a); + return tapHigh; + } + + half4 fragDofApplyBgDebug (v2fDofApply i) : SV_Target { + half4 tapHigh = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + + half4 tapLow = tex2D (_TapLowBackground, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapLowBackground_ST)); + + half4 tapMedium = tex2D (_TapMedium, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapMedium_ST)); + tapMedium.rgb = (tapMedium.rgb + half3 (1, 1, 0)) * 0.5; + tapLow.rgb = (tapLow.rgb + half3 (0, 1, 0)) * 0.5; + + tapLow = lerp (tapMedium, tapLow, saturate (tapLow.a * tapLow.a)); + tapLow = tapLow * 0.5 + tex2D (_TapLowBackground, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapLowBackground_ST)) * 0.5; + + return lerp (tapHigh, tapLow, tapHigh.a); + } + + half4 fragDofApplyFg (v2fDofApply i) : SV_Target { + half4 fgBlur = tex2D(_TapLowForeground, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapLowForeground_ST)); + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + i.uv.xy = i.uv.xy * half2(1,-1)+half2(0,1); + #endif + + half4 fgColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + + //fgBlur.a = saturate(fgBlur.a*_ForegroundBlurWeight+saturate(fgColor.a-fgBlur.a)); + //fgBlur.a = max (fgColor.a, (2.0 * fgBlur.a - fgColor.a)) * _ForegroundBlurExtrude; + fgBlur.a = max(fgColor.a, fgBlur.a * _ForegroundBlurExtrude); //max (fgColor.a, (2.0*fgBlur.a-fgColor.a)) * _ForegroundBlurExtrude; + + return lerp (fgColor, fgBlur, saturate(fgBlur.a)); + } + + half4 fragDofApplyFgDebug (v2fDofApply i) : SV_Target { + half4 fgBlur = tex2D(_TapLowForeground, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapLowForeground_ST)); + + half4 fgColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + + fgBlur.a = max(fgColor.a, fgBlur.a * _ForegroundBlurExtrude); //max (fgColor.a, (2.0*fgBlur.a-fgColor.a)) * _ForegroundBlurExtrude; + + half4 tapMedium = half4 (1, 1, 0, fgBlur.a); + tapMedium.rgb = 0.5 * (tapMedium.rgb + fgColor.rgb); + + fgBlur.rgb = 0.5 * (fgBlur.rgb + half3(0,1,0)); + fgBlur.rgb = lerp (tapMedium.rgb, fgBlur.rgb, saturate (fgBlur.a * fgBlur.a)); + + return lerp ( fgColor, fgBlur, saturate(fgBlur.a)); + } + + half4 fragCocBg (v2f i) : SV_Target { + + float d = SAMPLE_DEPTH_TEXTURE (_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + d = Linear01Depth (d); + half coc = 0.0; + + half focalDistance01 = _CurveParams.w + _CurveParams.z; + + if (d > focalDistance01) + coc = (d - focalDistance01); + + coc = saturate (coc * _CurveParams.y); + return coc; + } + + half4 fragCocFg (v2f i) : SV_Target { + half4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + color.a = 0.0; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + i.uv1.xy = i.uv1.xy * half2(1,-1)+half2(0,1); + #endif + + float d = SAMPLE_DEPTH_TEXTURE (_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + d = Linear01Depth (d); + + half focalDistance01 = (_CurveParams.w - _CurveParams.z); + + if (d < focalDistance01) + color.a = (focalDistance01 - d); + + color.a = saturate (color.a * _CurveParams.x); + return color; + } + + // not being used atm + + half4 fragMask (v2f i) : SV_Target { + return half4(0,0,0,0); + } + + // used for simple one one blend + + half4 fragAddBokeh (v2f i) : SV_Target { + half4 from = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST) ); + return from; + } + + half4 fragAddFgBokeh (v2f i) : SV_Target { + half4 from = tex2D( _MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST) ); + return from; + } + + half4 fragDarkenForBokeh(v2fRadius i) : SV_Target { + half4 fromOriginal = tex2D(_MainTex, i.uv.xy); + half4 lowRez = BokehPrereqs (_MainTex, i.uv1, fromOriginal, _Threshhold.z); + half4 outColor = half4(0,0,0, fromOriginal.a); + half modulate = fromOriginal.a; + + // this code imitates the if-then-else conditions below + half2 conditionCheck = half2( dot(abs(fromOriginal.rgb-lowRez.rgb), half3(0.3,0.5,0.2)), Luminance(fromOriginal.rgb)); + conditionCheck *= fromOriginal.a; + conditionCheck = saturate(_Threshhold.xy - conditionCheck); + outColor = lerp (outColor, fromOriginal, saturate (dot(conditionCheck, half2(1000.0,1000.0)))); + + /* + if ( abs(dot(fromOriginal.rgb - lowRez.rgb, half3 (0.3,0.5,0.2))) * modulate < _Threshhold.x) + outColor = fromOriginal; // no darkening + if (Luminance(fromOriginal.rgb) * modulate < _Threshhold.y) + outColor = fromOriginal; // no darkening + if (lowRez.a < _Threshhold.z) // need to make foreground not cast false bokeh's + outColor = fromOriginal; // no darkenin + */ + + return outColor; + } + + half4 fragExtractAndAddToBokeh (v2fRadius i) : SV_Target { + half4 from = tex2D(_MainTex, i.uv.xy); + half4 lowRez = BokehPrereqs(_MainTex, i.uv1, from, _Threshhold.z); + half4 outColor = from; + + // this code imitates the if-then-else conditions below + half2 conditionCheck = half2( dot(abs(from.rgb-lowRez.rgb), half3(0.3,0.5,0.2)), Luminance(from.rgb)); + conditionCheck *= from.a; + conditionCheck = saturate(_Threshhold.xy - conditionCheck); + outColor = lerp (outColor, half4(0,0,0,0), saturate (dot(conditionCheck, half2(1000.0,1000.0)))); + + /* + if ( abs(dot(from.rgb - lowRez.rgb, half3 (0.3,0.5,0.2))) * modulate < _Threshhold.x) + outColor = half4(0,0,0,0); // don't add + if (Luminance(from.rgb) * modulate < _Threshhold.y) + outColor = half4(0,0,0,0); // don't add + if (lowRez.a < _Threshhold.z) // need to make foreground not cast false bokeh's + outColor = half4(0,0,0,0); // don't add + */ + + return outColor; + } + + ENDCG + +Subshader { + + // pass 0 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vertDofApply + #pragma fragment fragDofApplyBg + ENDCG + } + + // pass 1 + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask RGB + + CGPROGRAM + #pragma vertex vertDofApply + #pragma fragment fragDofApplyFgDebug + ENDCG + } + + // pass 2 + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask RGB + + CGPROGRAM + #pragma vertex vertDofApply + #pragma fragment fragDofApplyBgDebug + ENDCG + } + + + + // pass 3 + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask A + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragCocBg + ENDCG + } + + + // pass 4 + + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask RGB + //Blend One One + + CGPROGRAM + #pragma vertex vertDofApply + #pragma fragment fragDofApplyFg + ENDCG + } + + // pass 5 + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask ARGB + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragCocFg + ENDCG + } + + // pass 6 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vertDownsampleWithCocConserve + #pragma fragment fragDownsampleWithCocConserve + ENDCG + } + + // pass 7 + // not being used atm + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask RGBA + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragMask + ENDCG + } + + // pass 8 + + Pass { + ZTest Always Cull Off ZWrite Off + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + + CGPROGRAM + #pragma vertex vert + #pragma fragment fragAddBokeh + ENDCG + } + + // pass 9 + + Pass { + ZTest Always Cull Off ZWrite Off + Blend One One + ColorMask RGB + + CGPROGRAM + #pragma vertex vertWithRadius + #pragma fragment fragExtractAndAddToBokeh + ENDCG + } + + // pass 10 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vertWithRadius + #pragma fragment fragDarkenForBokeh + ENDCG + } + + // pass 11 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vertWithRadius + #pragma fragment fragExtractAndAddToBokeh + ENDCG + } + } + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfField34.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfField34.shader.meta new file mode 100644 index 0000000..b86195b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfField34.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 987fb0677d01f43ce8a9dbf12271e668 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldDX11.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldDX11.shader new file mode 100644 index 0000000..4f9936b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldDX11.shader @@ -0,0 +1,259 @@ + +/* + DX11 Depth Of Field + pretty much just does bokeh texture splatting + + basic algorithm: + + * find bright spots + * verify high frequency (otherwise dont care) + * if possitive, replace with black pixel and add to append buffer + * box blur buffer (thus smearing black pixels) + * blend bokeh texture sprites via append buffer on top of box blurred buffer + * composite with frame buffer +*/ + +Shader "Hidden/Dof/DX11Dof" +{ + Properties + { + _MainTex ("", 2D) = "white" {} + _BlurredColor ("", 2D) = "white" {} + _FgCocMask ("", 2D) = "white" {} + } + + CGINCLUDE + + #define BOKEH_ZERO_VEC (float4(0,0,0,0)) + #define BOKEH_ONE_VEC (float4(1,1,1,1)) + + float4 _BokehParams; // legend: dx11BokehScale, dx11BokehIntensity,dx11BokehThreshhold, internalBlurWidth + float4 _MainTex_TexelSize; + float3 _Screen; + float _SpawnHeuristic; + + sampler2D_float _CameraDepthTexture; + sampler2D _BlurredColor; + sampler2D _MainTex; + sampler2D _FgCocMask; + + half4 _MainTex_ST; + + + struct appendStruct { + float3 pos; + float4 color; + }; + + struct gs_out { + float4 pos : SV_POSITION; + float3 uv : TEXCOORD0; + float4 color : TEXCOORD1; + float4 misc : TEXCOORD2; + }; + + // TODO: activate border clamp tex sampler state instead? + inline float4 clampBorderColor(float2 uv) + { +#if 1 + if(uv.x<=0) return BOKEH_ZERO_VEC; if(uv.x>=1) return BOKEH_ZERO_VEC; + if(uv.y<=0) return BOKEH_ZERO_VEC; if(uv.y>=1) return BOKEH_ZERO_VEC; +#endif + return BOKEH_ONE_VEC; + } + + struct vs_out { + float4 pos : SV_POSITION; + float4 color : TEXCOORD1; + float cocOverlap : TEXCOORD2; + }; + + StructuredBuffer pointBuffer; + + vs_out vertApply (uint id : SV_VertexID) + { + vs_out o; + float2 pos = pointBuffer[id].pos.xy ; + o.pos = float4(pos * 2.0 - 1.0, 0, 1); + o.color = pointBuffer[id].color; + #if UNITY_UV_STARTS_AT_TOP + o.pos.y *= -1; + #endif + o.cocOverlap = pointBuffer[id].pos.z; + + return o; + } + + [maxvertexcount(4)] + void geom (point vs_out input[1], inout TriangleStream outStream) + { + // NEW ENERGY CONSERVATION: + + float2 scale2 = _BokehParams.ww * input[0].color.aa * _BokehParams.xx; + float4 offs = 0; + offs.xy = float2(3.0, 3.0) + 2.0f * floor(scale2 + float2(0.5,0.5)); + + float2 rs = ((float2(1.0, 1.0) + 2.0f * (scale2 + float2(0.5,0.5))));; + float2 f2 = offs.xy / rs; + + float energyAdjustment = (_BokehParams.y) / (rs.x*rs.y); + offs.xy *= _Screen.xy; + + gs_out output; + + output.pos = input[0].pos + offs*float4(-1,1,0,0); + output.misc = float4(f2,0,0); + output.uv = float3(0, 1, input[0].cocOverlap); + output.color = input[0].color * energyAdjustment; + outStream.Append (output); + + output.pos = input[0].pos + offs*float4(1,1,0,0); + output.misc = float4(f2,0,0); + output.uv = float3(1, 1, input[0].cocOverlap); + output.color = input[0].color * energyAdjustment; + outStream.Append (output); + + output.pos = input[0].pos + offs*float4(-1,-1,0,0); + output.misc = float4(f2,0,0); + output.uv = float3(0, 0, input[0].cocOverlap); + output.color = input[0].color * energyAdjustment; + outStream.Append (output); + + output.pos = input[0].pos + offs*float4(1,-1,0,0); + output.misc = float4(f2,0,0); + output.uv = float3(1, 0, input[0].cocOverlap); + output.color = input[0].color * energyAdjustment; + outStream.Append (output); + + outStream.RestartStrip(); + } + +ENDCG + +SubShader +{ + +// pass 0: append buffer "collect" + +Pass +{ + ZWrite Off ZTest Always Cull Off + + CGPROGRAM + + #pragma vertex vert + #pragma fragment frag + #pragma target 5.0 + + #include "UnityCG.cginc" + + struct appdata { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv_flip : TEXCOORD0; + float2 uv : TEXCOORD1; + }; + + v2f vert (appdata v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST); + o.uv_flip = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST); + #if UNITY_UV_STARTS_AT_TOP + if(_MainTex_TexelSize.y<0) + o.uv_flip.y = 1.0-o.uv_flip.y; + if(_MainTex_TexelSize.y<0) + o.pos.y *= -1.0; + #endif + return o; + } + + AppendStructuredBuffer pointBufferOutput : register(u1); + + float4 frag (v2f i) : SV_Target + { + float4 c = tex2D (_MainTex, i.uv_flip); + float lumc = Luminance (c.rgb); + + float4 cblurred = tex2D (_BlurredColor, i.uv); + float lumblurred = Luminance (cblurred.rgb); + + float fgCoc = tex2D(_FgCocMask, i.uv).a; + + [branch] + if (c.a * _BokehParams.w > 1 && cblurred.a > 0.1 && lumc > _BokehParams.z && abs(lumc-lumblurred) > _SpawnHeuristic) + { + appendStruct append; + append.pos = float3(i.uv, fgCoc); + append.color.rgba = float4(c.rgb * saturate(c.a*4), c.a); + pointBufferOutput.Append (append); + return float4(c.rgb * saturate(1-c.a*4), c.a); + } + + return c; + } + ENDCG +} + +// pass 1: bokeh splatting (low resolution) + +Pass { + + ZWrite Off ZTest Always Cull Off + Blend One One, One One + ColorMask RGBA + + CGPROGRAM + + #pragma target 5.0 + #pragma vertex vertApply + #pragma geometry geom + #pragma fragment frag + + #include "UnityCG.cginc" + + fixed4 frag (gs_out i) : SV_Target + { + float2 uv = UnityStereoScreenSpaceUVAdjust((i.uv.xy) * i.misc.xy + (float2(1,1)-i.misc.xy) * 0.5, _MainTex_ST); // smooth uv scale + return float4(i.color.rgb, 1) * float4(tex2D(_MainTex, uv.xy).rgb, i.uv.z) * clampBorderColor (uv); + } + + ENDCG +} + +// pass 2: bokeh splatting (high resolution) + +Pass { + + ZWrite Off ZTest Always Cull Off + BlendOp Add, Add + Blend DstAlpha One, Zero One + ColorMask RGBA + + CGPROGRAM + + #pragma target 5.0 + #pragma vertex vertApply + #pragma geometry geom + #pragma fragment frag + + #include "UnityCG.cginc" + + fixed4 frag (gs_out i) : SV_Target + { + float2 uv = UnityStereoScreenSpaceUVAdjust((i.uv.xy) * i.misc.xy + (float2(1,1)-i.misc.xy) * 0.5, _MainTex_ST); // smooth uv scale + return float4(i.color.rgb, 1) * float4(tex2D(_MainTex, uv.xy).rgb, i.uv.z) * clampBorderColor (uv); + } + + ENDCG +} + +} + +Fallback Off +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldDX11.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldDX11.shader.meta new file mode 100644 index 0000000..15935f1 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldDX11.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: d8e82664aa8686642a424c88ab10164a +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldScatter.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldScatter.shader new file mode 100644 index 0000000..d4abdd3 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldScatter.shader @@ -0,0 +1,939 @@ + Shader "Hidden/Dof/DepthOfFieldHdr" { + Properties { + _MainTex ("-", 2D) = "black" {} + _FgOverlap ("-", 2D) = "black" {} + _LowRez ("-", 2D) = "black" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uv1 : TEXCOORD1; + }; + + struct v2fRadius { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 uv1[4] : TEXCOORD1; + }; + + struct v2fBlur { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 uv01 : TEXCOORD1; + float4 uv23 : TEXCOORD2; + float4 uv45 : TEXCOORD3; + float4 uv67 : TEXCOORD4; + float4 uv89 : TEXCOORD5; + }; + + uniform sampler2D _MainTex; + uniform sampler2D_float _CameraDepthTexture; + uniform sampler2D _FgOverlap; + uniform sampler2D _LowRez; + uniform float4 _CurveParams; + uniform float4 _MainTex_TexelSize; + half4 _MainTex_ST; + uniform float4 _Offsets; + + half4 _CameraDepthTexture_ST; + half4 _LowRez_ST; + half4 _FgOverlap_ST; + + v2f vert( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv1.xy = v.texcoord.xy; + o.uv.xy = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + o.uv.y = 1-o.uv.y; + #endif + + return o; + } + + v2f vertFlip( appdata_img v ) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv1.xy = v.texcoord.xy; + o.uv.xy = v.texcoord.xy; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + o.uv.y = 1-o.uv.y; + if (_MainTex_TexelSize.y < 0) + o.uv1.y = 1-o.uv1.y; + #endif + + return o; + } + + v2fBlur vertBlurPlusMinus (appdata_img v) + { + v2fBlur o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uv01 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * float4(1,1, -1,-1) * _MainTex_TexelSize.xyxy / 6.0, _MainTex_ST); + o.uv23 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * float4(2,2, -2,-2) * _MainTex_TexelSize.xyxy / 6.0, _MainTex_ST); + o.uv45 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * float4(3,3, -3,-3) * _MainTex_TexelSize.xyxy / 6.0, _MainTex_ST); + o.uv67 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * float4(4,4, -4,-4) * _MainTex_TexelSize.xyxy / 6.0, _MainTex_ST); + o.uv89 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + _Offsets.xyxy * float4(5,5, -5,-5) * _MainTex_TexelSize.xyxy / 6.0, _MainTex_ST); + return o; + } + + #define SCATTER_OVERLAP_SMOOTH (-0.265) + + inline float BokehWeightDisc(float4 theSample, float sampleDistance, float4 centerSample) + { + return smoothstep(SCATTER_OVERLAP_SMOOTH, 0.0, theSample.a - centerSample.a*sampleDistance); + } + + inline float2 BokehWeightDisc2(float4 sampleA, float4 sampleB, float2 sampleDistance2, float4 centerSample) + { + return smoothstep(float2(SCATTER_OVERLAP_SMOOTH, SCATTER_OVERLAP_SMOOTH), float2(0.0,0.0), float2(sampleA.a, sampleB.a) - centerSample.aa*sampleDistance2); } + + static const int SmallDiscKernelSamples = 12; + static const float2 SmallDiscKernel[SmallDiscKernelSamples] = + { + float2(-0.326212,-0.40581), + float2(-0.840144,-0.07358), + float2(-0.695914,0.457137), + float2(-0.203345,0.620716), + float2(0.96234,-0.194983), + float2(0.473434,-0.480026), + float2(0.519456,0.767022), + float2(0.185461,-0.893124), + float2(0.507431,0.064425), + float2(0.89642,0.412458), + float2(-0.32194,-0.932615), + float2(-0.791559,-0.59771) + }; + + static const int NumDiscSamples = 28; + static const float3 DiscKernel[NumDiscSamples] = + { + float3(0.62463,0.54337,0.82790), + float3(-0.13414,-0.94488,0.95435), + float3(0.38772,-0.43475,0.58253), + float3(0.12126,-0.19282,0.22778), + float3(-0.20388,0.11133,0.23230), + float3(0.83114,-0.29218,0.88100), + float3(0.10759,-0.57839,0.58831), + float3(0.28285,0.79036,0.83945), + float3(-0.36622,0.39516,0.53876), + float3(0.75591,0.21916,0.78704), + float3(-0.52610,0.02386,0.52664), + float3(-0.88216,-0.24471,0.91547), + float3(-0.48888,-0.29330,0.57011), + float3(0.44014,-0.08558,0.44838), + float3(0.21179,0.51373,0.55567), + float3(0.05483,0.95701,0.95858), + float3(-0.59001,-0.70509,0.91938), + float3(-0.80065,0.24631,0.83768), + float3(-0.19424,-0.18402,0.26757), + float3(-0.43667,0.76751,0.88304), + float3(0.21666,0.11602,0.24577), + float3(0.15696,-0.85600,0.87027), + float3(-0.75821,0.58363,0.95682), + float3(0.99284,-0.02904,0.99327), + float3(-0.22234,-0.57907,0.62029), + float3(0.55052,-0.66984,0.86704), + float3(0.46431,0.28115,0.54280), + float3(-0.07214,0.60554,0.60982), + }; + + float4 fragBlurInsaneMQ (v2f i) : SV_Target + { + float4 centerTap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + float4 sum = centerTap; + float4 poissonScale = _MainTex_TexelSize.xyxy * centerTap.a * _Offsets.w; + + float sampleCount = max(centerTap.a * 0.25, _Offsets.z); // <- weighing with 0.25 looks nicer for small high freq spec + sum *= sampleCount; + + float weights = 0; + + for(int l=0; l < NumDiscSamples; l++) + { + float2 sampleUV = i.uv1.xy + DiscKernel[l].xy * poissonScale.xy; + float4 sample0 = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(sampleUV.xy, _MainTex_ST)); + + if( sample0.a > 0.0 ) + { + weights = BokehWeightDisc(sample0, DiscKernel[l].z, centerTap); + sum += sample0 * weights; + sampleCount += weights; + } + } + + float4 returnValue = sum / sampleCount; + returnValue.a = centerTap.a; + + return returnValue; + } + + float4 fragBlurInsaneHQ (v2f i) : SV_Target + { + float4 centerTap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + float4 sum = centerTap; + float4 poissonScale = _MainTex_TexelSize.xyxy * centerTap.a * _Offsets.w; + + float sampleCount = max(centerTap.a * 0.25, _Offsets.z); // <- weighing with 0.25 looks nicer for small high freq spec + sum *= sampleCount; + + float2 weights = 0; + + for(int l=0; l < NumDiscSamples; l++) + { + float4 sampleUV = i.uv1.xyxy + DiscKernel[l].xyxy * poissonScale.xyxy / float4(1.2,1.2,DiscKernel[l].zz); + + float4 sample0 = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(sampleUV.xy, _MainTex_ST)); + float4 sample1 = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(sampleUV.zw, _MainTex_ST)); + + if( (sample0.a + sample1.a) > 0.0 ) + { + weights = BokehWeightDisc2(sample0, sample1, float2(DiscKernel[l].z/1.2, 1.0), centerTap); + sum += sample0 * weights.x + sample1 * weights.y; + sampleCount += dot(weights, 1); + } + } + + float4 returnValue = sum / sampleCount; + returnValue.a = centerTap.a; + + return returnValue; + } + + inline float4 BlendLowWithHighHQ(float coc, float4 low, float4 high) + { + float blend = smoothstep(0.65,0.85, coc); + return lerp(low, high, blend); + } + + inline float4 BlendLowWithHighMQ(float coc, float4 low, float4 high) + { + float blend = smoothstep(0.4,0.6, coc); + return lerp(low, high, blend); + } + + float4 fragBlurUpsampleCombineHQ (v2f i) : SV_Target + { + float4 bigBlur = tex2D(_LowRez, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _LowRez_ST)); + float4 centerTap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + + float4 smallBlur = centerTap; + float4 poissonScale = _MainTex_TexelSize.xyxy * centerTap.a * _Offsets.w ; + + float sampleCount = max(centerTap.a * 0.25, 0.1f); // <- weighing with 0.25 looks nicer for small high freq spec + smallBlur *= sampleCount; + + for(int l=0; l < NumDiscSamples; l++) + { + float2 sampleUV = i.uv1.xy + DiscKernel[l].xy * poissonScale.xy; + + float4 sample0 = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(sampleUV, _MainTex_ST)); + float weight0 = BokehWeightDisc(sample0, DiscKernel[l].z, centerTap); + smallBlur += sample0 * weight0; sampleCount += weight0; + } + + smallBlur /= (sampleCount+1e-5f); + smallBlur = BlendLowWithHighHQ(centerTap.a, smallBlur, bigBlur); + + return centerTap.a < 1e-2f ? centerTap : float4(smallBlur.rgb,centerTap.a); + } + + float4 fragBlurUpsampleCombineMQ (v2f i) : SV_Target + { + float4 bigBlur = tex2D(_LowRez, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _LowRez_ST)); + float4 centerTap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + + float4 smallBlur = centerTap; + float4 poissonScale = _MainTex_TexelSize.xyxy * centerTap.a * _Offsets.w ; + + float sampleCount = max(centerTap.a * 0.25, 0.1f); // <- weighing with 0.25 looks nicer for small high freq spec + smallBlur *= sampleCount; + + for(int l=0; l < SmallDiscKernelSamples; l++) + { + float2 sampleUV = i.uv1.xy + SmallDiscKernel[l].xy * poissonScale.xy*1.1; + + float4 sample0 = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(sampleUV, _MainTex_ST)); + float weight0 = BokehWeightDisc(sample0, length(SmallDiscKernel[l].xy*1.1), centerTap); + smallBlur += sample0 * weight0; sampleCount += weight0; + } + + smallBlur /= (sampleCount+1e-5f); + + smallBlur = BlendLowWithHighMQ(centerTap.a, smallBlur, bigBlur); + + return centerTap.a < 1e-2f ? centerTap : float4(smallBlur.rgb,centerTap.a); + } + + float4 fragBlurUpsampleCheap (v2f i) : SV_Target + { + float4 centerTap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + float4 bigBlur = tex2D(_LowRez, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _LowRez_ST)); + + float fgCoc = tex2D(_FgOverlap, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _FgOverlap_ST)).a; + float4 smallBlur = lerp(centerTap, bigBlur, saturate( max(centerTap.a,fgCoc)*8.0 )); + + return float4(smallBlur.rgb, centerTap.a); + } + + float4 fragBlurBox (v2f i) : SV_Target + { + const int TAPS = 12; + + float4 centerTap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + + // TODO: important ? breaks when HR blur is being used + //centerTap.a = max(centerTap.a, 0.1f); + + float sampleCount = centerTap.a; + float4 sum = centerTap * sampleCount; + + float2 lenStep = centerTap.aa * (1.0 / (TAPS-1.0)); + float4 steps = (_Offsets.xyxy * _MainTex_TexelSize.xyxy) * lenStep.xyxy * float4(1,1, -1,-1); + + for(int l=1; l 1e-5f) outColor.rgb = color.rgb/sumWeights; + + return outColor; + } + + float4 fragCaptureColorAndSignedCoc (v2f i) : SV_Target + { + float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _CameraDepthTexture_ST)); + d = Linear01Depth (d); + color.a = _CurveParams.z * abs(d - _CurveParams.w) / (d + 1e-5f); + color.a = clamp( max(0.0, color.a - _CurveParams.y), 0.0, _CurveParams.x) * sign(d - _CurveParams.w); + + return color; + } + + float4 fragCaptureCoc (v2f i) : SV_Target + { + float4 color = float4(0,0,0,0); //tex2D (_MainTex, i.uv1.xy); + float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _CameraDepthTexture_ST)); + d = Linear01Depth (d); + color.a = _CurveParams.z * abs(d - _CurveParams.w) / (d + 1e-5f); + color.a = clamp( max(0.0, color.a - _CurveParams.y), 0.0, _CurveParams.x); + + return color; + } + + float4 AddFgCoc (v2f i) : SV_Target + { + return tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + } + + float4 fragMergeCoc (v2f i) : SV_Target + { + float4 color = tex2D (_FgOverlap, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _FgOverlap_ST)); // this is the foreground overlap value + float fgCoc = color.a; + + float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _CameraDepthTexture_ST)); + d = Linear01Depth (d); + color.a = _CurveParams.z * abs(d - _CurveParams.w) / (d + 1e-5f); + color.a = clamp( max(0.0, color.a - _CurveParams.y), 0.0, _CurveParams.x); + + return max(color.aaaa, float4(fgCoc,fgCoc,fgCoc,fgCoc)); + } + + float4 fragCombineCocWithMaskBlur (v2f i) : SV_Target + { + float bgAndFgCoc = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)).a; + float fgOverlapCoc = tex2D (_FgOverlap, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _FgOverlap_ST)).a; + + return (bgAndFgCoc < 0.01) * saturate(fgOverlapCoc-bgAndFgCoc); + } + + float4 fragCaptureForegroundCoc (v2f i) : SV_Target + { + float4 color = float4(0,0,0,0); //tex2D (_MainTex, i.uv1.xy); + float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _CameraDepthTexture_ST)); + d = Linear01Depth (d); + color.a = _CurveParams.z * (_CurveParams.w-d) / (d + 1e-5f); + color.a = clamp(max(0.0, color.a - _CurveParams.y), 0.0, _CurveParams.x); + + return color; + } + + float4 fragCaptureForegroundCocMask (v2f i) : SV_Target + { + float4 color = float4(0,0,0,0); + float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _CameraDepthTexture_ST)); + d = Linear01Depth (d); + color.a = _CurveParams.z * (_CurveParams.w-d) / (d + 1e-5f); + color.a = clamp(max(0.0, color.a - _CurveParams.y), 0.0, _CurveParams.x); + + return color.a > 0; + } + + float4 fragBlendInHighRez (v2f i) : SV_Target + { + float4 tapHighRez = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + return float4(tapHighRez.rgb, 1.0-saturate(tapHighRez.a*5.0)); + } + + float4 fragBlendInLowRezParts (v2f i) : SV_Target + { + float4 from = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + from.a = saturate(from.a * _Offsets.w) / (_CurveParams.x + 1e-5f); + float square = from.a * from.a; + from.a = square * square * _CurveParams.x; + return from; + } + + float4 fragUpsampleWithAlphaMask(v2f i) : SV_Target + { + float4 c = tex2D(_MainTex, i.uv1.xy); + return c; + } + + float4 fragAlphaMask(v2f i) : SV_Target + { + float4 c = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _MainTex_ST)); + c.a = saturate(c.a*100.0); + return c; + } + + ENDCG + +Subshader +{ + + // pass 0 + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask A + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragCaptureCoc + + ENDCG + } + + // pass 1 + + Pass + { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vertBlurPlusMinus + #pragma fragment fragGaussBlur + + ENDCG + } + + // pass 2 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vertBlurPlusMinus + #pragma fragment fragBlurForFgCoc + + ENDCG + } + + + // pass 3 + + Pass + { + ZTest Always Cull Off ZWrite Off + ColorMask A + BlendOp Max, Max + Blend One One, One One + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment AddFgCoc + + ENDCG + } + + + // pass 4 + + Pass + { + ZTest Always Cull Off ZWrite Off + ColorMask A + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragCaptureForegroundCoc + + ENDCG + } + + // pass 5 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBlurBox + + ENDCG + } + + // pass 6 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment frag4TapBlurForLRSpawn + + ENDCG + } + + // pass 7 + + Pass { + ZTest Always Cull Off ZWrite Off + ColorMask RGB + Blend SrcAlpha OneMinusSrcAlpha + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBlendInHighRez + + ENDCG + } + + // pass 8 + + Pass + { + ZTest Always Cull Off ZWrite Off + ColorMask A + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragCaptureForegroundCocMask + + ENDCG + } + + + // pass 9 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBlurUpsampleCheap + + ENDCG + } + + // pass 10 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragCaptureColorAndSignedCoc + + ENDCG + } + + // pass 11 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBlurInsaneMQ + + ENDCG + } + + // pass 12 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBlurUpsampleCombineMQ + + ENDCG + } + + // pass 13 + Pass { + ZTest Always Cull Off ZWrite Off + + ColorMask A + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragMergeCoc + + ENDCG + } + + // pass 14 + + Pass { + ZTest Always Cull Off ZWrite Off + + ColorMask A + BlendOp Max, Max + Blend One One, One One + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragCombineCocWithMaskBlur + + ENDCG + } + + // pass 15 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBoxDownsample + + ENDCG + } + + // pass 16 + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragVisualize + + ENDCG + } + + // pass 17 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBlurInsaneHQ + + ENDCG + } + + // pass 18 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragBlurUpsampleCombineHQ + + ENDCG + } + + // pass 19 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vertBlurPlusMinus + #pragma fragment fragBlurAlphaWeighted + + ENDCG + } + + // pass 20 + + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragAlphaMask + + ENDCG + } + + // pass 21 + + Pass { + ZTest Always Cull Off ZWrite Off + + BlendOp Add, Add + Blend DstAlpha OneMinusDstAlpha, Zero One + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vertFlip + #pragma fragment fragBlurBox + + ENDCG + } + + // pass 22 + + Pass { + ZTest Always Cull Off ZWrite Off + + // destination alpha needs to stay intact as we have layed alpha before + BlendOp Add, Add + Blend DstAlpha One, Zero One + + CGPROGRAM + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment fragUpsampleWithAlphaMask + + ENDCG + } +} + +Fallback off + +} diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldScatter.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldScatter.shader.meta new file mode 100644 index 0000000..b38c974 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/DepthOfFieldScatter.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: acd613035ff3e455e8abf23fdc8c8c24 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableBlur.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableBlur.shader new file mode 100644 index 0000000..a96bcc2 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableBlur.shader @@ -0,0 +1,67 @@ +Shader "Hidden/SeparableBlur" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + + float4 uv01 : TEXCOORD1; + float4 uv23 : TEXCOORD2; + float4 uv45 : TEXCOORD3; + }; + + float4 offsets; + + sampler2D _MainTex; + half4 _MainTex_ST; + + v2f vert (appdata_img v) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + + o.uv.xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + + o.uv01 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1), _MainTex_ST); + o.uv23 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1) * 2.0, _MainTex_ST); + o.uv45 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1) * 3.0, _MainTex_ST); + + return o; + } + + half4 frag (v2f i) : SV_Target { + half4 color = float4 (0,0,0,0); + + color += 0.40 * tex2D (_MainTex, i.uv); + color += 0.15 * tex2D (_MainTex, i.uv01.xy); + color += 0.15 * tex2D (_MainTex, i.uv01.zw); + color += 0.10 * tex2D (_MainTex, i.uv23.xy); + color += 0.10 * tex2D (_MainTex, i.uv23.zw); + color += 0.05 * tex2D (_MainTex, i.uv45.xy); + color += 0.05 * tex2D (_MainTex, i.uv45.zw); + + return color; + } + + ENDCG + +Subshader { + Pass { + ZTest Always Cull Off ZWrite Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } +} + +Fallback off + + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableBlur.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableBlur.shader.meta new file mode 100644 index 0000000..b9f6a84 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableBlur.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: e97c14fbb5ea04c3a902cc533d7fc5d1 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableWeightedBlurDof34.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableWeightedBlurDof34.shader new file mode 100644 index 0000000..b0855be --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableWeightedBlurDof34.shader @@ -0,0 +1,242 @@ +Shader "Hidden/SeparableWeightedBlurDof34" { + Properties { + _MainTex ("Base (RGB)", 2D) = "" {} + _TapMedium ("TapMedium (RGB)", 2D) = "" {} + _TapLow ("TapLow (RGB)", 2D) = "" {} + _TapHigh ("TapHigh (RGB)", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + half4 offsets; + half4 _Threshhold; + sampler2D _MainTex; + sampler2D _TapHigh; + + half4 _MainTex_ST; + + struct v2f { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half4 uv01 : TEXCOORD1; + half4 uv23 : TEXCOORD2; + half4 uv45 : TEXCOORD3; + }; + + struct v2fSingle { + half4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + }; + + // + // VERT PROGRAMS + // + + v2f vert (appdata_img v) { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST); + o.uv01 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1), _MainTex_ST); + o.uv23 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1) * 2.0, _MainTex_ST); + o.uv45 = UnityStereoScreenSpaceUVAdjust(v.texcoord.xyxy + offsets.xyxy * half4(1,1, -1,-1) * 3.0, _MainTex_ST); + + return o; + } + + v2fSingle vertSingleTex (appdata_img v) { + v2fSingle o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = v.texcoord.xy; + return o; + } + + // + // FRAG PROGRAMS + // + + // mostly used for foreground, so more gaussian-like + + half4 fragBlurUnweighted (v2f i) : SV_Target { + half4 blurredColor = half4 (0,0,0,0); + + half4 sampleA = tex2D(_MainTex, i.uv.xy); + half4 sampleB = tex2D(_MainTex, i.uv01.xy); + half4 sampleC = tex2D(_MainTex, i.uv01.zw); + half4 sampleD = tex2D(_MainTex, i.uv23.xy); + half4 sampleE = tex2D(_MainTex, i.uv23.zw); + + blurredColor += sampleA; + blurredColor += sampleB; + blurredColor += sampleC; + blurredColor += sampleD; + blurredColor += sampleE; + + blurredColor *= 0.2; + + blurredColor.a = max(UNITY_SAMPLE_1CHANNEL(_TapHigh, i.uv.xy), blurredColor.a); + + return blurredColor; + } + + // used for background, so more bone curve-like + + half4 fragBlurWeighted (v2f i) : SV_Target { + half4 blurredColor = half4 (0,0,0,0); + + half4 sampleA = tex2D(_MainTex, i.uv.xy); + half4 sampleB = tex2D(_MainTex, i.uv01.xy); + half4 sampleC = tex2D(_MainTex, i.uv01.zw); + half4 sampleD = tex2D(_MainTex, i.uv23.xy); + half4 sampleE = tex2D(_MainTex, i.uv23.zw); + + half sum = sampleA.a + dot (half4 (1.25, 1.25, 1.5, 1.5), half4 (sampleB.a,sampleC.a,sampleD.a,sampleE.a)); + + sampleA.rgb = sampleA.rgb * sampleA.a; + sampleB.rgb = sampleB.rgb * sampleB.a * 1.25; + sampleC.rgb = sampleC.rgb * sampleC.a * 1.25; + sampleD.rgb = sampleD.rgb * sampleD.a * 1.5; + sampleE.rgb = sampleE.rgb * sampleE.a * 1.5; + + blurredColor += sampleA; + blurredColor += sampleB; + blurredColor += sampleC; + blurredColor += sampleD; + blurredColor += sampleE; + + blurredColor /= sum; + half4 color = blurredColor; + + color.a = sampleA.a; + + return color; + } + + half4 fragBlurDark (v2f i) : SV_Target { + half4 blurredColor = half4 (0,0,0,0); + + half4 sampleA = tex2D(_MainTex, i.uv.xy); + half4 sampleB = tex2D(_MainTex, i.uv01.xy); + half4 sampleC = tex2D(_MainTex, i.uv01.zw); + half4 sampleD = tex2D(_MainTex, i.uv23.xy); + half4 sampleE = tex2D(_MainTex, i.uv23.zw); + + half sum = sampleA.a + dot (half4 (0.75, 0.75, 0.5, 0.5), half4 (sampleB.a,sampleC.a,sampleD.a,sampleE.a)); + + sampleA.rgb = sampleA.rgb * sampleA.a; + sampleB.rgb = sampleB.rgb * sampleB.a * 0.75; + sampleC.rgb = sampleC.rgb * sampleC.a * 0.75; + sampleD.rgb = sampleD.rgb * sampleD.a * 0.5; + sampleE.rgb = sampleE.rgb * sampleE.a * 0.5; + + blurredColor += sampleA; + blurredColor += sampleB; + blurredColor += sampleC; + blurredColor += sampleD; + blurredColor += sampleE; + + blurredColor /= sum; + half4 color = blurredColor; + + color.a = sampleA.a; + + return color; + } + + // not used atm + + half4 fragBlurUnweightedDark (v2f i) : SV_Target { + half4 blurredColor = half4 (0,0,0,0); + + half4 sampleA = tex2D(_MainTex, i.uv.xy); + half4 sampleB = tex2D(_MainTex, i.uv01.xy); + half4 sampleC = tex2D(_MainTex, i.uv01.zw); + half4 sampleD = tex2D(_MainTex, i.uv23.xy); + half4 sampleE = tex2D(_MainTex, i.uv23.zw); + + blurredColor += sampleA; + blurredColor += sampleB * 0.75; + blurredColor += sampleC * 0.75; + blurredColor += sampleD * 0.5; + blurredColor += sampleE * 0.5; + + blurredColor /= 3.5; + + blurredColor.a = max(UNITY_SAMPLE_1CHANNEL(_TapHigh, i.uv.xy), blurredColor.a); + + return blurredColor; + } + + // fragMixMediumAndLowTap + // happens before applying final coc/blur result to screen, + // mixes defocus buffers of different resolutions / bluriness + + sampler2D _TapMedium; + sampler2D _TapLow; + + half4 _TapMedium_ST; + half4 _TapLow_ST; + + half4 fragMixMediumAndLowTap (v2fSingle i) : SV_Target + { + half4 tapMedium = tex2D (_TapMedium, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapMedium_ST)); + half4 tapLow = tex2D (_TapLow, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _TapLow_ST)); + tapMedium.a *= tapMedium.a; + + tapLow.rgb = lerp (tapMedium.rgb, tapLow.rgb, (tapMedium.a * tapMedium.a)); + return tapLow; + } + + ENDCG + +Subshader { + ZTest Always Cull Off ZWrite Off + + Pass { + + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragBlurWeighted + ENDCG + } + Pass { + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragBlurUnweighted + ENDCG + } + + // 2 + + Pass { + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragBlurUnweightedDark + ENDCG + } + Pass { + CGPROGRAM + + #pragma vertex vertSingleTex + #pragma fragment fragMixMediumAndLowTap + ENDCG + } + + // 4 + + Pass { + CGPROGRAM + + #pragma vertex vert + #pragma fragment fragBlurDark + ENDCG + } +} + +Fallback off + +} // shader diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableWeightedBlurDof34.shader.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableWeightedBlurDof34.shader.meta new file mode 100644 index 0000000..2fae7fc --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/SeparableWeightedBlurDof34.shader.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: bb4af680337344a4abad65a4e8873c50 +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/TiltShiftHdrLensBlur.shader b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/TiltShiftHdrLensBlur.shader new file mode 100644 index 0000000..14445cd --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/_DepthOfField/TiltShiftHdrLensBlur.shader @@ -0,0 +1,380 @@ + + Shader "Hidden/Dof/TiltShiftHdrLensBlur" { + Properties { + _MainTex ("-", 2D) = "" {} + _Blurred ("-", 2D) = "" {} + } + + CGINCLUDE + + #include "UnityCG.cginc" + + struct v2f + { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float2 uv1 : TEXCOORD1; + }; + + sampler2D _MainTex; + sampler2D _Blurred; + + float4 _MainTex_TexelSize; + half4 _MainTex_ST; + half4 _Blurred_ST; + float _BlurSize; + float _BlurArea; + + #if defined(SHADER_API_D3D11) || defined(SHADER_API_GLCORE) || defined(SHADER_API_METAL) + #define SAMPLE_TEX(sampler, uv) tex2Dlod(sampler, float4(uv,0,1)) + #else + #define SAMPLE_TEX(sampler, uv) tex2D(sampler, uv) + #endif + + v2f vert (appdata_img v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv.xy = v.texcoord; + o.uv1.xy = v.texcoord; + + #if UNITY_UV_STARTS_AT_TOP + if (_MainTex_TexelSize.y < 0) + o.uv1.y = 1-o.uv1.y; + #else + + #endif + + return o; + } + + static const int SmallDiscKernelSamples = 12; + static const float2 SmallDiscKernel[SmallDiscKernelSamples] = + { + float2(-0.326212,-0.40581), + float2(-0.840144,-0.07358), + float2(-0.695914,0.457137), + float2(-0.203345,0.620716), + float2(0.96234,-0.194983), + float2(0.473434,-0.480026), + float2(0.519456,0.767022), + float2(0.185461,-0.893124), + float2(0.507431,0.064425), + float2(0.89642,0.412458), + float2(-0.32194,-0.932615), + float2(-0.791559,-0.59771) + }; + + static const int NumDiscSamples = 28; + static const float3 DiscKernel[NumDiscSamples] = + { + float3(0.62463,0.54337,0.82790), + float3(-0.13414,-0.94488,0.95435), + float3(0.38772,-0.43475,0.58253), + float3(0.12126,-0.19282,0.22778), + float3(-0.20388,0.11133,0.23230), + float3(0.83114,-0.29218,0.88100), + float3(0.10759,-0.57839,0.58831), + float3(0.28285,0.79036,0.83945), + float3(-0.36622,0.39516,0.53876), + float3(0.75591,0.21916,0.78704), + float3(-0.52610,0.02386,0.52664), + float3(-0.88216,-0.24471,0.91547), + float3(-0.48888,-0.29330,0.57011), + float3(0.44014,-0.08558,0.44838), + float3(0.21179,0.51373,0.55567), + float3(0.05483,0.95701,0.95858), + float3(-0.59001,-0.70509,0.91938), + float3(-0.80065,0.24631,0.83768), + float3(-0.19424,-0.18402,0.26757), + float3(-0.43667,0.76751,0.88304), + float3(0.21666,0.11602,0.24577), + float3(0.15696,-0.85600,0.87027), + float3(-0.75821,0.58363,0.95682), + float3(0.99284,-0.02904,0.99327), + float3(-0.22234,-0.57907,0.62029), + float3(0.55052,-0.66984,0.86704), + float3(0.46431,0.28115,0.54280), + float3(-0.07214,0.60554,0.60982), + }; + + float WeightFieldMode (float2 uv) + { + float2 tapCoord = uv*2.0-1.0; + return (abs(tapCoord.y * _BlurArea)); + } + + float WeightIrisMode (float2 uv) + { + float2 tapCoord = (uv*2.0-1.0); + return dot(tapCoord, tapCoord) * _BlurArea; + } + + float4 fragIrisPreview (v2f i) : SV_Target + { + return WeightIrisMode(i.uv.xy) * 0.5; + } + + float4 fragFieldPreview (v2f i) : SV_Target + { + return WeightFieldMode(i.uv.xy) * 0.5; + } + + float4 fragUpsample (v2f i) : SV_Target + { + float4 blurred = tex2D(_Blurred, UnityStereoScreenSpaceUVAdjust(i.uv1.xy, _Blurred_ST)); + float4 frame = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + + return lerp(frame, blurred, saturate(blurred.a)); + } + + float4 fragIrisLow(v2f i) : SV_Target + { + float4 centerTap = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv.xy, _MainTex_ST)); + float4 sum = centerTap; + + float w = clamp(WeightIrisMode(i.uv.xy), 0, _BlurSize); + + float4 poissonScale = _MainTex_TexelSize.xyxy * w; + +#ifndef SHADER_API_D3D9 + if (w<1e-2f) + return sum; +#endif + + for (int l = 0; l _Params.y) { + // This sample occludes, contribute to occlusion + occ += pow(1-zd,_Params.z); // sc2 + //occ += 1.0-saturate(pow(1.0 - zd, 11.0) + zd); // nullsq + //occ += 1.0/(1.0+zd*zd*10); // iq + } + } + occ /= sampleCount; + return 1-occ; +} + diff --git a/Assets/Standard Assets/Effects/ImageEffects/Shaders/frag_ao.cginc.meta b/Assets/Standard Assets/Effects/ImageEffects/Shaders/frag_ao.cginc.meta new file mode 100644 index 0000000..604d5f5 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Shaders/frag_ao.cginc.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 51ae11a5cd82fda468a85179946d672a +ShaderImporter: + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures.meta new file mode 100644 index 0000000..f926ce3 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: f9372f23586ef470b97d53856af88487 +folderAsset: yes +DefaultImporter: + userData: + assetBundleName: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/ContrastEnhanced3D16.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/ContrastEnhanced3D16.png new file mode 100644 index 0000000..c112c75 Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/ContrastEnhanced3D16.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/ContrastEnhanced3D16.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/ContrastEnhanced3D16.png.meta new file mode 100644 index 0000000..37553ce --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/ContrastEnhanced3D16.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: ecd9a2c463dcb476891e43d7c9f16ffa +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + textureType: 5 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/HexShape.psd b/Assets/Standard Assets/Effects/ImageEffects/Textures/HexShape.psd new file mode 100644 index 0000000..eef48cb Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/HexShape.psd differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/HexShape.psd.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/HexShape.psd.meta new file mode 100644 index 0000000..fec782b --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/HexShape.psd.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: a4cdca73d61814d33ac1587f6c163bca +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 64 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/MotionBlurJitter.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/MotionBlurJitter.png new file mode 100644 index 0000000..a601a2e Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/MotionBlurJitter.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/MotionBlurJitter.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/MotionBlurJitter.png.meta new file mode 100644 index 0000000..2e825d5 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/MotionBlurJitter.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: 31f5a8611c4ed1245b18456206e798dc +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/Neutral3D16.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/Neutral3D16.png new file mode 100644 index 0000000..fc0f026 Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/Neutral3D16.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/Neutral3D16.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/Neutral3D16.png.meta new file mode 100644 index 0000000..43038ad --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/Neutral3D16.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: a4b474cd484494a4aaa4bbf928219d09 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + textureType: 5 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/Noise.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/Noise.png new file mode 100644 index 0000000..a601a2e Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/Noise.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/Noise.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/Noise.png.meta new file mode 100644 index 0000000..b48fd5f --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/Noise.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: e80c3c84ea861404d8a427db8b7abf04 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 64 + textureSettings: + filterMode: 2 + aniso: 1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseAndGrain.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseAndGrain.png new file mode 100644 index 0000000..9faabd4 Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseAndGrain.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseAndGrain.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseAndGrain.png.meta new file mode 100644 index 0000000..387edde --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseAndGrain.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: 7a632f967e8ad42f5bd275898151ab6a +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 1 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 64 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + textureType: 5 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectGrain.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectGrain.png new file mode 100644 index 0000000..ba027b4 Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectGrain.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectGrain.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectGrain.png.meta new file mode 100644 index 0000000..47510da --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectGrain.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: ffa9c02760c2b4e8eb9814ec06c4b05b +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectScratch.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectScratch.png new file mode 100644 index 0000000..6ac0d53 Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectScratch.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectScratch.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectScratch.png.meta new file mode 100644 index 0000000..3d3e680 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/NoiseEffectScratch.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: 6205c27cc031f4e66b8ea90d1bfaa158 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + textureType: 0 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/RandomVectors.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/RandomVectors.png new file mode 100644 index 0000000..a601a2e Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/RandomVectors.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/RandomVectors.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/RandomVectors.png.meta new file mode 100644 index 0000000..3c35afc --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/RandomVectors.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: a181ca8e3c62f3e4b8f183f6c586b032 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 1024 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/SphereShape.psd b/Assets/Standard Assets/Effects/ImageEffects/Textures/SphereShape.psd new file mode 100644 index 0000000..a100649 Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/SphereShape.psd differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/SphereShape.psd.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/SphereShape.psd.meta new file mode 100644 index 0000000..159ca4d --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/SphereShape.psd.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: fc00ec05a89da4ff695a4273715cd5ce +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 64 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/VignetteMask.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/VignetteMask.png new file mode 100644 index 0000000..3048937 Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/VignetteMask.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/VignetteMask.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/VignetteMask.png.meta new file mode 100644 index 0000000..1764d4c --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/VignetteMask.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: 95ef4804fe0be4c999ddaa383536cde8 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/color correction ramp.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/color correction ramp.png new file mode 100644 index 0000000..328251e Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/color correction ramp.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/color correction ramp.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/color correction ramp.png.meta new file mode 100644 index 0000000..be398a0 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/color correction ramp.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: d440902fad11e807d00044888d76c639 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/grayscale ramp.png b/Assets/Standard Assets/Effects/ImageEffects/Textures/grayscale ramp.png new file mode 100644 index 0000000..328251e Binary files /dev/null and b/Assets/Standard Assets/Effects/ImageEffects/Textures/grayscale ramp.png differ diff --git a/Assets/Standard Assets/Effects/ImageEffects/Textures/grayscale ramp.png.meta b/Assets/Standard Assets/Effects/ImageEffects/Textures/grayscale ramp.png.meta new file mode 100644 index 0000000..395fa26 --- /dev/null +++ b/Assets/Standard Assets/Effects/ImageEffects/Textures/grayscale ramp.png.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: e9a9781cad112c75d0008dfa8d76c639 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 2 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: 3 + maxTextureSize: 1024 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: -1 + buildTargetSettings: [] + userData: diff --git a/fie.csproj b/fie.csproj index aad9f67..1d25091 100644 --- a/fie.csproj +++ b/fie.csproj @@ -5,7 +5,7 @@ Debug AnyCPU Library - 7.3 + latest FriendshipIsEpic v2.0 4 @@ -792,19 +792,1077 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -828,6 +1886,9 @@ packages\MoodkieSecurity.dll + + packages\Newtonsoft.Json.13.0.3\lib\net20\Newtonsoft.Json.dll + False Assets\Plugins\Photon3Unity3D.dll @@ -860,6 +1921,9 @@ packages\ES2.dll + + packages\UnityEditor.dll + packages\BehaviorDesignerRuntime.dll @@ -871,4 +1935,4 @@ - \ No newline at end of file + diff --git a/packages.config b/packages.config new file mode 100644 index 0000000..e28064e --- /dev/null +++ b/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/Newtonsoft.Json.13.0.3/.signature.p7s b/packages/Newtonsoft.Json.13.0.3/.signature.p7s new file mode 100644 index 0000000..d55e472 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/.signature.p7s differ diff --git a/packages/Newtonsoft.Json.13.0.3/LICENSE.md b/packages/Newtonsoft.Json.13.0.3/LICENSE.md new file mode 100644 index 0000000..dfaadbe --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/Newtonsoft.Json.13.0.3/README.md b/packages/Newtonsoft.Json.13.0.3/README.md new file mode 100644 index 0000000..9982a45 --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/README.md @@ -0,0 +1,71 @@ +# ![Logo](https://raw.githubusercontent.com/JamesNK/Newtonsoft.Json/master/Doc/icons/logo.jpg) Json.NET + +[![NuGet version (Newtonsoft.Json)](https://img.shields.io/nuget/v/Newtonsoft.Json.svg?style=flat-square)](https://www.nuget.org/packages/Newtonsoft.Json/) +[![Build status](https://dev.azure.com/jamesnk/Public/_apis/build/status/JamesNK.Newtonsoft.Json?branchName=master)](https://dev.azure.com/jamesnk/Public/_build/latest?definitionId=8) + +Json.NET is a popular high-performance JSON framework for .NET + +## Serialize JSON + +```csharp +Product product = new Product(); +product.Name = "Apple"; +product.Expiry = new DateTime(2008, 12, 28); +product.Sizes = new string[] { "Small" }; + +string json = JsonConvert.SerializeObject(product); +// { +// "Name": "Apple", +// "Expiry": "2008-12-28T00:00:00", +// "Sizes": [ +// "Small" +// ] +// } +``` + +## Deserialize JSON + +```csharp +string json = @"{ + 'Name': 'Bad Boys', + 'ReleaseDate': '1995-4-7T00:00:00', + 'Genres': [ + 'Action', + 'Comedy' + ] +}"; + +Movie m = JsonConvert.DeserializeObject(json); + +string name = m.Name; +// Bad Boys +``` + +## LINQ to JSON + +```csharp +JArray array = new JArray(); +array.Add("Manual text"); +array.Add(new DateTime(2000, 5, 23)); + +JObject o = new JObject(); +o["MyArray"] = array; + +string json = o.ToString(); +// { +// "MyArray": [ +// "Manual text", +// "2000-05-23T00:00:00" +// ] +// } +``` + +## Links + +- [Homepage](https://www.newtonsoft.com/json) +- [Documentation](https://www.newtonsoft.com/json/help) +- [NuGet Package](https://www.nuget.org/packages/Newtonsoft.Json) +- [Release Notes](https://github.com/JamesNK/Newtonsoft.Json/releases) +- [Contributing Guidelines](https://github.com/JamesNK/Newtonsoft.Json/blob/master/CONTRIBUTING.md) +- [License](https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) +- [Stack Overflow](https://stackoverflow.com/questions/tagged/json.net) diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.dll new file mode 100644 index 0000000..9c0a335 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.xml new file mode 100644 index 0000000..bdc4622 --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.xml @@ -0,0 +1,10393 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Provides a set of static (Shared in Visual Basic) methods for + querying objects that implement . + + + + + Returns the input typed as . + + + + + Returns an empty that has the + specified type argument. + + + + + Converts the elements of an to the + specified type. + + + + + Filters the elements of an based on a specified type. + + + + + Generates a sequence of integral numbers within a specified range. + + The value of the first integer in the sequence. + The number of sequential integers to generate. + + + + Generates a sequence that contains one repeated value. + + + + + Filters a sequence of values based on a predicate. + + + + + Filters a sequence of values based on a predicate. + Each element's index is used in the logic of the predicate function. + + + + + Projects each element of a sequence into a new form. + + + + + Projects each element of a sequence into a new form by + incorporating the element's index. + + + + + Projects each element of a sequence to an + and flattens the resulting sequences into one sequence. + + + + + Projects each element of a sequence to an , + and flattens the resulting sequences into one sequence. The + index of each source element is used in the projected form of + that element. + + + + + Projects each element of a sequence to an , + flattens the resulting sequences into one sequence, and invokes + a result selector function on each element therein. + + + + + Projects each element of a sequence to an , + flattens the resulting sequences into one sequence, and invokes + a result selector function on each element therein. The index of + each source element is used in the intermediate projected form + of that element. + + + + + Returns elements from a sequence as long as a specified condition is true. + + + + + Returns elements from a sequence as long as a specified condition is true. + The element's index is used in the logic of the predicate function. + + + + + Base implementation of First operator. + + + + + Returns the first element of a sequence. + + + + + Returns the first element in a sequence that satisfies a specified condition. + + + + + Returns the first element of a sequence, or a default value if + the sequence contains no elements. + + + + + Returns the first element of the sequence that satisfies a + condition or a default value if no such element is found. + + + + + Base implementation of Last operator. + + + + + Returns the last element of a sequence. + + + + + Returns the last element of a sequence that satisfies a + specified condition. + + + + + Returns the last element of a sequence, or a default value if + the sequence contains no elements. + + + + + Returns the last element of a sequence that satisfies a + condition or a default value if no such element is found. + + + + + Base implementation of Single operator. + + + + + Returns the only element of a sequence, and throws an exception + if there is not exactly one element in the sequence. + + + + + Returns the only element of a sequence that satisfies a + specified condition, and throws an exception if more than one + such element exists. + + + + + Returns the only element of a sequence, or a default value if + the sequence is empty; this method throws an exception if there + is more than one element in the sequence. + + + + + Returns the only element of a sequence that satisfies a + specified condition or a default value if no such element + exists; this method throws an exception if more than one element + satisfies the condition. + + + + + Returns the element at a specified index in a sequence. + + + + + Returns the element at a specified index in a sequence or a + default value if the index is out of range. + + + + + Inverts the order of the elements in a sequence. + + + + + Returns a specified number of contiguous elements from the start + of a sequence. + + + + + Bypasses a specified number of elements in a sequence and then + returns the remaining elements. + + + + + Bypasses elements in a sequence as long as a specified condition + is true and then returns the remaining elements. + + + + + Bypasses elements in a sequence as long as a specified condition + is true and then returns the remaining elements. The element's + index is used in the logic of the predicate function. + + + + + Returns the number of elements in a sequence. + + + + + Returns a number that represents how many elements in the + specified sequence satisfy a condition. + + + + + Returns a that represents the total number + of elements in a sequence. + + + + + Returns a that represents how many elements + in a sequence satisfy a condition. + + + + + Concatenates two sequences. + + + + + Creates a from an . + + + + + Creates an array from an . + + + + + Returns distinct elements from a sequence by using the default + equality comparer to compare values. + + + + + Returns distinct elements from a sequence by using a specified + to compare values. + + + + + Creates a from an + according to a specified key + selector function. + + + + + Creates a from an + according to a specified key + selector function and a key comparer. + + + + + Creates a from an + according to specified key + and element selector functions. + + + + + Creates a from an + according to a specified key + selector function, a comparer and an element selector function. + + + + + Groups the elements of a sequence according to a specified key + selector function. + + + + + Groups the elements of a sequence according to a specified key + selector function and compares the keys by using a specified + comparer. + + + + + Groups the elements of a sequence according to a specified key + selector function and projects the elements for each group by + using a specified function. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. + + + + + Groups the elements of a sequence according to a key selector + function. The keys are compared by using a comparer and each + group's elements are projected by using a specified function. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. The elements of each group are projected by using a + specified function. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. The keys are compared by using a specified comparer. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. Key values are compared by using a specified comparer, + and the elements of each group are projected by using a + specified function. + + + + + Applies an accumulator function over a sequence. + + + + + Applies an accumulator function over a sequence. The specified + seed value is used as the initial accumulator value. + + + + + Applies an accumulator function over a sequence. The specified + seed value is used as the initial accumulator value, and the + specified function is used to select the result value. + + + + + Produces the set union of two sequences by using the default + equality comparer. + + + + + Produces the set union of two sequences by using a specified + . + + + + + Returns the elements of the specified sequence or the type + parameter's default value in a singleton collection if the + sequence is empty. + + + + + Returns the elements of the specified sequence or the specified + value in a singleton collection if the sequence is empty. + + + + + Determines whether all elements of a sequence satisfy a condition. + + + + + Determines whether a sequence contains any elements. + + + + + Determines whether any element of a sequence satisfies a + condition. + + + + + Determines whether a sequence contains a specified element by + using the default equality comparer. + + + + + Determines whether a sequence contains a specified element by + using a specified . + + + + + Determines whether two sequences are equal by comparing the + elements by using the default equality comparer for their type. + + + + + Determines whether two sequences are equal by comparing their + elements by using a specified . + + + + + Base implementation for Min/Max operator. + + + + + Base implementation for Min/Max operator for nullable types. + + + + + Returns the minimum value in a generic sequence. + + + + + Invokes a transform function on each element of a generic + sequence and returns the minimum resulting value. + + + + + Returns the maximum value in a generic sequence. + + + + + Invokes a transform function on each element of a generic + sequence and returns the maximum resulting value. + + + + + Makes an enumerator seen as enumerable once more. + + + The supplied enumerator must have been started. The first element + returned is the element the enumerator was on when passed in. + DO NOT use this method if the caller must be a generator. It is + mostly safe among aggregate operations. + + + + + Sorts the elements of a sequence in ascending order according to a key. + + + + + Sorts the elements of a sequence in ascending order by using a + specified comparer. + + + + + Sorts the elements of a sequence in descending order according to a key. + + + + + Sorts the elements of a sequence in descending order by using a + specified comparer. + + + + + Performs a subsequent ordering of the elements in a sequence in + ascending order according to a key. + + + + + Performs a subsequent ordering of the elements in a sequence in + ascending order by using a specified comparer. + + + + + Performs a subsequent ordering of the elements in a sequence in + descending order, according to a key. + + + + + Performs a subsequent ordering of the elements in a sequence in + descending order by using a specified comparer. + + + + + Base implementation for Intersect and Except operators. + + + + + Produces the set intersection of two sequences by using the + default equality comparer to compare values. + + + + + Produces the set intersection of two sequences by using the + specified to compare values. + + + + + Produces the set difference of two sequences by using the + default equality comparer to compare values. + + + + + Produces the set difference of two sequences by using the + specified to compare values. + + + + + Creates a from an + according to a specified key + selector function. + + + + + Creates a from an + according to a specified key + selector function and key comparer. + + + + + Creates a from an + according to specified key + selector and element selector functions. + + + + + Creates a from an + according to a specified key + selector function, a comparer, and an element selector function. + + + + + Correlates the elements of two sequences based on matching keys. + The default equality comparer is used to compare keys. + + + + + Correlates the elements of two sequences based on matching keys. + The default equality comparer is used to compare keys. A + specified is used to compare keys. + + + + + Correlates the elements of two sequences based on equality of + keys and groups the results. The default equality comparer is + used to compare keys. + + + + + Correlates the elements of two sequences based on equality of + keys and groups the results. The default equality comparer is + used to compare keys. A specified + is used to compare keys. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Represents a collection of objects that have a common key. + + + + + Gets the key of the . + + + + + Defines an indexer, size property, and Boolean search method for + data structures that map keys to + sequences of values. + + + + + Represents a sorted sequence. + + + + + Performs a subsequent ordering on the elements of an + according to a key. + + + + + Represents a collection of keys each mapped to one or more values. + + + + + Gets the number of key/value collection pairs in the . + + + + + Gets the collection of values indexed by the specified key. + + + + + Determines whether a specified key is in the . + + + + + Applies a transform function to each key and its associated + values and returns the results. + + + + + Returns a generic enumerator that iterates through the . + + + + + See issue #11 + for why this method is needed and cannot be expressed as a + lambda at the call site. + + + + + See issue #11 + for why this method is needed and cannot be expressed as a + lambda at the call site. + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + + This attribute allows us to define extension methods without + requiring .NET Framework 3.5. For more information, see the section, + Extension Methods in .NET Framework 2.0 Apps, + of Basic Instincts: Extension Methods + column in MSDN Magazine, + issue Nov 2007. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.dll new file mode 100644 index 0000000..cd6d483 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.xml new file mode 100644 index 0000000..1934448 --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.xml @@ -0,0 +1,9541 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.dll new file mode 100644 index 0000000..be3857e Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.xml new file mode 100644 index 0000000..a806363 --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.xml @@ -0,0 +1,9741 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.dll new file mode 100644 index 0000000..341d08f Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.xml new file mode 100644 index 0000000..2c981ab --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.xml @@ -0,0 +1,11363 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.dll new file mode 100644 index 0000000..d035c38 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.xml new file mode 100644 index 0000000..6e3a52b --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.xml @@ -0,0 +1,11325 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + diff --git a/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.dll new file mode 100644 index 0000000..a0b1ff0 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.xml new file mode 100644 index 0000000..4409234 --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.xml @@ -0,0 +1,11051 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Allows users to control class loading and mandate what class to load. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Specifies what messages to output for the class. + + + + + Output no tracing and debugging messages. + + + + + Output error-handling messages. + + + + + Output warnings and error-handling messages. + + + + + Output informational messages, warnings, and error-handling messages. + + + + + Output all debugging and tracing messages. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + List of primitive types which can be widened. + + + + + Widening masks for primitive types above. + Index of the value in this array defines a type we're widening, + while the bits in mask define types it can be widened to (including itself). + + For example, value at index 0 defines a bool type, and it only has bit 0 set, + i.e. bool values can be assigned only to bool. + + + + + Checks if value of primitive type can be + assigned to parameter of primitive type . + + Source primitive type. + Target primitive type. + true if source type can be widened to target type, false otherwise. + + + + Checks if a set of values with given can be used + to invoke a method with specified . + + Method parameters. + Argument types. + Try to pack extra arguments into the last parameter when it is marked up with . + true if method can be called with given arguments, false otherwise. + + + + Compares two sets of parameters to determine + which one suits better for given argument types. + + + + + Returns a best method overload for given argument . + + List of method candidates. + Argument types. + Best method overload, or null if none matched. + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the method is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The is used to load the assembly. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.dll new file mode 100644 index 0000000..b683225 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.xml new file mode 100644 index 0000000..4de49a7 --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.xml @@ -0,0 +1,11173 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Allows users to control class loading and mandate what class to load. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Specifies what messages to output for the class. + + + + + Output no tracing and debugging messages. + + + + + Output error-handling messages. + + + + + Output warnings and error-handling messages. + + + + + Output informational messages, warnings, and error-handling messages. + + + + + Output all debugging and tracing messages. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + List of primitive types which can be widened. + + + + + Widening masks for primitive types above. + Index of the value in this array defines a type we're widening, + while the bits in mask define types it can be widened to (including itself). + + For example, value at index 0 defines a bool type, and it only has bit 0 set, + i.e. bool values can be assigned only to bool. + + + + + Checks if value of primitive type can be + assigned to parameter of primitive type . + + Source primitive type. + Target primitive type. + true if source type can be widened to target type, false otherwise. + + + + Checks if a set of values with given can be used + to invoke a method with specified . + + Method parameters. + Argument types. + Try to pack extra arguments into the last parameter when it is marked up with . + true if method can be called with given arguments, false otherwise. + + + + Compares two sets of parameters to determine + which one suits better for given argument types. + + + + + Returns a best method overload for given argument . + + List of method candidates. + Argument types. + Best method overload, or null if none matched. + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the method is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The is used to load the assembly. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll b/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll new file mode 100644 index 0000000..3af21d5 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll differ diff --git a/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.xml b/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.xml new file mode 100644 index 0000000..3357dd6 --- /dev/null +++ b/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.xml @@ -0,0 +1,11338 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/packages/Newtonsoft.Json.13.0.3/packageIcon.png b/packages/Newtonsoft.Json.13.0.3/packageIcon.png new file mode 100644 index 0000000..10c06a5 Binary files /dev/null and b/packages/Newtonsoft.Json.13.0.3/packageIcon.png differ diff --git a/packages/UnityEditor.dll b/packages/UnityEditor.dll new file mode 100644 index 0000000..8045940 Binary files /dev/null and b/packages/UnityEditor.dll differ diff --git a/packages/UnityEngine.dll b/packages/UnityEngine.dll index 8de997d..80cf67e 100644 Binary files a/packages/UnityEngine.dll and b/packages/UnityEngine.dll differ